|
|
1.1 ! root 1: #include <ctype.h> ! 2: #include "re.h" ! 3: #include "lre.h" ! 4: #include "hdr.h" ! 5: ! 6: static void gresucc(char*, char*); /* does reg exp match after bm */ ! 7: static int reader(void*, RDFN, MATCHFN);/* plain analog of bmfind, cwfind */ ! 8: static void readin(char*, char*, unsigned char**, unsigned char**); ! 9: ! 10: void ! 11: dogre(Parsetype parser, char *input, char *finput, unsigned char *map, PROCFN *pprocfn, void **pat, RDFN *prdfn, MATCHFN *pmatchfn) ! 12: { ! 13: unsigned char *lb, *le; ! 14: ! 15: readin(input, finput, &lb, &le); ! 16: *pat = 0; ! 17: globre = egprep(parser, lb, le, map, 1); ! 18: *prdfn = greprd; ! 19: *pmatchfn = grepmatch; ! 20: if(sflag || lflag || Lflag || oneflag){ ! 21: if(vflag == 0) ! 22: succ2fn = oneshot, failfn = count_m; ! 23: else ! 24: succ2fn = count, failfn = oneshot; ! 25: } else if(cflag){ ! 26: if(vflag == 0) ! 27: succ2fn = inc, failfn = null; ! 28: else ! 29: succ2fn = null, failfn = inc_m; ! 30: } else if(vflag){ ! 31: if(bflag||nflag) ! 32: succ2fn = count; ! 33: else ! 34: succ2fn = null; ! 35: failfn = pr_m; ! 36: } else { ! 37: succ2fn = pr; ! 38: if(bflag||nflag) ! 39: failfn = count_m; ! 40: else ! 41: failfn = null; ! 42: } ! 43: if(re_lit(globre, &lb, &le)){ ! 44: *pat = (void *)re_bmcomp((char *)lb, (char *)le, map); ! 45: *pprocfn = re_bmexec; ! 46: succfn = gresucc; ! 47: } else { ! 48: if(*pat = (void *)re_recw(globre, map)) ! 49: *pprocfn = re_cwexec; ! 50: else ! 51: *pprocfn = reader; ! 52: succfn = succ2fn; ! 53: } ! 54: } ! 55: ! 56: static ! 57: reader(void *UNUSED, RDFN rdfn, MATCHFN matchfn) ! 58: { ! 59: unsigned char *b, *e; ! 60: unsigned char *nl; ! 61: int k; ! 62: #pragma ref UNUSED ! 63: ! 64: b = 0; ! 65: while((k = (*rdfn)((char**)&b, (char**)&e)) > 0){ ! 66: while(nl = (unsigned char *)memchr((char *)b, '\n', e-b)){ ! 67: if(eg_match(globre, b, nl, (unsigned char **)0, (unsigned char **)0)){ ! 68: e = nl; ! 69: if((k = (*matchfn)((char**)&b, (char**)&e)) <= 0) ! 70: return(k); ! 71: } else ! 72: b = nl+1; ! 73: } ! 74: } ! 75: return(k); ! 76: } ! 77: ! 78: static void ! 79: readin(char *in, char *fin, unsigned char **beg, unsigned char **end) ! 80: { ! 81: int size, n, fd, left; ! 82: char *base, *p; ! 83: ! 84: if(in){ ! 85: if(xflag){ ! 86: size = 4+strlen(in)+1; ! 87: *beg = (unsigned char *)malloc(size); ! 88: if (!*beg){ ! 89: EPR "%s: can't malloc %d bytes for -x\n", progname, size); ! 90: exit(2); ! 91: } ! 92: p = (char *)*beg; ! 93: *p++ = '^'; ! 94: *p++ = '('; ! 95: memmove(p, in, n = strlen(in)); ! 96: p += n; ! 97: *p++ = ')'; ! 98: *p++ = '$'; ! 99: *end = (unsigned char *)p; ! 100: } else { ! 101: *beg = (unsigned char *)in; ! 102: *end = *beg + strlen(in); ! 103: } ! 104: return; ! 105: } ! 106: /* we know fin is nonzero */ ! 107: if((fd = open(fin, 0)) < 0){ ! 108: perror(fin); ! 109: exit(2); ! 110: } ! 111: /* ! 112: i object to calling stat; the following crap is not painful ! 113: and at worst involves copying twice the number of bytes. ! 114: */ ! 115: size = 128; ! 116: if((base = malloc(size)) == 0){ ! 117: EPR "%s: can't malloc %d bytes for -f %s\n", progname, size, fin); ! 118: exit(2); ! 119: } ! 120: left = size; ! 121: p = base; ! 122: if(xflag){ ! 123: *p++ = '^'; ! 124: left--; ! 125: } ! 126: for(; (n = read(fd, p, left)) > 0;){ ! 127: p += n; ! 128: left -= n; ! 129: if(left == 0){ ! 130: size *= 2; ! 131: if((base = realloc(base, size+2)) == 0){ ! 132: EPR "%s: can't malloc %d bytes for -f %s\n", progname, size, fin); ! 133: exit(2); ! 134: } ! 135: p = base+size/2; ! 136: left = size/2; ! 137: } ! 138: } ! 139: if(n < 0){ ! 140: perror(fin); ! 141: exit(2); ! 142: } ! 143: close(fd); ! 144: if(xflag){ ! 145: *p++ = '$'; ! 146: } ! 147: *beg = (unsigned char *)base; ! 148: *end = (unsigned char *)p; ! 149: } ! 150: ! 151: static void ! 152: gresucc(char *b, char *e) ! 153: { ! 154: if(eg_match(globre, (unsigned char*)b, (unsigned char*)(e-1), (unsigned char **)0, (unsigned char **)0)) ! 155: (*succ2fn)(b, e); ! 156: else ! 157: (*failfn)(b, e); ! 158: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.