From df361440c34a2641b09ac348d8cd6edc6b338443 Mon Sep 17 00:00:00 2001 From: Christos Zoulas Date: Mon, 22 Jul 1991 18:47:40 -0800 Subject: [PATCH] support for multiple : modifiers SCCS-vsn: bin/csh/lex.c 5.18 --- usr/src/bin/csh/lex.c | 219 ++++++++++++++++++++++-------------------- 1 file changed, 114 insertions(+), 105 deletions(-) diff --git a/usr/src/bin/csh/lex.c b/usr/src/bin/csh/lex.c index 0919ccb525..9b635f9022 100644 --- a/usr/src/bin/csh/lex.c +++ b/usr/src/bin/csh/lex.c @@ -6,7 +6,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lex.c 5.17 (Berkeley) %G%"; +static char sccsid[] = "@(#)lex.c 5.18 (Berkeley) %G%"; #endif /* not lint */ #include @@ -522,18 +522,22 @@ getdol() 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); @@ -665,120 +669,125 @@ getsub(en) 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 - case '~': - if (lhsb[0] == 0) - goto badlhs; - break; + case '~': + if (lhsb[0] == 0) + goto badlhs; + break; #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); } - if (c == '\\') { + cp = lhsb; + for (;;) { 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); } - if (c == '\\') { + cp = rhsb; + (void) Strcpy(orhsb, cp); + for (;;) { 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); } -- 2.20.1