- *np++ = c, c = getC(DOEXCL);
- if (c == 'g')
- gmodflag++, *np++ = c, c = getC(DOEXCL);
- *np++ = c;
- if (!any("htrqxe", c)) {
- if (gmodflag && c == '\n')
- stderror(ERR_VARSYN); /* strike */
- seterror(ERR_VARMOD, c);
- *np = 0;
- addla(name);
- return;
+ do {
+ *np++ = c, c = getC(DOEXCL);
+ if (c == 'g' || c == 'a') {
+ if (c == 'g')
+ gmodflag++;
+ else
+ amodflag++;
+ *np++ = c; c = getC(DOEXCL);
+ }
+ if ((c == 'g' && !gmodflag) || (c == 'a' && !amodflag)) {
+ if (c == 'g')
+ gmodflag++;
+ else
+ amodflag++;
+ *np++ = c; c = getC(DOEXCL);
+ }
+ *np++ = c;
+ /* scan s// [eichin:19910926.0512EST] */
+ if (c == 's') {
+ int delimcnt = 2;
+ int delim = getC(0);
+ *np++ = delim;
+
+ if (!delim || letter(delim)
+ || Isdigit(delim) || any(" \t\n", delim)) {
+ seterror(ERR_BADSUBST);
+ break;
+ }
+ while ((c = getC(0)) != (-1)) {
+ *np++ = c;
+ if(c == delim) delimcnt--;
+ if(!delimcnt) break;
+ }
+ if(delimcnt) {
+ seterror(ERR_BADSUBST);
+ break;
+ }
+ c = 's';
+ }
+ if (!any("htrqxes", c)) {
+ if ((amodflag || gmodflag) && c == '\n')
+ stderror(ERR_VARSYN); /* strike */
+ seterror(ERR_VARMOD, c);
+ *np = 0;
+ addla(name);
+ return;
+ }