support for multiple : modifiers
authorChristos Zoulas <christos@ucbvax.Berkeley.EDU>
Tue, 23 Jul 1991 02:47:40 +0000 (18:47 -0800)
committerChristos Zoulas <christos@ucbvax.Berkeley.EDU>
Tue, 23 Jul 1991 02:47:40 +0000 (18:47 -0800)
SCCS-vsn: bin/csh/lex.c 5.18

usr/src/bin/csh/lex.c

index 0919ccb..9b635f9 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)lex.c      5.17 (Berkeley) %G%";
+static char sccsid[] = "@(#)lex.c      5.18 (Berkeley) %G%";
 #endif /* not lint */
 
 #include <sys/types.h>
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -522,18 +522,22 @@ getdol()
 
        int     gmodflag = 0;
 
 
        int     gmodflag = 0;
 
-       *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')
+               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;
+           }
        }
        }
+       while ((c = getC(DOEXCL)) == ':');
+       ungetD(c);
     }
     else
        ungetD(c);
     }
     else
        ungetD(c);
@@ -665,120 +669,125 @@ getsub(en)
     bool global = 0;
     Char    orhsb[sizeof(rhsb) / sizeof(Char)];
 
     bool global = 0;
     Char    orhsb[sizeof(rhsb) / sizeof(Char)];
 
-    exclnxt = 0;
-    sc = c = getC(0);
-    if (c == 'g')
-       global ++, sc = c = getC(0);
+    do {
+       exclnxt = 0;
+       sc = c = getC(0);
+       if (c == 'g')
+           global++, sc = c = getC(0);
 
 
-    switch (c) {
-    case 'p':
-       justpr++;
-       return (en);
+       switch (c) {
+       case 'p':
+           justpr++;
+           return (en);
 
 
-    case 'x':
-    case 'q':
-       global ++;
+       case 'x':
+       case 'q':
+           global++;
 
 
-       /* fall into ... */
+           /* fall into ... */
 
 
-    case 'h':
-    case 'r':
-    case 't':
-    case 'e':
-       break;
+       case 'h':
+       case 'r':
+       case 't':
+       case 'e':
+           break;
 
 
-    case '&':
-       if (slhs[0] == 0) {
-           seterror(ERR_NOSUBST);
-           return (en);
-       }
-       (void) Strcpy(lhsb, slhs);
-       break;
+       case '&':
+           if (slhs[0] == 0) {
+               seterror(ERR_NOSUBST);
+               return (en);
+           }
+           (void) Strcpy(lhsb, slhs);
+           break;
 
 #ifdef notdef
 
 #ifdef notdef
-    case '~':
-       if (lhsb[0] == 0)
-           goto badlhs;
-       break;
+       case '~':
+           if (lhsb[0] == 0)
+               goto badlhs;
+           break;
 #endif
 
 #endif
 
-    case 's':
-       delim = getC(0);
-       if (letter(delim) || Isdigit(delim) || any(" \t\n", delim)) {
-           unreadc(delim);
-           lhsb[0] = 0;
-           seterror(ERR_BADSUBST);
-           return (en);
-       }
-       cp = lhsb;
-       for (;;) {
-           c = getC(0);
-           if (c == '\n') {
-               unreadc(c);
-               break;
-           }
-           if (c == delim)
-               break;
-           if (cp > &lhsb[sizeof(lhsb) / sizeof(Char) - 2]) {
+       case 's':
+           delim = getC(0);
+           if (letter(delim) || Isdigit(delim) || any(" \t\n", delim)) {
+               unreadc(delim);
                lhsb[0] = 0;
                seterror(ERR_BADSUBST);
                return (en);
            }
                lhsb[0] = 0;
                seterror(ERR_BADSUBST);
                return (en);
            }
-           if (c == '\\') {
+           cp = lhsb;
+           for (;;) {
                c = getC(0);
                c = getC(0);
-               if (c != delim && c != '\\')
-                   *cp++ = '\\';
-           }
-           *cp++ = c;
-       }
-       if (cp != lhsb)
-           *cp++ = 0;
-       else if (lhsb[0] == 0) {
-           seterror(ERR_LHS);
-           return (en);
-       }
-       cp = rhsb;
-       (void) Strcpy(orhsb, cp);
-       for (;;) {
-           c = getC(0);
-           if (c == '\n') {
-               unreadc(c);
-               break;
-           }
-           if (c == delim)
-               break;
-#ifdef notdef
-           if (c == '~') {
-               if (&cp[Strlen(orhsb)] > &rhsb[sizeof(rhsb) / sizeof(Char) - 2])
-                   goto toorhs;
-               (void) Strcpy(cp, orhsb);
-               cp = Strend(cp);
-               continue;
+               if (c == '\n') {
+                   unreadc(c);
+                   break;
+               }
+               if (c == delim)
+                   break;
+               if (cp > &lhsb[sizeof(lhsb) / sizeof(Char) - 2]) {
+                   lhsb[0] = 0;
+                   seterror(ERR_BADSUBST);
+                   return (en);
+               }
+               if (c == '\\') {
+                   c = getC(0);
+                   if (c != delim && c != '\\')
+                       *cp++ = '\\';
+               }
+               *cp++ = c;
            }
            }
-#endif
-           if (cp > &rhsb[sizeof(rhsb) / sizeof(Char) - 2]) {
-               seterror(ERR_RHSLONG);
+           if (cp != lhsb)
+               *cp++ = 0;
+           else if (lhsb[0] == 0) {
+               seterror(ERR_LHS);
                return (en);
            }
                return (en);
            }
-           if (c == '\\') {
+           cp = rhsb;
+           (void) Strcpy(orhsb, cp);
+           for (;;) {
                c = getC(0);
                c = getC(0);
-               if (c != delim /* && c != '~' */ )
-                   *cp++ = '\\';
+               if (c == '\n') {
+                   unreadc(c);
+                   break;
+               }
+               if (c == delim)
+                   break;
+#ifdef notdef
+               if (c == '~') {
+                   if (&cp[Strlen(orhsb)] > &rhsb[sizeof(rhsb) / 
+                                                  sizeof(Char) - 2])
+                       goto toorhs;
+                   (void) Strcpy(cp, orhsb);
+                   cp = Strend(cp);
+                   continue;
+               }
+#endif
+               if (cp > &rhsb[sizeof(rhsb) / sizeof(Char) - 2]) {
+                   seterror(ERR_RHSLONG);
+                   return (en);
+               }
+               if (c == '\\') {
+                   c = getC(0);
+                   if (c != delim /* && c != '~' */ )
+                       *cp++ = '\\';
+               }
+               *cp++ = c;
            }
            }
-           *cp++ = c;
-       }
-       *cp++ = 0;
-       break;
+           *cp++ = 0;
+           break;
 
 
-    default:
-       if (c == '\n')
-           unreadc(c);
-       seterror(ERR_BADBANGMOD, c);
-       return (en);
+       default:
+           if (c == '\n')
+               unreadc(c);
+           seterror(ERR_BADBANGMOD, c);
+           return (en);
+       }
+       (void) Strcpy(slhs, lhsb);
+       if (exclc)
+           en = dosub(sc, en, global);
     }
     }
-    (void) Strcpy(slhs, lhsb);
-    if (exclc)
-       en = dosub(sc, en, global);
+    while ((c = getC(0)) == ':');
+    unreadc(c);
     return (en);
 }
 
     return (en);
 }