|
|
1.1 root 1: #include "re.h"
2: #include <string.h>
3: #include <stdio.h>
4:
5: etofile(e, fp)
6: Expr *e;
7: FILE *fp;
8: {
9: Expr ee;
10: char res[256];
11:
12: if(e == 0){
13: e = ⅇ
14: e->type = Null;
15: }
16: putw(e->type, fp);
17: putw(e->lit, fp);
18: switch(e->type)
19: {
20: case Null:
21: case Literal:
22: case Dot:
23: case Carat:
24: case Dollar:
25: case Backref:
26: break;
27: case Compcharclass:
28: case Charclass:
29: putw((int)e->l, fp);
30: fwrite((char *)e->r, (int)e->l, 1, fp);
31: break;
32: case Cat:
33: case Alternate:
34: etofile(e->l, fp);
35: etofile(e->r, fp);
36: break;
37: case Star:
38: case Plus:
39: case Quest:
40: case Group:
41: case EOP:
42: etofile(e->l, fp);
43: break;
44: }
45: }
46:
47: Expr *
48: filetoe(fp)
49: FILE *fp;
50: {
51: Expr *ee, *er, *el;
52: int t, l;
53: char res[256];
54:
55: t = getw(fp);
56: if((t == EOF) && feof(fp))
57: return(0);
58: l = getw(fp);
59: switch(t)
60: {
61: case Null:
62: return(0);
63: case Literal:
64: case Dot:
65: case Carat:
66: case Dollar:
67: case Backref:
68: return(eg_newexpr(t, l, (Expr *)0, (Expr *)0));
69: case Compcharclass:
70: case Charclass:
71: ee = eg_newexpr(t, l, (Expr *)0, (Expr *)0);
72: l = getw(fp);
73: ee->r = (Expr *)egmalloc(l, "filetoe copy");
74: ee->l = (Expr *)l;
75: fread((char *)ee->r, l, 1, fp);
76: return(ee);
77: case Cat:
78: case Alternate:
79: el = filetoe(fp);
80: er = filetoe(fp);
81: return(eg_newexpr(t, l, el, er));
82: case Star:
83: case Plus:
84: case Quest:
85: case Group:
86: case EOP:
87: el = filetoe(fp);
88: return(eg_newexpr(t, l, el, (Expr *)0));
89: default:
90: SPR res, "<reading expr undef type %d lit=%d>", t, l);
91: re_error(res);
92: return((Expr *)0);
93: }
94: }
95:
96: #ifdef MAIN
97: #include <tmpnam.h>
98:
99: main(argc, argv)
100: char **argv;
101: {
102: Expr *re;
103: re_re *r;
104: char *pat;
105: FILE *tmp;
106: char *tmpn;
107: extern char *tmpnam();
108: char e1[4096], e2[4096];
109: unsigned char map[256];
110: int n;
111:
112: if(argc != 2){
113: fprintf(stderr, "Usage: efile pattern\n");
114: exit(1);
115: }
116: pat = argv[1];
117: for(n = 0; n < 256; n++)
118: map[n] = n;
119: r = re_recomp(pat, pat+strlen(pat), map);
120: if(r == 0)
121: exit(1);
122: re = r->root;
123: tmpn = tmpnam((char *)0);
124: if((tmp = fopen(tmpn, "w+r")) == NULL){
125: perror(tmpn);
126: exit(1);
127: }
128: eg_epr(re, e1, 0);
129: etofile(re, tmp);
130: rewind(tmp);
131: re = filetoe(tmp);
132: eg_epr(re, e2, 0);
133: if(strcmp(e1, e2))
134: printf("MISMATCH!!\nbefore:\n%s\nafter:\n%s\n", e1, e2);
135: else
136: printf("ok\n");
137: re_refree(r);
138: exit(0);
139: }
140: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.