|
|
1.1 root 1: #include <ctype.h>
2: #include "re.h"
3: #include "lre.h"
4: #include "hdr.h"
5:
6: static int addwords(char*, re_cw*, unsigned char**, unsigned char**);
7:
8: void
9: dofgrep(char *input, char *finput, unsigned char *map, PROCFN *pprocfn, void **pat, RDFN *prdfn, MATCHFN *pmatchfn)
10: {
11: unsigned char *lb, *le;
12: int nwords, k;
13: re_cw *cw;
14:
15: *pat = (void *)(cw = re_cwinit(map));
16: if(finput){
17: nwords = addwords(finput, cw, &lb, &le);
18: } else {
19: register unsigned char *s, *e;
20:
21: nwords = 0;
22: s = (unsigned char *)input;
23: while(*s){
24: char ch;
25:
26: for(e = s; *e && (*e != '\n'); e++)
27: ;
28: ch = *e;
29: if(xflag){
30: s[-1] = '\n';
31: *e = '\n';
32: re_cwadd(cw, (lb = s)-1, (le = e)+1);
33: *e = ch;
34: } else
35: re_cwadd(cw, lb = s, le = e);
36: s = *e? (e+1):e;
37: nwords++;
38: }
39: if(nwords == 1){
40: s = (unsigned char *)malloc(1 + (k = le-lb));
41: if (!s){
42: re_error("malloc failure");
43: cw->seenerror = 1;
44: return;
45: }
46: memmove((char *)s, (char *)lb, k);
47: lb = s;
48: le = s+k;
49: if(xflag)
50: *le++ = '\n';
51: }
52: }
53: if(nwords == 1){
54: *pat = (void *)re_bmcomp((char *)lb, (char *)le, map);
55: *pprocfn = re_bmexec;
56: *prdfn = greprd;
57: *pmatchfn = xflag ? bmxmatch : grepmatch;
58: } else {
59: re_cwcomp(cw);
60: *pprocfn = re_cwexec;
61: *prdfn = xflag? cwxrd : greprd;
62: *pmatchfn = xflag ? cwxmatch : grepmatch;
63: }
64: if(sflag || lflag || Lflag || oneflag){
65: if(vflag == 0)
66: succfn = oneshot, failfn = count_m;
67: else
68: succfn = count, failfn = oneshot;
69: } else if(cflag){
70: if(vflag == 0)
71: succfn = inc, failfn = null;
72: else
73: succfn = null, failfn = inc_m;
74: } else if(vflag){
75: if(bflag||nflag)
76: succfn = count;
77: else
78: succfn = null;
79: failfn = pr_m;
80: } else {
81: succfn = pr;
82: if(bflag||nflag)
83: failfn = count_m;
84: else
85: failfn = null;
86: }
87: }
88:
89: static
90: addwords(char *file, re_cw *pat, unsigned char **b, unsigned char **e)
91: {
92: unsigned char rbuf[MAXLINE+2];
93: unsigned char *buf = rbuf+1;
94: int fd;
95: int nwords = 0, eof, k;
96: register unsigned char *nl, *nn, *end;
97:
98: if((fd = open(file, 0)) < 0){
99: perror(file);
100: exit(2);
101: }
102: rbuf[0] = '\n';
103: nl = end = buf+1;
104: eof = 0;
105: for(;;){
106: if((nn = (unsigned char *)memchr((char *)nl, '\n', end-nl)) == 0){
107: if(nl == buf){
108: EPR "line too long in %s\n", file);
109: exit(2);
110: }
111: memmove((char *)buf, (char *)nl, end-nl);
112: end -= nl-buf;
113: nl = buf;
114: k = read(fd, (char *)end, &buf[MAXLINE]-end);
115: if(k > 0){
116: end += k;
117: continue;
118: } else if(k == 0){
119: if(nl == end) /* clean read to end of file */
120: break;
121: eof = 1;
122: *end++ = '\n';
123: continue;
124: } else {
125: perror(file);
126: exit(2);
127: }
128: }
129: if(xflag)
130: re_cwadd(pat, nl-1, nn+1);
131: else
132: re_cwadd(pat, nl, nn);
133: nl = nn+1;
134: nwords++;
135: if(eof)
136: break;
137: }
138: close(fd);
139: if(nwords == 1){
140: k = strlen((char *)buf)-1;
141: *b = (unsigned char *)malloc(k+1);
142: if (!*b){
143: re_error("malloc failed");
144: pat->seenerror = 1;
145: return 0;
146: }
147: memmove((char *)*b, (char *)buf, k);
148: if(xflag)
149: (*b)[k++] = '\n';
150: *e = *b + k;
151: }
152: return(nwords);
153: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.