|
|
1.1 ! root 1: #include "re.h" ! 2: #include "lre.h" ! 3: #include "hdr.h" ! 4: ! 5: /*#define DEBUG /**/ ! 6: ! 7: /* the following ifdef aids testing of the buffering code */ ! 8: #ifndef BUFSIZE ! 9: #define BUFSIZE 50000 ! 10: #endif ! 11: ! 12: #define OVERFLOW (BUFSIZE/10) ! 13: /* ! 14: lines less than BUFSIZE are preserved. larger lines have at least ! 15: BUFSIZE-OVERFLOW preserved ! 16: */ ! 17: ! 18: static char rbuf[BUFSIZE+1] = "\n"; ! 19: static char *buf = rbuf+1; ! 20: static char *next, *proc; ! 21: /* invariants: ! 22: valid text in buffer: buf <= text < next ! 23: text to be processed: proc <= text < next ! 24: buf, proc always point at beginning of lines ! 25: */ ! 26: ! 27: greprd(register char **b, register char **e) ! 28: { ! 29: int n; ! 30: int keepingsome; ! 31: register char *p; ! 32: ! 33: if(*b == 0) /* set up invariants */ ! 34: *b = *e = next = proc = buf; ! 35: keepingsome = *b != *e; ! 36: again: /* this is only used for overflowing input lines */ ! 37: #ifdef DEBUG ! 38: fprint(2, "%d <> %d; keep=%d (%d'%.10s'..%d) proc=%d\n", next, &buf[BUFSIZE], keepingsome, *b, *b?*b:"", *e, proc); ! 39: #endif ! 40: if(next < &buf[BUFSIZE]){ ! 41: /* ! 42: next is fine but *b may not be set ! 43: */ ! 44: if(!keepingsome) ! 45: *b = proc; ! 46: } else { ! 47: /* ! 48: find a \n so we can shift the buffer ! 49: */ ! 50: if(keepingsome){ ! 51: for(p = *b-1; p >= buf; p--) ! 52: if(*p == '\n') break; ! 53: p++; ! 54: /* the best new buffer start is p */ ! 55: if(p == buf){ /* progressing? */ ! 56: longline: ! 57: if(!longlinewarned){ ! 58: EPR "%s: %s: warning: ", progname, curfile); ! 59: if(bflag) ! 60: EPR "%ld: ", nbytes/offsetunit); ! 61: if(nflag) ! 62: EPR "%ld: ", lnum); ! 63: EPR "line too long (> %d chars); text skipped\n", BUFSIZE); ! 64: longlinewarned = 1; ! 65: } ! 66: next -= OVERFLOW; ! 67: noverflow += OVERFLOW; ! 68: goto again; ! 69: } ! 70: } else { ! 71: /* not keeping any; we only have to look at unprocessed */ ! 72: for(p = next-1; p >= proc; p--) ! 73: if(*p == '\n') break; ! 74: p++; ! 75: if(p == buf) ! 76: goto longline; ! 77: *b = p; ! 78: } ! 79: /* process any we haven't */ ! 80: if(proc < p){ ! 81: (*failfn)(proc, p); ! 82: proc = p; ! 83: } ! 84: /* move it! */ ! 85: n = p-buf; ! 86: memcpy(buf, p, next-p); ! 87: proc -= n; ! 88: next -= n; ! 89: *b -= n; ! 90: } ! 91: /* ! 92: *b points to start of returned (saved) text ! 93: next points to first available text for reading ! 94: */ ! 95: FLUSH; ! 96: if((n = read(ifd, next, &buf[BUFSIZE] - next)) <= 0){ ! 97: if(proc < next){ ! 98: (*failfn)(proc, next); ! 99: } ! 100: proc = next; ! 101: return(n); ! 102: } ! 103: next += n; ! 104: *e = next; ! 105: #ifdef DEBUG ! 106: fprint(2, "greprd returns %d .. %d\n", *b, *e); ! 107: #endif ! 108: return(1); ! 109: } ! 110: ! 111: grepmatch(register char **b, register char **e) ! 112: { ! 113: char *s, *f; ! 114: int eoffset, n, ret = 1; ! 115: #ifdef DEBUG ! 116: fprint(2, "match! *b=%d@%d='%.100s' *e=%d@%d\n", **b, *b, *b, **e, *e);/**/ ! 117: #endif ! 118: for(s = *b; s >= proc; s--) ! 119: if(*s == '\n') ! 120: break; ! 121: if(s != *b) ! 122: s++; ! 123: if(proc < s){ ! 124: (*failfn)(proc, s); ! 125: proc = s; ! 126: } ! 127: f = *e; ! 128: for(;;){ ! 129: for(; f < next; f++) ! 130: if(*f == '\n') ! 131: goto done; ! 132: eoffset = f-s; ! 133: if((n = greprd(&s, &f)) <= 0){ ! 134: ret = n; ! 135: goto done; ! 136: } ! 137: f = s+eoffset; ! 138: } ! 139: done: ! 140: f++; ! 141: if(s > f) ! 142: abort(); ! 143: (*succfn)(s, f); ! 144: proc = *b = f; ! 145: *e = next; ! 146: #ifdef DEBUG ! 147: fprint(2, "match at '%.20s'; resuming at '%.20s'@%d\n", s, f, f);/**/ ! 148: #endif ! 149: return(ret); ! 150: } ! 151: ! 152: cwxrd(register char **b, register char **e) ! 153: { ! 154: int n; ! 155: ! 156: n = greprd(b, e); ! 157: if(n > 0){ ! 158: (*b)--; ! 159: #ifdef DEBUG ! 160: fprint(2, "grepxrd returns %d .. %d\n", *b, *e); ! 161: #endif ! 162: } ! 163: return(n); ! 164: } ! 165: ! 166: cwxmatch(register char **b, register char **e) ! 167: { ! 168: char *s, *f; ! 169: int eoffset, n, ret = 1; ! 170: ! 171: #ifdef DEBUG ! 172: fprint(2, "cwxmatch! *b=%d@%d='%.100s' *e=%d@%d\n", **b, *b, *b, **e, *e);/**/ ! 173: #endif ! 174: for(s = *b; s >= proc; s--) ! 175: if(*s == '\n') ! 176: break; ! 177: s++; ! 178: if(proc < s){ ! 179: /* ! 180: fprint(2, "cwxfail! *b=%d@%d='%.50s' *e=%d@%d\n", **b, *b, *b, **e, *e); ! 181: fprint(2, "s=%d, proc=%d, dbg.b=%d dbg.e=%d dbg.resume=%d\n", s, proc,dbg.b, dbg.e, dbg.resume); ! 182: */ ! 183: (*failfn)(proc, s); ! 184: proc = s; ! 185: } ! 186: f = *e - 1; ! 187: for(;;){ ! 188: for(; f < next; f++) ! 189: if(*f == '\n') ! 190: goto done; ! 191: eoffset = f-s; ! 192: if((n = greprd(&s, &f)) <= 0){ ! 193: ret = n; ! 194: goto done; ! 195: } ! 196: f = s+eoffset; ! 197: } ! 198: done: ! 199: f++; ! 200: if(s > f) ! 201: abort(); ! 202: (*succfn)(s, f); ! 203: proc = *b = f; ! 204: *e = next; ! 205: (*b)--; ! 206: #ifdef DEBUG ! 207: fprint(2, "cwxmatch at '%.20s'; resuming at '%.20s'@%d\n", s, f, f);/**/ ! 208: #endif ! 209: return(ret); ! 210: } ! 211: ! 212: bmxmatch(register char **b, register char **e) ! 213: { ! 214: char *s, *f; ! 215: int eoffset, n, ret = 1; ! 216: ! 217: #ifdef DEBUG ! 218: fprint(2, "bmxmatch! *b=%d@%d='%.100s' *e=%d@%d\n", **b, *b, *b, **e, *e);/**/ ! 219: #endif ! 220: for(s = *b; s >= proc; s--) ! 221: if(*s == '\n') ! 222: break; ! 223: s++; ! 224: if(proc < s){ ! 225: (*failfn)(proc, s); ! 226: proc = s; ! 227: } ! 228: f = *e - 1; ! 229: for(;;){ ! 230: for(; f < next; f++) ! 231: if(*f == '\n') ! 232: goto done; ! 233: eoffset = f-s; ! 234: if((n = greprd(&s, &f)) <= 0){ ! 235: ret = n; ! 236: goto done; ! 237: } ! 238: f = s+eoffset; ! 239: } ! 240: done: ! 241: f++; ! 242: if(s > f) ! 243: abort(); ! 244: (*((*b == s)? succfn:failfn))(s, f); ! 245: proc = *b = f; ! 246: *e = next; ! 247: #ifdef DEBUG ! 248: fprint(2, "bmxmatch at '%.20s'; resuming at '%.20s'\n", s, f);/**/ ! 249: #endif ! 250: return(ret); ! 251: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.