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