|
|
1.1 ! root 1: #include "hdr.h" ! 2: #include "y.tab.h" ! 3: ! 4: #define NLIT 256 ! 5: #define LSTART litp = litb ! 6: #define LEND {*litp = 0; if(strlen(litb) > strlen(blit))strcpy(blit,litb);} ! 7: ! 8: static char *litp, litb[NLIT], *blit; ! 9: ! 10: ! 11: /* ! 12: islit has to return 1 if we are to use boyer-moore. ! 13: in this case, set buf to the literal string and ! 14: set bmegrep to 1 if there is a regular expression ! 15: beside the literal (literal can be anywhere). ! 16: */ ! 17: islit(buf) ! 18: char *buf; ! 19: { ! 20: bmegrep = 0; ! 21: blit = buf; ! 22: *blit = 0; ! 23: LSTART; ! 24: ! 25: /* pr(line-2, ""); */ ! 26: ! 27: lit(line-2); ! 28: LEND; ! 29: if(strlen(blit) > 1){ ! 30: /* bmegrep set by lit */ ! 31: return(1); ! 32: } ! 33: return(0); ! 34: } ! 35: ! 36: /* ! 37: lit builds literal strings in litb. we ensure these are compulsory ! 38: literal string by only descending the right nodes. ! 39: */ ! 40: lit(n) ! 41: { ! 42: if(name[n] == CAT){ ! 43: lit(left[n]); ! 44: lit(right[n]); ! 45: } else if(name[n] == PLUS){ ! 46: lit(left[n]); ! 47: LEND; /* can't go on past a + */ ! 48: LSTART; ! 49: bmegrep = 1; ! 50: lit(left[n]); /* but we can start with one! */ ! 51: } else if((name[n] == CCL) && (chars[right[n]] == 1)){ ! 52: *litp++ = chars[right[n]+1]; ! 53: if(litp == &litb[NLIT]) ! 54: litp--; ! 55: } else if(left[n] == 0 && name[n] < 256 ! 56: && name[n] != LEFT && name[n] != RIGHT){ ! 57: *litp++ = name[n]; ! 58: if(litp == &litb[NLIT]) ! 59: litp--; ! 60: } else { ! 61: LEND; ! 62: LSTART; ! 63: bmegrep = 1; ! 64: } ! 65: } ! 66: ! 67: /*#ifdef DEBUG*/ ! 68: ! 69: pr(n, s) ! 70: char *s; ! 71: { ! 72: char buf[256]; ! 73: int i, cnt; ! 74: ! 75: print("%s", s); ! 76: sprint(buf, "%s ", s); ! 77: switch(name[n]) ! 78: { ! 79: case FINAL: print("expr=\n"); pr(left[n], buf); break; ! 80: case DOT: print("%d: .\n",n); break; ! 81: case STAR: print("%d: *\n",n); pr(left[n], buf); break; ! 82: case PLUS: print("%d: +\n",n); pr(left[n], buf); break; ! 83: case QUEST: print("%d: ?\n",n); pr(left[n], buf); break; ! 84: case CAT: print("%d: cat\n", n); pr(left[n], buf); pr(right[n], buf); break; ! 85: case OR: print("%d: or\n", n); pr(left[n], buf); pr(right[n], buf); break; ! 86: case NCCL: ! 87: case CCL: print("%d: [%s", n, name[n]==NCCL? "^":""); ! 88: for(i = right[n], cnt = chars[i++]; cnt > 0; cnt--) ! 89: print("%c", chars[i++]); ! 90: print("]\n"); ! 91: break; ! 92: default: ! 93: if(name[n] < 256) ! 94: print("%d: '%c'\n", n, name[n]); ! 95: else ! 96: print("URK %d\n", name[n]); ! 97: break; ! 98: } ! 99: } ! 100: /*#endif*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.