SCCS-vsn: bin/csh/lex.c 5.18
-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>
- *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);
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++;
- 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;
- case '~':
- if (lhsb[0] == 0)
- goto badlhs;
- break;
+ case '~':
+ if (lhsb[0] == 0)
+ goto badlhs;
+ break;
- 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);
}
+ cp = lhsb;
+ for (;;) {
- 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);
+ cp = rhsb;
+ (void) Strcpy(orhsb, cp);
+ for (;;) {
- 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;
- 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);