|
|
1.1 ! root 1: #include "re.h" ! 2: #include "lre.h" ! 3: #include "hdr.h" ! 4: ! 5: /* ! 6: this next one is dirty but i can't think of a good way out now. ! 7: essentially, LARGE has to be a bit bigger than the biggest buffer ! 8: we are ever given by rdfn ! 9: */ ! 10: #define LARGE (100000000+2) ! 11: ! 12: static int bb(re_bm *, unsigned char*, unsigned char*); ! 13: ! 14: re_bm * ! 15: re_bmcomp(char *ppb, char *ppe, unsigned char *map) ! 16: { ! 17: register unsigned char *pb = (unsigned char *)ppb; ! 18: register unsigned char *pe = (unsigned char *)ppe; ! 19: register int j; ! 20: int delta[256]; ! 21: register re_bm *b; ! 22: ! 23: b = (re_bm *)malloc(sizeof *b); ! 24: if(b == 0){ ! 25: re_error("b malloc fail"); ! 26: return 0; ! 27: } ! 28: b->patlen = pe-pb; ! 29: memmove((char *)b->cmap, (char *)map, sizeof b->cmap); ! 30: b->bmpat = malloc(b->patlen); ! 31: if(b->bmpat == 0){ ! 32: re_error("bmpat malloc fail"); ! 33: free((char*)b); ! 34: return 0; ! 35: } ! 36: if (bb(b, pb, pe) == 0){ ! 37: free((char*)b->bmpat); ! 38: free((char*)b); ! 39: return 0; ! 40: } ! 41: for(j = 0; pb+j < pe; j++) ! 42: b->bmpat[j] = b->cmap[pb[j]]; ! 43: for(j = 0; j < 256; j++) ! 44: delta[j] = b->patlen; ! 45: for(pe--; pb < pe; pb++) ! 46: delta[b->cmap[*pb]] = pe-pb; ! 47: delta[b->cmap[*pb]] = LARGE; ! 48: for(j = 0; j < 256; j++) ! 49: b->delta0[j] = delta[b->cmap[j]]; ! 50: return(b); ! 51: } ! 52: ! 53: static int ! 54: bb(register re_bm *b, register unsigned char *pb, register unsigned char *pe) ! 55: { ! 56: int *f; ! 57: register m = pe-pb; ! 58: register i, k, j; ! 59: ! 60: f = (int *)malloc(sizeof(int)*(m+1)); ! 61: if(f == 0){ ! 62: re_error("delta2 f malloc"); ! 63: return 0; ! 64: } ! 65: pb--; ! 66: b->delta2 = (int *)malloc(sizeof(int)*(b->patlen+1)); ! 67: if(b->delta2 == 0){ ! 68: re_error("delta2 malloc"); ! 69: free((char*)f); ! 70: return 0; ! 71: } ! 72: for(i = 1; i <= m; i++) ! 73: b->delta2[i] = 2*m-i; ! 74: j = m; ! 75: k = m+1; ! 76: while(j > 0){ ! 77: f[j] = k; ! 78: while((k <= m) && (pb[j] != pb[k])){ ! 79: if(m-j < b->delta2[k]) ! 80: b->delta2[k] = m-j; ! 81: k = f[k]; ! 82: } ! 83: j--; ! 84: k--; ! 85: } ! 86: for(i = 1; i <= k; i++){ ! 87: if(b->delta2[i] > m+k-i) ! 88: b->delta2[i] = m+k-i; ! 89: } ! 90: free((char *)f); ! 91: return 1; ! 92: } ! 93: ! 94: re_bmexec(void *re_b, RDFN rdfn, MATCHFN matchfn) ! 95: { ! 96: register re_bm *b = (re_bm*)re_b; ! 97: register unsigned char *sp; ! 98: register unsigned char *e, *s; ! 99: unsigned char *re, *rs; ! 100: register k; ! 101: ! 102: for(rs = 0; (k = (*rdfn)((char**)&rs, (char**)&re)) > 0; rs = s, re = e){ ! 103: e = re; ! 104: s = rs; ! 105: while(s < e){ ! 106: while((s += b->delta0[*s]) < e) ! 107: ; ! 108: if(s < e+b->patlen){ /* no match */ ! 109: s = e; ! 110: break; ! 111: } ! 112: s -= LARGE; ! 113: for(k = b->patlen-2, sp = s-1; k >= 0; k--) ! 114: if(b->cmap[*sp--] != b->bmpat[k]) ! 115: break; ! 116: /*print("k=%d s=%d sp=%d\n", k, s, sp);/**/ ! 117: if(k < 0){ ! 118: unsigned char *bm = ++sp, *em = s+1; ! 119: if((k = (*matchfn)((char**)&bm, (char**)&em)) <= 0) ! 120: return(k); ! 121: s = bm; ! 122: e = em; ! 123: } else { ! 124: /*j = b->delta2[k+1]; ! 125: k = b->delta0[cmap[*++sp]]; ! 126: if((j > k) || (k == LARGE)) ! 127: k = j; ! 128: s = sp+k;*/s++; ! 129: } ! 130: } ! 131: } ! 132: return(k); ! 133: } ! 134: ! 135: void ! 136: re_bmfree(re_bm *pat) ! 137: { ! 138: free((char *)pat->delta2); ! 139: free(pat->bmpat); ! 140: free((char *)pat); ! 141: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.