=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/awk/b.c,v retrieving revision 1.9 retrieving revision 1.10 diff -c -r1.9 -r1.10 *** src/usr.bin/awk/b.c 2001/07/12 05:16:53 1.9 --- src/usr.bin/awk/b.c 2001/09/08 00:12:40 1.10 *************** *** 1,4 **** ! /* $OpenBSD: b.c,v 1.9 2001/07/12 05:16:53 deraadt Exp $ */ /**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved --- 1,4 ---- ! /* $OpenBSD: b.c,v 1.10 2001/09/08 00:12:40 millert Exp $ */ /**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved *************** *** 34,40 **** #include "awk.h" #include "ytab.h" ! #define HAT (NCHARS-1) /* matches ^ in regular expr */ /* NCHARS is 2**n */ #define MAXLIN 22 --- 34,40 ---- #include "awk.h" #include "ytab.h" ! #define HAT (NCHARS-2) /* matches ^ in regular expr */ /* NCHARS is 2**n */ #define MAXLIN 22 *************** *** 62,70 **** int rtok; /* next token in current re */ int rlxval; ! char *rlxstr; ! char *prestr; /* current position in current re */ ! char *lastre; /* origin of last re */ static int setcnt; static int poscnt; --- 62,70 ---- int rtok; /* next token in current re */ int rlxval; ! static uschar *rlxstr; ! static uschar *prestr; /* current position in current re */ ! static uschar *lastre; /* origin of last re */ static int setcnt; static int poscnt; *************** *** 97,103 **** && strcmp(fatab[i]->restr, s) == 0) { fatab[i]->use = now++; return fatab[i]; ! } pfa = mkdfa(s, anchor); if (nfatab < NFA) { /* room for another */ fatab[nfatab] = pfa; --- 97,103 ---- && strcmp(fatab[i]->restr, s) == 0) { fatab[i]->use = now++; return fatab[i]; ! } pfa = mkdfa(s, anchor); if (nfatab < NFA) { /* room for another */ fatab[nfatab] = pfa; *************** *** 144,150 **** *f->posns[1] = 0; f->initstat = makeinit(f, anchor); f->anchor = anchor; ! f->restr = tostring(s); return f; } --- 144,150 ---- *f->posns[1] = 0; f->initstat = makeinit(f, anchor); f->anchor = anchor; ! f->restr = (uschar *) tostring(s); return f; } *************** *** 231,241 **** int hexstr(char **pp) /* find and eval hex string at pp, return new p */ { /* only pick up one 8-bit byte (2 chars) */ ! char *p; int n = 0; int i; ! for (i = 0, p = *pp; i < 2 && isxdigit(*p); i++, p++) { if (isdigit(*p)) n = 16 * n + *p - '0'; else if (*p >= 'a' && *p <= 'f') --- 231,241 ---- int hexstr(char **pp) /* find and eval hex string at pp, return new p */ { /* only pick up one 8-bit byte (2 chars) */ ! uschar *p; int n = 0; int i; ! for (i = 0, p = (uschar *) *pp; i < 2 && isxdigit(*p); i++, p++) { if (isdigit(*p)) n = 16 * n + *p - '0'; else if (*p >= 'a' && *p <= 'f') *************** *** 243,249 **** else if (*p >= 'A' && *p <= 'F') n = 16 * n + *p - 'A' + 10; } ! *pp = p; return n; } --- 243,249 ---- else if (*p >= 'A' && *p <= 'F') n = 16 * n + *p - 'A' + 10; } ! *pp = (char *) p; return n; } *************** *** 283,315 **** return c; } ! char *cclenter(char *p) /* add a character class */ { int i, c, c2; ! char *op, *bp; ! static char *buf = 0; static int bufsz = 100; op = p; ! if (buf == 0 && (buf = (char *) malloc(bufsz)) == NULL) FATAL("out of space for character class [%.10s...] 1", p); bp = buf; for (i = 0; (c = *p++) != 0; ) { if (c == '\\') { ! c = quoted(&p); } else if (c == '-' && i > 0 && bp[-1] != 0) { if (*p != 0) { c = bp[-1]; c2 = *p++; if (c2 == '\\') ! c2 = quoted(&p); if (c > c2) { /* empty; ignore */ bp--; i--; continue; } while (c < c2) { ! if (!adjbuf(&buf, &bufsz, bp-buf+2, 100, &bp, 0)) FATAL("out of space for character class [%.10s...] 2", p); *bp++ = ++c; i++; --- 283,316 ---- return c; } ! char *cclenter(char *argp) /* add a character class */ { int i, c, c2; ! uschar *p = (uschar *) argp; ! uschar *op, *bp; ! static uschar *buf = 0; static int bufsz = 100; op = p; ! if (buf == 0 && (buf = (uschar *) malloc(bufsz)) == NULL) FATAL("out of space for character class [%.10s...] 1", p); bp = buf; for (i = 0; (c = *p++) != 0; ) { if (c == '\\') { ! c = quoted((char **) &p); } else if (c == '-' && i > 0 && bp[-1] != 0) { if (*p != 0) { c = bp[-1]; c2 = *p++; if (c2 == '\\') ! c2 = quoted((char **) &p); if (c > c2) { /* empty; ignore */ bp--; i--; continue; } while (c < c2) { ! if (!adjbuf((char **) &buf, &bufsz, bp-buf+2, 100, (char **) &bp, 0)) FATAL("out of space for character class [%.10s...] 2", p); *bp++ = ++c; i++; *************** *** 317,323 **** continue; } } ! if (!adjbuf(&buf, &bufsz, bp-buf+2, 100, &bp, 0)) FATAL("out of space for character class [%.10s...] 3", p); *bp++ = c; i++; --- 318,324 ---- continue; } } ! if (!adjbuf((char **) &buf, &bufsz, bp-buf+2, 100, (char **) &bp, 0)) FATAL("out of space for character class [%.10s...] 3", p); *bp++ = c; i++; *************** *** 325,331 **** *bp = 0; dprintf( ("cclenter: in = |%s|, out = |%s|\n", op, buf) ); xfree(op); ! return(tostring(buf)); } void overflo(char *s) --- 326,332 ---- *bp = 0; dprintf( ("cclenter: in = |%s|, out = |%s|\n", op, buf) ); xfree(op); ! return (char *) tostring((char *) buf); } void overflo(char *s) *************** *** 446,453 **** } } ! int member(int c, char *s) /* is c in s? */ { while (*s) if (c == *s++) return(1); --- 447,456 ---- } } ! int member(int c, char *sarg) /* is c in s? */ { + uschar *s = (uschar *) sarg; + while (*s) if (c == *s++) return(1); *************** *** 583,589 **** Node *np; dprintf( ("reparse <%s>\n", p) ); ! lastre = prestr = p; /* prestr points to string to be parsed */ rtok = relex(); if (rtok == '\0') FATAL("empty regular expression"); --- 586,592 ---- Node *np; dprintf( ("reparse <%s>\n", p) ); ! lastre = prestr = (uschar *) p; /* prestr points to string to be parsed */ rtok = relex(); if (rtok == '\0') FATAL("empty regular expression"); *************** *** 614,624 **** rtok = relex(); return (unary(op2(DOT, NIL, NIL))); case CCL: ! np = op2(CCL, NIL, (Node*) cclenter(rlxstr)); rtok = relex(); return (unary(np)); case NCCL: ! np = op2(NCCL, NIL, (Node *) cclenter(rlxstr)); rtok = relex(); return (unary(np)); case '^': --- 617,627 ---- rtok = relex(); return (unary(op2(DOT, NIL, NIL))); case CCL: ! np = op2(CCL, NIL, (Node*) cclenter((char *) rlxstr)); rtok = relex(); return (unary(np)); case NCCL: ! np = op2(NCCL, NIL, (Node *) cclenter((char *) rlxstr)); rtok = relex(); return (unary(np)); case '^': *************** *** 685,693 **** { int c, n; int cflag; ! static char *buf = 0; static int bufsz = 100; ! char *bp; switch (c = *prestr++) { case '|': return OR; --- 688,696 ---- { int c, n; int cflag; ! static uschar *buf = 0; static int bufsz = 100; ! uschar *bp; switch (c = *prestr++) { case '|': return OR; *************** *** 702,714 **** case ')': return c; case '\\': ! rlxval = quoted(&prestr); return CHAR; default: rlxval = c; return CHAR; case '[': ! if (buf == 0 && (buf = (char *) malloc(bufsz)) == NULL) FATAL("out of space in reg expr %.10s..", lastre); bp = buf; if (*prestr == '^') { --- 705,717 ---- case ')': return c; case '\\': ! rlxval = quoted((char **) &prestr); return CHAR; default: rlxval = c; return CHAR; case '[': ! if (buf == 0 && (buf = (uschar *) malloc(bufsz)) == NULL) FATAL("out of space in reg expr %.10s..", lastre); bp = buf; if (*prestr == '^') { *************** *** 718,724 **** else cflag = 0; n = 2 * strlen(prestr)+1; ! if (!adjbuf(&buf, &bufsz, n, n, &bp, 0)) FATAL("out of space for reg expr %.10s...", lastre); for (; ; ) { if ((c = *prestr++) == '\\') { --- 721,727 ---- else cflag = 0; n = 2 * strlen(prestr)+1; ! if (!adjbuf((char **) &buf, &bufsz, n, n, (char **) &bp, 0)) FATAL("out of space for reg expr %.10s...", lastre); for (; ; ) { if ((c = *prestr++) == '\\') { *************** *** 726,740 **** if ((c = *prestr++) == '\0') FATAL("nonterminated character class %.20s...", lastre); *bp++ = c; ! } else if (c == '\n') { ! FATAL("newline in character class %.20s...", lastre); } else if (c == '\0') { FATAL("nonterminated character class %.20s", lastre); } else if (bp == buf) { /* 1st char is special */ *bp++ = c; } else if (c == ']') { *bp++ = 0; ! rlxstr = tostring(buf); if (cflag == 0) return CCL; else --- 729,743 ---- if ((c = *prestr++) == '\0') FATAL("nonterminated character class %.20s...", lastre); *bp++ = c; ! /* } else if (c == '\n') { */ ! /* FATAL("newline in character class %.20s...", lastre); */ } else if (c == '\0') { FATAL("nonterminated character class %.20s", lastre); } else if (bp == buf) { /* 1st char is special */ *bp++ = c; } else if (c == ']') { *bp++ = 0; ! rlxstr = (uschar *) tostring((char *) buf); if (cflag == 0) return CCL; else *************** *** 750,756 **** int i, j, k; int *p, *q; ! if (c < 0) FATAL("can't happen: neg char %d in cgoto", c); while (f->accept >= maxsetvec) { /* guessing here! */ maxsetvec *= 4; --- 753,759 ---- int i, j, k; int *p, *q; ! if (c < 0 || c > 255) FATAL("can't happen: neg char %d in cgoto", c); while (f->accept >= maxsetvec) { /* guessing here! */ maxsetvec *= 4; *************** *** 769,776 **** if ((k == CHAR && c == ptoi(f->re[p[i]].lval.np)) || (k == DOT && c != 0 && c != HAT) || (k == ALL && c != 0) ! || (k == CCL && member(c, f->re[p[i]].lval.up)) ! || (k == NCCL && !member(c, f->re[p[i]].lval.up) && c != 0 && c != HAT)) { q = f->re[p[i]].lfollow; for (j = 1; j <= *q; j++) { if (q[j] >= maxsetvec) { --- 772,779 ---- if ((k == CHAR && c == ptoi(f->re[p[i]].lval.np)) || (k == DOT && c != 0 && c != HAT) || (k == ALL && c != 0) ! || (k == CCL && member(c, (char *) f->re[p[i]].lval.up)) ! || (k == NCCL && !member(c, (char *) f->re[p[i]].lval.up) && c != 0 && c != HAT)) { q = f->re[p[i]].lfollow; for (j = 1; j <= *q; j++) { if (q[j] >= maxsetvec) {