Research V7 development
[unix-history] / usr / src / cmd / prep / prep0.c
CommitLineData
3760033e
KT
1# include <stdio.h>
2# include "prep.h"
3
4int (*acts[])() = {0,
5 coll,
6 save,
7 ctout,
8 gobble2,
9 hyphen,
10 bsp,
11 bslash,
12 punc
13 };
14
15
16char *ignonl = "/usr/lib/eign";
17
18char 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
73main(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
98pipe:
99 lno = 1;
100
101 driver(argv[i]);
102
103 fclose(fi);
104 }
105 flsh();
106
107 exit(0);
108}
109
110driver(arg)
111char *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
152init()
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
177flags(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}
222compile(fio)
223FILE *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}