|
|
1.1 root 1: #include <string.h>
2: #include <stdio.h>
3: #if defined(__STDC__) || defined(c_plusplus) || defined(__cplusplus)
4: #include <stdlib.h>
5: #endif
6: #include "re.h"
7:
8: #ifdef MAIN
9:
10: main(argc, argv)
11: char **argv;
12: {
13: Expr *re;
14: re_re *r;
15: char *pat;
16: FILE *tmp;
17: char *tmpn;
18: extern char *tmpnam();
19: char e1[4096], e2[4096];
20: unsigned char map[256];
21: int n;
22:
23: if(argc != 2){
24: fprintf(stderr, "Usage: efile pattern\n");
25: exit(1);
26: }
27: pat = argv[1];
28: for(n = 0; n < 256; n++)
29: map[n] = n;
30: r = re_recomp(pat, pat+strlen(pat), map);
31: if(r == 0)
32: exit(1);
33: re = r->root;
34: tmpn = tmpnam((char *)0);
35: if((tmp = fopen(tmpn, "w+r")) == NULL){
36: perror(tmpn);
37: exit(1);
38: }
39: eg_epr(re, e1, 0);
40: re_refile(r, tmp);
41: rewind(tmp);
42: r = re_filere(tmp);
43: eg_epr(r->root, e2, 0);
44: if(strcmp(e1, e2))
45: printf("MISMATCH!!\nbefore:\n%s\nafter:\n%s\n", e1, e2);
46: else
47: printf("ok\n");
48: re_refree(r);
49: exit(0);
50: }
51: #else
52:
53: #include "lre.h"
54:
55: #if defined(__STDC__) || defined(c_plusplus) || defined(__cplusplus)
56: static void etofile(Expr *, FILE *);
57: static Expr *filetoe(FILE *);
58: #else
59: static void etofile();
60: static Expr *filetoe();
61: #endif
62:
63: #define REVERSION 2
64:
65: void
66: re_refile(re_re *re, FILE *fp)
67: {
68: if(re == 0)
69: return;
70: if(putc(REVERSION, fp) != REVERSION){
71: re_error("couldn't write version");
72: return;
73: }
74: if(fwrite(re->mymap, 256, 1, fp) != 1){
75: re_error("couldn't write char map");
76: return;
77: }
78: putw(re->carat, fp);
79: etofile(re->root, fp);
80: }
81:
82: static void
83: etofile(Expr *e, FILE *fp)
84: {
85: Expr ee;
86:
87: if(e == 0){
88: e = ⅇ
89: e->type = Null;
90: }
91: putw(e->type, fp);
92: putw(e->lit, fp);
93: putc(e->backref, fp);
94: putc(e->parens, fp);
95: switch(e->type)
96: {
97: case Null:
98: case Literal:
99: case Dot:
100: case Carat:
101: case Dollar:
102: case Backref:
103: break;
104: case Compcharclass:
105: case Charclass:
106: putw((int)e->l, fp);
107: fwrite((char *)e->r, (int)e->l, 1, fp);
108: break;
109: case Cat:
110: case Alternate:
111: etofile(e->l, fp);
112: etofile(e->r, fp);
113: break;
114: case Star:
115: case Plus:
116: case Quest:
117: case Group:
118: case EOP:
119: etofile(e->l, fp);
120: break;
121: }
122: }
123:
124: re_re *
125: re_filere(FILE *fp)
126: {
127: register re_re *r;
128:
129: r = (re_re *)egmalloc(sizeof (re_re), "allocating re_re");
130: if(r == 0)
131: return(0);
132: memset((char *)r, 0, sizeof (re_re));
133: if(getc(fp) != REVERSION){
134: re_error("read bad version number");
135: goto err;
136: }
137: if(fread(r->mymap, 256, 1, fp) != 1){
138: re_error("couldn't read char map");
139: goto err;
140: }
141: r->carat = getw(fp);
142: eg_lexinit((char *)0, (char *)0);
143: if((r->root = filetoe(fp)) == 0){
144: err:
145: free((char *)r);
146: return(0);
147: }
148: egpost(r);
149: if(r->backref || r->parens)
150: egbr(r);
151: else
152: eginit(r, r->carat);
153: return(r);
154: }
155:
156: static Expr *
157: filetoe(FILE *fp)
158: {
159: Expr *ee, *er, *el, *ret;
160: int t, l;
161: Exprtype et;
162: char res[256];
163: int br, parens;
164:
165: t = getw(fp);
166: if((t == EOF) && feof(fp))
167: return(0);
168: et = (Exprtype)t;
169: l = getw(fp);
170: br = getc(fp);
171: parens = getc(fp);
172: switch(et)
173: {
174: case Null:
175: return(0);
176: case Literal:
177: case Dot:
178: case Carat:
179: case Dollar:
180: case Backref:
181: ret = eg_newexpr(et, l, (Expr *)0, (Expr *)0);
182: break;
183: case Compcharclass:
184: case Charclass:
185: ee = eg_newexpr(et, l, (Expr *)0, (Expr *)0);
186: l = getw(fp);
187: ee->r = (Expr *)egmalloc(l, "filetoe copy");
188: if (!ee->r)
189: return 0;
190: ee->l = (Expr *)l;
191: fread((char *)ee->r, l, 1, fp);
192: ret = ee;
193: break;
194: case Cat:
195: case Alternate:
196: el = filetoe(fp);
197: er = filetoe(fp);
198: ret = eg_newexpr(et, l, el, er);
199: break;
200: case Star:
201: case Plus:
202: case Quest:
203: case Group:
204: case EOP:
205: el = filetoe(fp);
206: ret = eg_newexpr(et, l, el, (Expr *)0);
207: break;
208: default:
209: SPR res, "<reading expr undef type %d lit=%d>", t, l);
210: re_error(res);
211: return((Expr *)0);
212: }
213: ret->backref = br;
214: ret->parens = parens;
215: return(ret);
216: }
217: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.