|
|
1.1 ! root 1: /* headers:regexp.h 1.3 */ ! 2: /* @(#)regexp.h 5.3 u370 source */ ! 3: #define CBRA 2 ! 4: #define CCHR 4 ! 5: #define CDOT 8 ! 6: #define CCL 12 ! 7: #define CDOL 20 ! 8: #define CCEOF 22 ! 9: #define CKET 24 ! 10: #define CBACK 36 ! 11: ! 12: #define STAR 01 ! 13: #define RNGE 03 ! 14: ! 15: #define NBRA 9 ! 16: ! 17: #define PLACE(c) ep[c >> 3] |= bittab[c & 07] ! 18: #define ISTHERE(c) (ep[c >> 3] & bittab[c & 07]) ! 19: #define ecmp(s1, s2, n) (!strncmp(s1, s2, n)) ! 20: ! 21: static char *braslist[NBRA]; ! 22: static char *braelist[NBRA]; ! 23: static int ebra; ! 24: int sed, nbra; ! 25: char *loc1, *loc2, *locs; ! 26: static int nodelim; ! 27: ! 28: int circf; ! 29: static int low; ! 30: static int size; ! 31: ! 32: static char bittab[] = { 1, 2, 4, 8, 16, 32, 64, 128 }; ! 33: ! 34: char * ! 35: compile(instring, ep, endbuf, seof) ! 36: register char *ep; ! 37: char *instring, *endbuf; ! 38: { ! 39: INIT /* Dependent declarations and initializations */ ! 40: register c; ! 41: register eof = seof; ! 42: char *lastep = instring; ! 43: int cclcnt; ! 44: char bracket[NBRA], *bracketp; ! 45: int closed; ! 46: int neg; ! 47: int lc; ! 48: int i, cflg; ! 49: ! 50: lastep = 0; ! 51: if((c = GETC()) == eof || c == '\n') { ! 52: if(c == '\n') { ! 53: UNGETC(c); ! 54: nodelim = 1; ! 55: } ! 56: if(*ep == 0 && !sed) ! 57: ERROR(41); ! 58: RETURN(ep); ! 59: } ! 60: bracketp = bracket; ! 61: circf = closed = nbra = ebra = 0; ! 62: if(c == '^') ! 63: circf++; ! 64: else ! 65: UNGETC(c); ! 66: while(1) { ! 67: if(ep >= endbuf) ! 68: ERROR(50); ! 69: c = GETC(); ! 70: if(c != '*' && ((c != '\\') || (PEEKC() != '{'))) ! 71: lastep = ep; ! 72: if(c == eof) { ! 73: *ep++ = CCEOF; ! 74: RETURN(ep); ! 75: } ! 76: switch(c) { ! 77: ! 78: case '.': ! 79: *ep++ = CDOT; ! 80: continue; ! 81: ! 82: case '\n': ! 83: if(!sed) { ! 84: UNGETC(c); ! 85: *ep++ = CCEOF; ! 86: nodelim = 1; ! 87: RETURN(ep); ! 88: } ! 89: else ERROR(36); ! 90: case '*': ! 91: if(lastep == 0 || *lastep == CBRA || *lastep == CKET) ! 92: goto defchar; ! 93: *lastep |= STAR; ! 94: continue; ! 95: ! 96: case '$': ! 97: if(PEEKC() != eof && PEEKC() != '\n') ! 98: goto defchar; ! 99: *ep++ = CDOL; ! 100: continue; ! 101: ! 102: case '[': ! 103: if(&ep[17] >= endbuf) ! 104: ERROR(50); ! 105: ! 106: *ep++ = CCL; ! 107: lc = 0; ! 108: for(i = 0; i < 16; i++) ! 109: ep[i] = 0; ! 110: ! 111: neg = 0; ! 112: if((c = GETC()) == '^') { ! 113: neg = 1; ! 114: c = GETC(); ! 115: } ! 116: ! 117: do { ! 118: if(c == '\0' || c == '\n') ! 119: ERROR(49); ! 120: if(c == '-' && lc != 0) { ! 121: if((c = GETC()) == ']') { ! 122: PLACE('-'); ! 123: break; ! 124: } ! 125: while(lc < c) { ! 126: PLACE(lc); ! 127: lc++; ! 128: } ! 129: } ! 130: lc = c; ! 131: PLACE(c); ! 132: } while((c = GETC()) != ']'); ! 133: if(neg) { ! 134: for(cclcnt = 0; cclcnt < 16; cclcnt++) ! 135: ep[cclcnt] ^= -1; ! 136: ep[0] &= 0376; ! 137: } ! 138: ! 139: ep += 16; ! 140: ! 141: continue; ! 142: ! 143: case '\\': ! 144: switch(c = GETC()) { ! 145: ! 146: case '(': ! 147: if(nbra >= NBRA) ! 148: ERROR(43); ! 149: *bracketp++ = nbra; ! 150: *ep++ = CBRA; ! 151: *ep++ = nbra++; ! 152: continue; ! 153: ! 154: case ')': ! 155: if(bracketp <= bracket || ++ebra != nbra) ! 156: ERROR(42); ! 157: *ep++ = CKET; ! 158: *ep++ = *--bracketp; ! 159: closed++; ! 160: continue; ! 161: ! 162: case '{': ! 163: if(lastep == (char *) 0) ! 164: goto defchar; ! 165: *lastep |= RNGE; ! 166: cflg = 0; ! 167: nlim: ! 168: c = GETC(); ! 169: i = 0; ! 170: do { ! 171: if('0' <= c && c <= '9') ! 172: i = 10 * i + c - '0'; ! 173: else ! 174: ERROR(16); ! 175: } while(((c = GETC()) != '\\') && (c != ',')); ! 176: if(i > 255) ! 177: ERROR(11); ! 178: *ep++ = i; ! 179: if(c == ',') { ! 180: if(cflg++) ! 181: ERROR(44); ! 182: if((c = GETC()) == '\\') ! 183: *ep++ = 255; ! 184: else { ! 185: UNGETC(c); ! 186: goto nlim; ! 187: /* get 2'nd number */ ! 188: } ! 189: } ! 190: if(GETC() != '}') ! 191: ERROR(45); ! 192: if(!cflg) /* one number */ ! 193: *ep++ = i; ! 194: else if((ep[-1] & 0377) < (ep[-2] & 0377)) ! 195: ERROR(46); ! 196: continue; ! 197: ! 198: case '\n': ! 199: ERROR(36); ! 200: ! 201: case 'n': ! 202: c = '\n'; ! 203: goto defchar; ! 204: ! 205: default: ! 206: if(c >= '1' && c <= '9') { ! 207: if((c -= '1') >= closed) ! 208: ERROR(25); ! 209: *ep++ = CBACK; ! 210: *ep++ = c; ! 211: continue; ! 212: } ! 213: } ! 214: /* Drop through to default to use \ to turn off special chars */ ! 215: ! 216: defchar: ! 217: default: ! 218: lastep = ep; ! 219: *ep++ = CCHR; ! 220: *ep++ = c; ! 221: } ! 222: } ! 223: } ! 224: ! 225: step(p1, p2) ! 226: register char *p1, *p2; ! 227: { ! 228: register c; ! 229: ! 230: if(circf) { ! 231: loc1 = p1; ! 232: return(advance(p1, p2)); ! 233: } ! 234: /* fast check for first character */ ! 235: if(*p2 == CCHR) { ! 236: c = p2[1]; ! 237: do { ! 238: if(*p1 != c) ! 239: continue; ! 240: if(advance(p1, p2)) { ! 241: loc1 = p1; ! 242: return(1); ! 243: } ! 244: } while(*p1++); ! 245: return(0); ! 246: } ! 247: /* regular algorithm */ ! 248: do { ! 249: if(advance(p1, p2)) { ! 250: loc1 = p1; ! 251: return(1); ! 252: } ! 253: } while(*p1++); ! 254: return(0); ! 255: } ! 256: ! 257: advance(lp, ep) ! 258: register char *lp, *ep; ! 259: { ! 260: register char *curlp; ! 261: int c; ! 262: char *bbeg; ! 263: int ct; ! 264: ! 265: while(1) { ! 266: switch(*ep++) { ! 267: ! 268: case CCHR: ! 269: if(*ep++ == *lp++) ! 270: continue; ! 271: return(0); ! 272: ! 273: case CDOT: ! 274: if(*lp++) ! 275: continue; ! 276: return(0); ! 277: ! 278: case CDOL: ! 279: if(*lp == 0) ! 280: continue; ! 281: return(0); ! 282: ! 283: case CCEOF: ! 284: loc2 = lp; ! 285: return(1); ! 286: ! 287: case CCL: ! 288: c = *lp++ & 0177; ! 289: if(ISTHERE(c)) { ! 290: ep += 16; ! 291: continue; ! 292: } ! 293: return(0); ! 294: case CBRA: ! 295: braslist[*ep++] = lp; ! 296: continue; ! 297: ! 298: case CKET: ! 299: braelist[*ep++] = lp; ! 300: continue; ! 301: ! 302: case CCHR | RNGE: ! 303: c = *ep++; ! 304: getrnge(ep); ! 305: while(low--) ! 306: if(*lp++ != c) ! 307: return(0); ! 308: curlp = lp; ! 309: while(size--) ! 310: if(*lp++ != c) ! 311: break; ! 312: if(size < 0) ! 313: lp++; ! 314: ep += 2; ! 315: goto star; ! 316: ! 317: case CDOT | RNGE: ! 318: getrnge(ep); ! 319: while(low--) ! 320: if(*lp++ == '\0') ! 321: return(0); ! 322: curlp = lp; ! 323: while(size--) ! 324: if(*lp++ == '\0') ! 325: break; ! 326: if(size < 0) ! 327: lp++; ! 328: ep += 2; ! 329: goto star; ! 330: ! 331: case CCL | RNGE: ! 332: getrnge(ep + 16); ! 333: while(low--) { ! 334: c = *lp++ & 0177; ! 335: if(!ISTHERE(c)) ! 336: return(0); ! 337: } ! 338: curlp = lp; ! 339: while(size--) { ! 340: c = *lp++ & 0177; ! 341: if(!ISTHERE(c)) ! 342: break; ! 343: } ! 344: if(size < 0) ! 345: lp++; ! 346: ep += 18; /* 16 + 2 */ ! 347: goto star; ! 348: ! 349: case CBACK: ! 350: bbeg = braslist[*ep]; ! 351: ct = braelist[*ep++] - bbeg; ! 352: ! 353: if(ecmp(bbeg, lp, ct)) { ! 354: lp += ct; ! 355: continue; ! 356: } ! 357: return(0); ! 358: ! 359: case CBACK | STAR: ! 360: bbeg = braslist[*ep]; ! 361: ct = braelist[*ep++] - bbeg; ! 362: curlp = lp; ! 363: while(ecmp(bbeg, lp, ct)) ! 364: lp += ct; ! 365: ! 366: while(lp >= curlp) { ! 367: if(advance(lp, ep)) return(1); ! 368: lp -= ct; ! 369: } ! 370: return(0); ! 371: ! 372: ! 373: case CDOT | STAR: ! 374: curlp = lp; ! 375: while(*lp++); ! 376: goto star; ! 377: ! 378: case CCHR | STAR: ! 379: curlp = lp; ! 380: while(*lp++ == *ep); ! 381: ep++; ! 382: goto star; ! 383: ! 384: case CCL | STAR: ! 385: curlp = lp; ! 386: do { ! 387: c = *lp++ & 0177; ! 388: } while(ISTHERE(c)); ! 389: ep += 16; ! 390: goto star; ! 391: ! 392: star: ! 393: do { ! 394: if(--lp == locs) ! 395: break; ! 396: if(advance(lp, ep)) ! 397: return(1); ! 398: } while(lp > curlp); ! 399: return(0); ! 400: ! 401: } ! 402: } ! 403: } ! 404: ! 405: static ! 406: getrnge(str) ! 407: register unsigned char *str; ! 408: { ! 409: low = *str++ & 0377; ! 410: size = (*str == (unsigned char)255)? 20000: (*str &0377) - low; ! 411: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.