1 8ad51794 2004-03-25 devnull #include "grep.h"
4 8ad51794 2004-03-25 devnull mal(int n)
6 8ad51794 2004-03-25 devnull static char *s;
7 8ad51794 2004-03-25 devnull static int m = 0;
10 8ad51794 2004-03-25 devnull n = (n+3) & ~3;
11 8ad51794 2004-03-25 devnull if(m < n) {
12 8ad51794 2004-03-25 devnull if(n > Nhunk) {
13 8ad51794 2004-03-25 devnull v = sbrk(n);
14 8ad51794 2004-03-25 devnull memset(v, 0, n);
15 8ad51794 2004-03-25 devnull return v;
17 8ad51794 2004-03-25 devnull s = sbrk(Nhunk);
18 8ad51794 2004-03-25 devnull m = Nhunk;
23 8ad51794 2004-03-25 devnull memset(v, 0, n);
24 8ad51794 2004-03-25 devnull return v;
28 8ad51794 2004-03-25 devnull sal(int n)
30 8ad51794 2004-03-25 devnull State *s;
32 8ad51794 2004-03-25 devnull s = mal(sizeof(*s));
33 cbeb0b26 2006-04-01 devnull /* s->next = mal(256*sizeof(*s->next)); */
34 8ad51794 2004-03-25 devnull s->count = n;
35 8ad51794 2004-03-25 devnull s->re = mal(n*sizeof(*state0->re));
36 8ad51794 2004-03-25 devnull return s;
40 8ad51794 2004-03-25 devnull ral(int type)
44 8ad51794 2004-03-25 devnull r = mal(sizeof(*r));
45 8ad51794 2004-03-25 devnull r->type = type;
46 8ad51794 2004-03-25 devnull maxfollow++;
47 8ad51794 2004-03-25 devnull return r;
51 8ad51794 2004-03-25 devnull error(char *s)
53 8ad51794 2004-03-25 devnull fprint(2, "grep: internal error: %s\n", s);
54 8ad51794 2004-03-25 devnull exits(s);
58 8ad51794 2004-03-25 devnull countor(Re *r)
64 8ad51794 2004-03-25 devnull switch(r->type) {
65 8ad51794 2004-03-25 devnull case Tor:
66 285b4f85 2004-03-25 devnull n += countor(r->u.alt);
67 8ad51794 2004-03-25 devnull r = r->next;
68 8ad51794 2004-03-25 devnull goto loop;
69 8ad51794 2004-03-25 devnull case Tclass:
70 285b4f85 2004-03-25 devnull return n + r->u.x.hi - r->u.x.lo + 1;
72 8ad51794 2004-03-25 devnull return n;
76 8ad51794 2004-03-25 devnull oralloc(int t, Re *r, Re *b)
80 8ad51794 2004-03-25 devnull if(b == 0)
81 8ad51794 2004-03-25 devnull return r;
82 8ad51794 2004-03-25 devnull a = ral(t);
83 285b4f85 2004-03-25 devnull a->u.alt = r;
84 8ad51794 2004-03-25 devnull a->next = b;
85 8ad51794 2004-03-25 devnull return a;
89 8ad51794 2004-03-25 devnull case1(Re *c, Re *r)
94 8ad51794 2004-03-25 devnull switch(r->type) {
95 8ad51794 2004-03-25 devnull case Tor:
96 285b4f85 2004-03-25 devnull case1(c, r->u.alt);
97 8ad51794 2004-03-25 devnull r = r->next;
98 8ad51794 2004-03-25 devnull goto loop;
100 8ad51794 2004-03-25 devnull case Tclass: /* add to character */
101 285b4f85 2004-03-25 devnull for(n=r->u.x.lo; n<=r->u.x.hi; n++)
102 285b4f85 2004-03-25 devnull c->u.cases[n] = oralloc(Tor, r->next, c->u.cases[n]);
105 8ad51794 2004-03-25 devnull default: /* add everything unknown to next */
106 8ad51794 2004-03-25 devnull c->next = oralloc(Talt, r, c->next);
112 8ad51794 2004-03-25 devnull addcase(Re *r)
114 8ad51794 2004-03-25 devnull int i, n;
117 8ad51794 2004-03-25 devnull if(r->gen == gen)
118 8ad51794 2004-03-25 devnull return r;
119 8ad51794 2004-03-25 devnull r->gen = gen;
120 8ad51794 2004-03-25 devnull switch(r->type) {
121 8ad51794 2004-03-25 devnull default:
122 8ad51794 2004-03-25 devnull error("addcase");
124 8ad51794 2004-03-25 devnull case Tor:
125 8ad51794 2004-03-25 devnull n = countor(r);
126 8ad51794 2004-03-25 devnull if(n >= Caselim) {
127 8ad51794 2004-03-25 devnull a = ral(Tcase);
128 285b4f85 2004-03-25 devnull a->u.cases = mal(256*sizeof(*a->u.cases));
129 8ad51794 2004-03-25 devnull case1(a, r);
130 8ad51794 2004-03-25 devnull for(i=0; i<256; i++)
131 285b4f85 2004-03-25 devnull if(a->u.cases[i]) {
132 285b4f85 2004-03-25 devnull r = a->u.cases[i];
133 8ad51794 2004-03-25 devnull if(countor(r) < n)
134 285b4f85 2004-03-25 devnull a->u.cases[i] = addcase(r);
136 8ad51794 2004-03-25 devnull return a;
138 8ad51794 2004-03-25 devnull return r;
140 8ad51794 2004-03-25 devnull case Talt:
141 8ad51794 2004-03-25 devnull r->next = addcase(r->next);
142 285b4f85 2004-03-25 devnull r->u.alt = addcase(r->u.alt);
143 8ad51794 2004-03-25 devnull return r;
145 8ad51794 2004-03-25 devnull case Tbegin:
146 8ad51794 2004-03-25 devnull case Tend:
147 8ad51794 2004-03-25 devnull case Tclass:
148 8ad51794 2004-03-25 devnull return r;
153 8ad51794 2004-03-25 devnull str2top(char *p)
155 8ad51794 2004-03-25 devnull Re2 oldtop;
157 8ad51794 2004-03-25 devnull oldtop = topre;
158 8ad51794 2004-03-25 devnull input = p;
159 8ad51794 2004-03-25 devnull topre.beg = 0;
160 8ad51794 2004-03-25 devnull topre.end = 0;
161 8ad51794 2004-03-25 devnull yyparse();
163 8ad51794 2004-03-25 devnull if(topre.beg == 0)
164 8ad51794 2004-03-25 devnull yyerror("syntax");
165 8ad51794 2004-03-25 devnull if(oldtop.beg)
166 8ad51794 2004-03-25 devnull topre = re2or(oldtop, topre);
170 8ad51794 2004-03-25 devnull appendnext(Re *a, Re *b)
174 8ad51794 2004-03-25 devnull while(n = a->next)
176 8ad51794 2004-03-25 devnull a->next = b;
180 8ad51794 2004-03-25 devnull patchnext(Re *a, Re *b)
184 8ad51794 2004-03-25 devnull while(a) {
185 8ad51794 2004-03-25 devnull n = a->next;
186 8ad51794 2004-03-25 devnull a->next = b;
192 8ad51794 2004-03-25 devnull getrec(void)
196 8ad51794 2004-03-25 devnull if(flags['f']) {
197 8ad51794 2004-03-25 devnull c = Bgetc(rein);
198 8ad51794 2004-03-25 devnull if(c <= 0)
199 8ad51794 2004-03-25 devnull return 0;
201 8ad51794 2004-03-25 devnull c = *input++ & 0xff;
202 8ad51794 2004-03-25 devnull if(flags['i'] && c >= 'A' && c <= 'Z')
203 8ad51794 2004-03-25 devnull c += 'a'-'A';
204 8ad51794 2004-03-25 devnull if(c == '\n')
205 8ad51794 2004-03-25 devnull lineno++;
206 8ad51794 2004-03-25 devnull return c;
210 8ad51794 2004-03-25 devnull re2cat(Re2 a, Re2 b)
214 8ad51794 2004-03-25 devnull c.beg = a.beg;
215 8ad51794 2004-03-25 devnull c.end = b.end;
216 8ad51794 2004-03-25 devnull patchnext(a.end, b.beg);
217 8ad51794 2004-03-25 devnull return c;
221 8ad51794 2004-03-25 devnull re2star(Re2 a)
225 8ad51794 2004-03-25 devnull c.beg = ral(Talt);
226 285b4f85 2004-03-25 devnull c.beg->u.alt = a.beg;
227 8ad51794 2004-03-25 devnull patchnext(a.end, c.beg);
228 8ad51794 2004-03-25 devnull c.end = c.beg;
229 8ad51794 2004-03-25 devnull return c;
233 8ad51794 2004-03-25 devnull re2or(Re2 a, Re2 b)
237 8ad51794 2004-03-25 devnull c.beg = ral(Tor);
238 285b4f85 2004-03-25 devnull c.beg->u.alt = b.beg;
239 8ad51794 2004-03-25 devnull c.beg->next = a.beg;
240 8ad51794 2004-03-25 devnull c.end = b.end;
241 8ad51794 2004-03-25 devnull appendnext(c.end, a.end);
242 8ad51794 2004-03-25 devnull return c;
246 8ad51794 2004-03-25 devnull re2char(int c0, int c1)
250 8ad51794 2004-03-25 devnull c.beg = ral(Tclass);
251 285b4f85 2004-03-25 devnull c.beg->u.x.lo = c0 & 0xff;
252 285b4f85 2004-03-25 devnull c.beg->u.x.hi = c1 & 0xff;
253 8ad51794 2004-03-25 devnull c.end = c.beg;
254 8ad51794 2004-03-25 devnull return c;
258 8ad51794 2004-03-25 devnull reprint1(Re *a)
260 8ad51794 2004-03-25 devnull int i, j;
263 8ad51794 2004-03-25 devnull if(a == 0)
265 8ad51794 2004-03-25 devnull if(a->gen == gen)
267 8ad51794 2004-03-25 devnull a->gen = gen;
268 8ad51794 2004-03-25 devnull print("%p: ", a);
269 8ad51794 2004-03-25 devnull switch(a->type) {
270 8ad51794 2004-03-25 devnull default:
271 8ad51794 2004-03-25 devnull print("type %d\n", a->type);
272 8ad51794 2004-03-25 devnull error("print1 type");
274 8ad51794 2004-03-25 devnull case Tcase:
275 8ad51794 2004-03-25 devnull print("case ->%p\n", a->next);
276 8ad51794 2004-03-25 devnull for(i=0; i<256; i++)
277 285b4f85 2004-03-25 devnull if(a->u.cases[i]) {
278 8ad51794 2004-03-25 devnull for(j=i+1; j<256; j++)
279 285b4f85 2004-03-25 devnull if(a->u.cases[i] != a->u.cases[j])
281 285b4f85 2004-03-25 devnull print(" [%.2x-%.2x] ->%p\n", i, j-1, a->u.cases[i]);
282 8ad51794 2004-03-25 devnull i = j-1;
284 8ad51794 2004-03-25 devnull for(i=0; i<256; i++)
285 285b4f85 2004-03-25 devnull reprint1(a->u.cases[i]);
288 8ad51794 2004-03-25 devnull case Tbegin:
289 8ad51794 2004-03-25 devnull print("^ ->%p\n", a->next);
292 8ad51794 2004-03-25 devnull case Tend:
293 8ad51794 2004-03-25 devnull print("$ ->%p\n", a->next);
296 8ad51794 2004-03-25 devnull case Tclass:
297 285b4f85 2004-03-25 devnull print("[%.2x-%.2x] ->%p\n", a->u.x.lo, a->u.x.hi, a->next);
300 8ad51794 2004-03-25 devnull case Tor:
301 8ad51794 2004-03-25 devnull case Talt:
302 285b4f85 2004-03-25 devnull print("| %p ->%p\n", a->u.alt, a->next);
303 285b4f85 2004-03-25 devnull reprint1(a->u.alt);
306 8ad51794 2004-03-25 devnull a = a->next;
307 8ad51794 2004-03-25 devnull goto loop;
311 8ad51794 2004-03-25 devnull reprint(char *s, Re *r)
313 8ad51794 2004-03-25 devnull print("%s:\n", s);
315 8ad51794 2004-03-25 devnull reprint1(r);
316 8ad51794 2004-03-25 devnull print("\n\n");