Commit | Line | Data |
---|---|---|
3760033e KT |
1 | # include <stdio.h> |
2 | # include "prep.h" | |
3 | ||
4 | int (*acts[])() = {0, | |
5 | coll, | |
6 | save, | |
7 | ctout, | |
8 | gobble2, | |
9 | hyphen, | |
10 | bsp, | |
11 | bslash, | |
12 | punc | |
13 | }; | |
14 | ||
15 | ||
16 | char *ignonl = "/usr/lib/eign"; | |
17 | ||
18 | char tab[NUMS][NUMC] = { | |
19 | ||
20 | /*SKIP*/ | |
21 | 0, 0, 0, 0, 0, 0, 0, 0, | |
22 | 0, 0, 3, 0, 0, 0, 0, 0, | |
23 | 0, 0, 0, 0, 0, 0, 0, 0, | |
24 | 0, 0, 0, 0, 0, 0, 0, 0, | |
25 | 0, 8, 0, 0, 0, 0, 0, 0, | |
26 | 8, 8, 0, 0, 8, 0, 8, 0, | |
27 | 0, 0, 0, 0, 0, 0, 0, 0, | |
28 | 0, 0, 8, 8, 0, 0, 0, 8, | |
29 | 0, 1, 1, 1, 1, 1, 1, 1, | |
30 | 1, 1, 1, 1, 1, 1, 1, 1, | |
31 | 1, 1, 1, 1, 1, 1, 1, 1, | |
32 | 1, 1, 1, 0, 7, 0, 0, 0, | |
33 | 0, 1, 1, 1, 1, 1, 1, 1, | |
34 | 1, 1, 1, 1, 1, 1, 1, 1, | |
35 | 1, 1, 1, 1, 1, 1, 1, 1, | |
36 | 1, 1, 1, 0, 0, 0, 0, 0, | |
37 | /*COLLECT*/ | |
38 | 2, 2, 2, 2, 2, 2, 2, 2, | |
39 | 6, 2, 3, 2, 2, 2, 2, 2, | |
40 | 2, 2, 2, 2, 2, 2, 2, 2, | |
41 | 2, 2, 2, 2, 2, 2, 2, 2, | |
42 | 2, 8, 2, 2, 2, 2, 2, 0, | |
43 | 8, 8, 2, 2, 8, 5, 8, 2, | |
44 | 2, 2, 2, 2, 2, 2, 2, 2, | |
45 | 2, 2, 8, 8, 2, 2, 2, 8, | |
46 | 2, 0, 0, 0, 0, 0, 0, 0, | |
47 | 0, 0, 0, 0, 0, 0, 0, 0, | |
48 | 0, 0, 0, 0, 0, 0, 0, 0, | |
49 | 0, 0, 0, 2, 7, 2, 2, 2, | |
50 | 2, 0, 0, 0, 0, 0, 0, 0, | |
51 | 0, 0, 0, 0, 0, 0, 0, 0, | |
52 | 0, 0, 0, 0, 0, 0, 0, 0, | |
53 | 0, 0, 0, 2, 2, 2, 2, 2, | |
54 | /*SKIP2*/ | |
55 | 0, 0, 0, 0, 0, 0, 0, 0, | |
56 | 0, 0, 3, 0, 0, 0, 0, 0, | |
57 | 0, 0, 0, 0, 0, 0, 0, 0, | |
58 | 0, 0, 0, 0, 0, 0, 0, 0, | |
59 | 0, 8, 0, 0, 0, 0, 0, 0, | |
60 | 8, 8, 0, 0, 8, 0, 8, 0, | |
61 | 0, 0, 0, 0, 0, 0, 0, 0, | |
62 | 0, 0, 8, 8, 0, 0, 0, 8, | |
63 | 0, 1, 1, 1, 1, 1, 1, 1, | |
64 | 1, 1, 1, 1, 1, 1, 1, 1, | |
65 | 1, 1, 1, 1, 1, 1, 1, 1, | |
66 | 1, 1, 1, 0, 0, 0, 0, 0, | |
67 | 0, 1, 1, 1, 1, 1, 1, 1, | |
68 | 1, 1, 1, 1, 1, 1, 1, 1, | |
69 | 1, 1, 1, 1, 1, 1, 1, 1, | |
70 | 1, 1, 1, 0, 0, 0, 0, 0 | |
71 | }; | |
72 | ||
73 | main(argc,argv) | |
74 | char *argv[]; | |
75 | { | |
76 | auto i,j; | |
77 | ||
78 | if(argc > 1 && *argv[1] == '-') { | |
79 | j = flags(argv); | |
80 | argv += j; | |
81 | argc -= j; | |
82 | } | |
83 | ||
84 | init(); | |
85 | ||
86 | i = 0; | |
87 | if(argc == 1) { | |
88 | fi = stdin; | |
89 | goto pipe; | |
90 | } | |
91 | while(++i < argc) { | |
92 | ||
93 | if((fi = fopen(argv[i], "r")) == NULL) { | |
94 | fprintf(stderr, "Can't open %s\n",argv[i]); | |
95 | exit(1); | |
96 | } | |
97 | ||
98 | pipe: | |
99 | lno = 1; | |
100 | ||
101 | driver(argv[i]); | |
102 | ||
103 | fclose(fi); | |
104 | } | |
105 | flsh(); | |
106 | ||
107 | exit(0); | |
108 | } | |
109 | ||
110 | driver(arg) | |
111 | char *arg; | |
112 | { | |
113 | auto p; | |
114 | ||
115 | l = -1; | |
116 | while((c = line[++l] = getc(fi)) != -1) { | |
117 | /* fprintf(stderr, "driver: c = %o l = %d\n",c,l); /*DEBUG*/ | |
118 | if(l >= 299) { | |
119 | lflag++; | |
120 | l--; | |
121 | } | |
122 | ||
123 | if(c & 0200) { | |
124 | fprintf(stderr, "Illegal character: %o line %d file %s\n", | |
125 | c, lno, arg); | |
126 | exit(1); | |
127 | } | |
128 | ||
129 | if(l == 0 && (c == '.' || c == '\'')) { | |
130 | while((c = getc(fi)) != '\n' ) | |
131 | if(c == -1) return; | |
132 | lno++; | |
133 | l = -1; | |
134 | continue; | |
135 | } | |
136 | ||
137 | if(fl) { | |
138 | if((*flag[fl])()) | |
139 | continue; | |
140 | } | |
141 | ||
142 | /*fprintf(stderr, "cs = %d cc = %c ca = %d\n",cs,c,tab[cs][c]); /*DEBUG*/ | |
143 | ||
144 | if(p = tab[cs][c]) | |
145 | (*acts[p])(); | |
146 | continue; | |
147 | } | |
148 | return; | |
149 | ||
150 | } | |
151 | ||
152 | init() | |
153 | { | |
154 | FILE *fio, *fopen(); | |
155 | extern coll(),save(),ctout(),asym(),asw(),csym(),csw(); | |
156 | extern incl(),decl(),sk(),sk2(); | |
157 | ||
158 | ||
159 | if(!igflg)return; | |
160 | ||
161 | itab.hptr = ipsp; | |
162 | itab.symt = issp; | |
163 | itab.hsiz = PTRI; | |
164 | itab.ssiz = CHARI; | |
165 | itab.nsym = 0; | |
166 | itab.curb = 1; | |
167 | ||
168 | if((fio = fopen(ignonl, "r")) == NULL) { | |
169 | fprintf(stderr, "Cannot open ignore/only file.\n"); | |
170 | exit(1); | |
171 | } | |
172 | compile(fio); | |
173 | return; | |
174 | } | |
175 | ||
176 | ||
177 | flags(argv) | |
178 | char *argv[]; | |
179 | { | |
180 | int j; | |
181 | char *ap; | |
182 | ||
183 | j = 1; | |
184 | ap = argv[1]; | |
185 | while(*++ap != '\0') { | |
186 | switch(*ap) { | |
187 | ||
188 | default: | |
189 | fprintf(stderr, "Unrecognized flag: %c\n",*ap); | |
190 | exit(1); | |
191 | ||
192 | ||
193 | case 'i': /* Ignore file */ | |
194 | if(!igflg) { | |
195 | igflg = 1; | |
196 | only = 0; | |
197 | ignonl = argv[++j]; | |
198 | } | |
199 | continue; | |
200 | ||
201 | case 'o': /*only file*/ | |
202 | if(!igflg) { | |
203 | igflg = 1; | |
204 | only = 1; | |
205 | ignonl = argv[++j]; | |
206 | } | |
207 | continue; | |
208 | case 'd': /*word number*/ | |
209 | wdflg = 1; | |
210 | wdnum = 0; | |
211 | num[WIDTH] = ' '; | |
212 | continue; | |
213 | ||
214 | case 'p': | |
215 | puncfl = 1; | |
216 | continue; | |
217 | } | |
218 | ||
219 | } | |
220 | return(j); | |
221 | } | |
222 | compile(fio) | |
223 | FILE *fio; | |
224 | { | |
225 | char buf[40],*b; | |
226 | int i,v; | |
227 | ||
228 | ||
229 | b = buf - 1; | |
230 | while((i = *++b = getc(fio)) != EOF) { | |
231 | if(*b == '\n') { | |
232 | *b = '\0'; | |
233 | search(buf,b - buf,&itab,1); | |
234 | b = buf - 1; | |
235 | } else { | |
236 | if(*b == '\t') { | |
237 | v = 0; | |
238 | while((i = getc(fio)) != -1) { | |
239 | if(i == '\n') break; | |
240 | v = v*10 + (i - '0'); | |
241 | } | |
242 | search(buf,b - buf,&itab,v); | |
243 | b = buf - 1; | |
244 | } else { | |
245 | if((b - buf) > 39) { | |
246 | fprintf(stderr, "Ignore/only symbol too long.\n"); | |
247 | exit(1); | |
248 | } | |
249 | } | |
250 | } | |
251 | } | |
252 | return; | |
253 | } |