|
|
1.1 ! root 1: #include "hdr.h" ! 2: ! 3: #define LARGE 100000 ! 4: ! 5: static int delta0[256]; ! 6: static char cmap[256]; ! 7: static char *bmpat; ! 8: ! 9: bmprep(pattern) ! 10: char *pattern; ! 11: { ! 12: register int j, patlen; ! 13: ! 14: patlen = strlen(bmpat = pattern); ! 15: for(j = 0; j < 256; j++){ ! 16: delta0[j] = patlen; ! 17: cmap[j] = j; ! 18: } ! 19: for(j = 0; j < patlen-1; j++) ! 20: delta0[pattern[j]] = patlen-j-1; ! 21: delta0[pattern[patlen-1]] = LARGE; ! 22: if(iflag){ ! 23: for(j = 0; j < patlen-1; j++) ! 24: if(islower(pattern[j])) ! 25: delta0[toupper(pattern[j])] = patlen-j-1; ! 26: if(islower(pattern[patlen-1])) ! 27: delta0[toupper(pattern[patlen-1])] = LARGE; ! 28: for(j = 'A'; j <= 'Z'; j++) ! 29: cmap[j] = tolower(j); ! 30: } ! 31: } ! 32: ! 33: bmexecute(file) ! 34: char *file; ! 35: { ! 36: register char *p; ! 37: register char *endpt; ! 38: register char *s; ! 39: register int j; ! 40: int len, patlen = strlen(bmpat); ! 41: char *rdpt; ! 42: int fd, eof, n; ! 43: long seek; ! 44: char *nlp, *proc, *np, *op; ! 45: char buf[8*8192]; ! 46: ! 47: if(file){ ! 48: if((fd = open(file, 0)) < 0){ ! 49: fprint(2, "%s: can't open %s\n", progname, file); ! 50: badbotch=1; ! 51: return; ! 52: } ! 53: } else ! 54: fd = 0; ! 55: lnum = 1; ! 56: tln = 0; ! 57: rdpt = buf; ! 58: seek = 0; ! 59: for(eof = 0; eof == 0;){ ! 60: Fflush(1); ! 61: if((n = read(fd, rdpt, &buf[sizeof buf]-rdpt)) <= 0){ ! 62: if(rdpt == buf) ! 63: break; /* eof, nothing left to process */ ! 64: *rdpt = '\n'; /* terminate */ ! 65: endpt = rdpt+1; ! 66: eof = 1; ! 67: } else { ! 68: for(p = &rdpt[n]; p >= rdpt;) ! 69: if(*--p == '\n') ! 70: break; ! 71: if(p < rdpt){ /* line bigger than buf!! */ ! 72: rdpt = &buf[sizeof buf/2]; /* chop in half */ ! 73: continue; /* reading */ ! 74: } ! 75: endpt = p+1; ! 76: } ! 77: /* ! 78: invariants: ! 79: no newline between buf and rdpt[-1] ! 80: lnum = nlines before buf ! 81: seek = char offset of buf[0] ! 82: last char read is rdpt[n-1] ! 83: first char after last \n is endpt ! 84: ! 85: following is exited to three places: ! 86: succeed: match ! 87: refresh: !match (readjust ptrs and loop) ! 88: ! 89: */ ! 90: p = buf+patlen-1; ! 91: proc = buf-1; ! 92: scan: ! 93: for(;;){ ! 94: while((p += delta0[*(unsigned char *)p]) < endpt) ! 95: ; ! 96: if(p < (buf+LARGE)){ /* no match */ ! 97: goto refresh; ! 98: } ! 99: p -= LARGE; ! 100: for(j = patlen-2, s = p-1; j >= 0; j--) ! 101: if(cmap[*s--] != bmpat[j]) ! 102: break; ! 103: if(j < 0) /* match!! */ ! 104: goto succeed; ! 105: fail: ! 106: p++; ! 107: } ! 108: succeed: ! 109: if(bmegrep || !cflag || !sflag){ /* lflag doesn't matter */ ! 110: nlp = memchr(p, '\n', (endpt+1)-p); ! 111: op = p; ! 112: p -= patlen-1; ! 113: while(*p != '\n') ! 114: if(--p < buf) break; ! 115: p++; ! 116: if(bmegrep) ! 117: if(legrep(p) == 0){ ! 118: p = op; ! 119: goto fail; ! 120: } ! 121: } ! 122: nsucc = 1; ! 123: if (cflag){ ! 124: tln++; ! 125: p = nlp+1; ! 126: goto scan; ! 127: } else if(sflag){ ! 128: if(scanexit) exit(0); ! 129: } else if(lflag){ ! 130: Fprint(1, "%s\n", file); ! 131: close(fd); ! 132: return; ! 133: } else { ! 134: if (nfile > 1 && hflag) ! 135: Fprint(1, "%s:", file); ! 136: if (bflag) ! 137: Fprint(1, "%ld:", (seek+(p-buf))/BLKSIZE); ! 138: if (nflag){ ! 139: while(np = memchr(proc+1, '\n', p-proc)){ ! 140: lnum++; ! 141: proc = np; ! 142: } ! 143: Fprint(1, "%ld:", lnum); ! 144: } ! 145: Fwrite(1, p, nlp-p+1); ! 146: p = nlp+1; ! 147: if(p < endpt) ! 148: goto scan; ! 149: } ! 150: refresh: ! 151: if(nflag){ /* count newlines that we haven't proc */ ! 152: while(proc = memchr(proc+1, '\n', endpt-proc)) ! 153: lnum++; ! 154: } ! 155: memcpy(buf, endpt, j = &rdpt[n]-endpt); ! 156: rdpt = &buf[j]; ! 157: seek += n; ! 158: } ! 159: done: close(fd); ! 160: if (cflag) { ! 161: if (nfile > 1) ! 162: Fprint(1, "%s:", file); ! 163: Fprint(1, "%ld\n", tln); ! 164: } ! 165: #ifdef DOSTATS ! 166: nbytes += seek; ! 167: #endif ! 168: } ! 169: ! 170: /* ! 171: isn't egrep pretty when it just has to mtach or not? ! 172: */ ! 173: ! 174: legrep(p) ! 175: register char *p; ! 176: { ! 177: register State *cstat, *t; ! 178: ! 179: if(reinit == 1) ! 180: clearg(); ! 181: cstat = istat; ! 182: if(cstat->out) ! 183: return(1); ! 184: for(;;){ ! 185: if((t = cstat->gotofn[*(unsigned char *)p]) == 0) ! 186: cstat = nxtst(cstat, *(unsigned char *)p); ! 187: else ! 188: cstat = t; ! 189: if(cstat->out){ ! 190: return(1); ! 191: } ! 192: if(*p++ == RIGHT){ ! 193: return(0); ! 194: } ! 195: } ! 196: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.