Blame


1 e37302c4 2004-04-21 devnull /* lex [-[dynvt]] [file] ... [file] */
2 e37302c4 2004-04-21 devnull
3 e37302c4 2004-04-21 devnull /* Copyright 1976, Bell Telephone Laboratories, Inc.,
4 e37302c4 2004-04-21 devnull written by Eric Schmidt, August 27, 1976 */
5 e37302c4 2004-04-21 devnull
6 e37302c4 2004-04-21 devnull # include "ldefs.h"
7 e37302c4 2004-04-21 devnull Biobuf fout;
8 e37302c4 2004-04-21 devnull int foutopen;
9 e37302c4 2004-04-21 devnull int errorf = 1;
10 e37302c4 2004-04-21 devnull int sect = DEFSECTION;
11 e37302c4 2004-04-21 devnull int prev = '\n'; /* previous input character */
12 e37302c4 2004-04-21 devnull int pres = '\n'; /* present input character */
13 e37302c4 2004-04-21 devnull int peek = '\n'; /* next input character */
14 e37302c4 2004-04-21 devnull uchar *pushptr = pushc;
15 e37302c4 2004-04-21 devnull uchar *slptr = slist;
16 e37302c4 2004-04-21 devnull
17 2c7cc0fa 2004-04-21 devnull char *cname;
18 e37302c4 2004-04-21 devnull
19 e37302c4 2004-04-21 devnull int nine;
20 e37302c4 2004-04-21 devnull int ccount = 1;
21 e37302c4 2004-04-21 devnull int casecount = 1;
22 e37302c4 2004-04-21 devnull int aptr = 1;
23 e37302c4 2004-04-21 devnull int nstates = NSTATES, maxpos = MAXPOS;
24 e37302c4 2004-04-21 devnull int treesize = TREESIZE, ntrans = NTRANS;
25 e37302c4 2004-04-21 devnull int yytop;
26 e37302c4 2004-04-21 devnull int outsize = NOUTPUT;
27 e37302c4 2004-04-21 devnull int sptr = 1;
28 e37302c4 2004-04-21 devnull int report = 2;
29 e37302c4 2004-04-21 devnull int debug; /* 1 = on */
30 e37302c4 2004-04-21 devnull int charc;
31 e37302c4 2004-04-21 devnull int sargc;
32 e37302c4 2004-04-21 devnull char **sargv;
33 e37302c4 2004-04-21 devnull uchar buf[520];
34 e37302c4 2004-04-21 devnull int yyline; /* line number of file */
35 e37302c4 2004-04-21 devnull int eof;
36 e37302c4 2004-04-21 devnull int lgatflg;
37 e37302c4 2004-04-21 devnull int divflg;
38 e37302c4 2004-04-21 devnull int funcflag;
39 e37302c4 2004-04-21 devnull int pflag;
40 e37302c4 2004-04-21 devnull int chset; /* 1 = char set modified */
41 e37302c4 2004-04-21 devnull Biobuf *fin, *fother;
42 e37302c4 2004-04-21 devnull int fptr;
43 e37302c4 2004-04-21 devnull int *name;
44 e37302c4 2004-04-21 devnull int *left;
45 b26eedb6 2006-04-20 devnull uintptr *right;
46 e37302c4 2004-04-21 devnull int *parent;
47 e37302c4 2004-04-21 devnull uchar *nullstr;
48 0afb7989 2006-04-20 devnull uchar **ptr;
49 e37302c4 2004-04-21 devnull int tptr;
50 e37302c4 2004-04-21 devnull uchar pushc[TOKENSIZE];
51 e37302c4 2004-04-21 devnull uchar slist[STARTSIZE];
52 e37302c4 2004-04-21 devnull uchar **def, **subs, *dchar;
53 e37302c4 2004-04-21 devnull uchar **sname, *stchar;
54 e37302c4 2004-04-21 devnull uchar *ccl;
55 e37302c4 2004-04-21 devnull uchar *ccptr;
56 e37302c4 2004-04-21 devnull uchar *dp, *sp;
57 e37302c4 2004-04-21 devnull int dptr;
58 e37302c4 2004-04-21 devnull uchar *bptr; /* store input position */
59 e37302c4 2004-04-21 devnull uchar *tmpstat;
60 e37302c4 2004-04-21 devnull int count;
61 e37302c4 2004-04-21 devnull int **foll;
62 e37302c4 2004-04-21 devnull int *nxtpos;
63 e37302c4 2004-04-21 devnull int *positions;
64 e37302c4 2004-04-21 devnull int *gotof;
65 e37302c4 2004-04-21 devnull int *nexts;
66 e37302c4 2004-04-21 devnull uchar *nchar;
67 e37302c4 2004-04-21 devnull int **state;
68 e37302c4 2004-04-21 devnull int *sfall; /* fallback state num */
69 e37302c4 2004-04-21 devnull uchar *cpackflg; /* true if state has been character packed */
70 e37302c4 2004-04-21 devnull int *atable;
71 e37302c4 2004-04-21 devnull int nptr;
72 e37302c4 2004-04-21 devnull uchar symbol[NCH];
73 e37302c4 2004-04-21 devnull uchar cindex[NCH];
74 e37302c4 2004-04-21 devnull int xstate;
75 e37302c4 2004-04-21 devnull int stnum;
76 e37302c4 2004-04-21 devnull uchar match[NCH];
77 e37302c4 2004-04-21 devnull uchar extra[NACTIONS];
78 e37302c4 2004-04-21 devnull uchar *pchar, *pcptr;
79 e37302c4 2004-04-21 devnull int pchlen = TOKENSIZE;
80 e37302c4 2004-04-21 devnull long rcount;
81 e37302c4 2004-04-21 devnull int *verify, *advance, *stoff;
82 e37302c4 2004-04-21 devnull int scon;
83 e37302c4 2004-04-21 devnull uchar *psave;
84 e37302c4 2004-04-21 devnull
85 e37302c4 2004-04-21 devnull static void free1core(void);
86 e37302c4 2004-04-21 devnull static void free2core(void);
87 e37302c4 2004-04-21 devnull #ifdef DEBUG
88 e37302c4 2004-04-21 devnull static void free3core(void);
89 e37302c4 2004-04-21 devnull #endif
90 e37302c4 2004-04-21 devnull static void get1core(void);
91 e37302c4 2004-04-21 devnull static void get2core(void);
92 e37302c4 2004-04-21 devnull static void get3core(void);
93 e37302c4 2004-04-21 devnull
94 e37302c4 2004-04-21 devnull void
95 e37302c4 2004-04-21 devnull main(int argc, char **argv)
96 e37302c4 2004-04-21 devnull {
97 e37302c4 2004-04-21 devnull int i;
98 e37302c4 2004-04-21 devnull
99 ca82da22 2004-05-17 devnull cname = unsharp("#9/lib/lex.ncform");
100 2c7cc0fa 2004-04-21 devnull
101 e37302c4 2004-04-21 devnull ARGBEGIN {
102 e37302c4 2004-04-21 devnull # ifdef DEBUG
103 e37302c4 2004-04-21 devnull case 'd': debug++; break;
104 e37302c4 2004-04-21 devnull case 'y': yydebug = TRUE; break;
105 e37302c4 2004-04-21 devnull # endif
106 e37302c4 2004-04-21 devnull case 't': case 'T':
107 e37302c4 2004-04-21 devnull Binit(&fout, 1, OWRITE);
108 e37302c4 2004-04-21 devnull errorf= 2;
109 e37302c4 2004-04-21 devnull foutopen = 1;
110 e37302c4 2004-04-21 devnull break;
111 e37302c4 2004-04-21 devnull case 'v': case 'V':
112 e37302c4 2004-04-21 devnull report = 1;
113 e37302c4 2004-04-21 devnull break;
114 e37302c4 2004-04-21 devnull case 'n': case 'N':
115 e37302c4 2004-04-21 devnull report = 0;
116 e37302c4 2004-04-21 devnull break;
117 e37302c4 2004-04-21 devnull case '9':
118 e37302c4 2004-04-21 devnull nine = 1;
119 e37302c4 2004-04-21 devnull break;
120 e37302c4 2004-04-21 devnull default:
121 e37302c4 2004-04-21 devnull warning("Unknown option %c", ARGC());
122 e37302c4 2004-04-21 devnull } ARGEND
123 e37302c4 2004-04-21 devnull sargc = argc;
124 e37302c4 2004-04-21 devnull sargv = argv;
125 e37302c4 2004-04-21 devnull if (argc > 0){
126 e37302c4 2004-04-21 devnull fin = Bopen(argv[fptr++], OREAD);
127 e37302c4 2004-04-21 devnull if(fin == 0)
128 e37302c4 2004-04-21 devnull error ("Can't read input file %s",argv[0]);
129 e37302c4 2004-04-21 devnull sargc--;
130 e37302c4 2004-04-21 devnull sargv++;
131 e37302c4 2004-04-21 devnull }
132 e37302c4 2004-04-21 devnull else {
133 e37302c4 2004-04-21 devnull fin = myalloc(sizeof(Biobuf), 1);
134 e37302c4 2004-04-21 devnull if(fin == 0)
135 e37302c4 2004-04-21 devnull exits("core");
136 e37302c4 2004-04-21 devnull Binit(fin, 0, OREAD);
137 e37302c4 2004-04-21 devnull }
138 e37302c4 2004-04-21 devnull if(Bgetc(fin) == Beof) /* no input */
139 e37302c4 2004-04-21 devnull exits(0);
140 e37302c4 2004-04-21 devnull Bseek(fin, 0, 0);
141 e37302c4 2004-04-21 devnull gch();
142 e37302c4 2004-04-21 devnull /* may be gotten: def, subs, sname, stchar, ccl, dchar */
143 e37302c4 2004-04-21 devnull get1core();
144 e37302c4 2004-04-21 devnull /* may be gotten: name, left, right, nullstr, parent */
145 e37302c4 2004-04-21 devnull strcpy((char*)sp, "INITIAL");
146 e37302c4 2004-04-21 devnull sname[0] = sp;
147 e37302c4 2004-04-21 devnull sp += strlen("INITIAL") + 1;
148 e37302c4 2004-04-21 devnull sname[1] = 0;
149 e37302c4 2004-04-21 devnull if(yyparse()) exits("error"); /* error return code */
150 e37302c4 2004-04-21 devnull /* may be disposed of: def, subs, dchar */
151 e37302c4 2004-04-21 devnull free1core();
152 e37302c4 2004-04-21 devnull /* may be gotten: tmpstat, foll, positions, gotof, nexts, nchar, state, atable, sfall, cpackflg */
153 e37302c4 2004-04-21 devnull get2core();
154 e37302c4 2004-04-21 devnull ptail();
155 e37302c4 2004-04-21 devnull mkmatch();
156 e37302c4 2004-04-21 devnull # ifdef DEBUG
157 e37302c4 2004-04-21 devnull if(debug) pccl();
158 e37302c4 2004-04-21 devnull # endif
159 e37302c4 2004-04-21 devnull sect = ENDSECTION;
160 e37302c4 2004-04-21 devnull if(tptr>0)cfoll(tptr-1);
161 e37302c4 2004-04-21 devnull # ifdef DEBUG
162 e37302c4 2004-04-21 devnull if(debug)pfoll();
163 e37302c4 2004-04-21 devnull # endif
164 e37302c4 2004-04-21 devnull cgoto();
165 e37302c4 2004-04-21 devnull # ifdef DEBUG
166 e37302c4 2004-04-21 devnull if(debug){
167 e37302c4 2004-04-21 devnull print("Print %d states:\n",stnum+1);
168 e37302c4 2004-04-21 devnull for(i=0;i<=stnum;i++)stprt(i);
169 e37302c4 2004-04-21 devnull }
170 e37302c4 2004-04-21 devnull # endif
171 e37302c4 2004-04-21 devnull /* may be disposed of: positions, tmpstat, foll, state, name, left, right, parent, ccl, stchar, sname */
172 e37302c4 2004-04-21 devnull /* may be gotten: verify, advance, stoff */
173 e37302c4 2004-04-21 devnull free2core();
174 e37302c4 2004-04-21 devnull get3core();
175 e37302c4 2004-04-21 devnull layout();
176 e37302c4 2004-04-21 devnull /* may be disposed of: verify, advance, stoff, nexts, nchar,
177 e37302c4 2004-04-21 devnull gotof, atable, ccpackflg, sfall */
178 e37302c4 2004-04-21 devnull # ifdef DEBUG
179 e37302c4 2004-04-21 devnull free3core();
180 e37302c4 2004-04-21 devnull # endif
181 e37302c4 2004-04-21 devnull fother = Bopen(cname,OREAD);
182 e37302c4 2004-04-21 devnull if(fother == 0)
183 e37302c4 2004-04-21 devnull error("Lex driver missing, file %s",cname);
184 e37302c4 2004-04-21 devnull while ( (i=Bgetc(fother)) != Beof)
185 e37302c4 2004-04-21 devnull Bputc(&fout, i);
186 e37302c4 2004-04-21 devnull
187 e37302c4 2004-04-21 devnull Bterm(fother);
188 e37302c4 2004-04-21 devnull Bterm(&fout);
189 e37302c4 2004-04-21 devnull if(
190 e37302c4 2004-04-21 devnull # ifdef DEBUG
191 e37302c4 2004-04-21 devnull debug ||
192 e37302c4 2004-04-21 devnull # endif
193 e37302c4 2004-04-21 devnull report == 1)statistics();
194 c291b2ec 2006-04-20 devnull if(fin)
195 c291b2ec 2006-04-20 devnull Bterm(fin);
196 e37302c4 2004-04-21 devnull exits(0); /* success return code */
197 e37302c4 2004-04-21 devnull }
198 e37302c4 2004-04-21 devnull
199 e37302c4 2004-04-21 devnull static void
200 e37302c4 2004-04-21 devnull get1core(void)
201 e37302c4 2004-04-21 devnull {
202 e37302c4 2004-04-21 devnull ccptr = ccl = myalloc(CCLSIZE,sizeof(*ccl));
203 e37302c4 2004-04-21 devnull pcptr = pchar = myalloc(pchlen, sizeof(*pchar));
204 e37302c4 2004-04-21 devnull def = myalloc(DEFSIZE,sizeof(*def));
205 e37302c4 2004-04-21 devnull subs = myalloc(DEFSIZE,sizeof(*subs));
206 e37302c4 2004-04-21 devnull dp = dchar = myalloc(DEFCHAR,sizeof(*dchar));
207 e37302c4 2004-04-21 devnull sname = myalloc(STARTSIZE,sizeof(*sname));
208 e37302c4 2004-04-21 devnull sp = stchar = myalloc(STARTCHAR,sizeof(*stchar));
209 e37302c4 2004-04-21 devnull if(ccl == 0 || def == 0 || subs == 0 || dchar == 0 || sname == 0 || stchar == 0)
210 e37302c4 2004-04-21 devnull error("Too little core to begin");
211 e37302c4 2004-04-21 devnull }
212 e37302c4 2004-04-21 devnull
213 e37302c4 2004-04-21 devnull static void
214 e37302c4 2004-04-21 devnull free1core(void)
215 e37302c4 2004-04-21 devnull {
216 e37302c4 2004-04-21 devnull free(def);
217 e37302c4 2004-04-21 devnull free(subs);
218 e37302c4 2004-04-21 devnull free(dchar);
219 e37302c4 2004-04-21 devnull }
220 e37302c4 2004-04-21 devnull
221 e37302c4 2004-04-21 devnull static void
222 e37302c4 2004-04-21 devnull get2core(void)
223 e37302c4 2004-04-21 devnull {
224 e37302c4 2004-04-21 devnull int i;
225 e37302c4 2004-04-21 devnull
226 e37302c4 2004-04-21 devnull gotof = myalloc(nstates,sizeof(*gotof));
227 e37302c4 2004-04-21 devnull nexts = myalloc(ntrans,sizeof(*nexts));
228 e37302c4 2004-04-21 devnull nchar = myalloc(ntrans,sizeof(*nchar));
229 e37302c4 2004-04-21 devnull state = myalloc(nstates,sizeof(*state));
230 e37302c4 2004-04-21 devnull atable = myalloc(nstates,sizeof(*atable));
231 e37302c4 2004-04-21 devnull sfall = myalloc(nstates,sizeof(*sfall));
232 e37302c4 2004-04-21 devnull cpackflg = myalloc(nstates,sizeof(*cpackflg));
233 e37302c4 2004-04-21 devnull tmpstat = myalloc(tptr+1,sizeof(*tmpstat));
234 e37302c4 2004-04-21 devnull foll = myalloc(tptr+1,sizeof(*foll));
235 e37302c4 2004-04-21 devnull nxtpos = positions = myalloc(maxpos,sizeof(*positions));
236 e37302c4 2004-04-21 devnull if(tmpstat == 0 || foll == 0 || positions == 0 ||
237 e37302c4 2004-04-21 devnull gotof == 0 || nexts == 0 || nchar == 0 || state == 0 || atable == 0 || sfall == 0 || cpackflg == 0 )
238 e37302c4 2004-04-21 devnull error("Too little core for state generation");
239 e37302c4 2004-04-21 devnull for(i=0;i<=tptr;i++)foll[i] = 0;
240 e37302c4 2004-04-21 devnull }
241 e37302c4 2004-04-21 devnull
242 e37302c4 2004-04-21 devnull static void
243 e37302c4 2004-04-21 devnull free2core(void)
244 e37302c4 2004-04-21 devnull {
245 e37302c4 2004-04-21 devnull free(positions);
246 e37302c4 2004-04-21 devnull free(tmpstat);
247 e37302c4 2004-04-21 devnull free(foll);
248 e37302c4 2004-04-21 devnull free(name);
249 e37302c4 2004-04-21 devnull free(left);
250 e37302c4 2004-04-21 devnull free(right);
251 e37302c4 2004-04-21 devnull free(parent);
252 e37302c4 2004-04-21 devnull free(nullstr);
253 e37302c4 2004-04-21 devnull free(state);
254 e37302c4 2004-04-21 devnull free(sname);
255 e37302c4 2004-04-21 devnull free(stchar);
256 e37302c4 2004-04-21 devnull free(ccl);
257 e37302c4 2004-04-21 devnull }
258 e37302c4 2004-04-21 devnull
259 e37302c4 2004-04-21 devnull static void
260 e37302c4 2004-04-21 devnull get3core(void)
261 e37302c4 2004-04-21 devnull {
262 e37302c4 2004-04-21 devnull verify = myalloc(outsize,sizeof(*verify));
263 e37302c4 2004-04-21 devnull advance = myalloc(outsize,sizeof(*advance));
264 e37302c4 2004-04-21 devnull stoff = myalloc(stnum+2,sizeof(*stoff));
265 e37302c4 2004-04-21 devnull if(verify == 0 || advance == 0 || stoff == 0)
266 e37302c4 2004-04-21 devnull error("Too little core for final packing");
267 e37302c4 2004-04-21 devnull }
268 e37302c4 2004-04-21 devnull # ifdef DEBUG
269 e37302c4 2004-04-21 devnull static void
270 e37302c4 2004-04-21 devnull free3core(void){
271 e37302c4 2004-04-21 devnull free(advance);
272 e37302c4 2004-04-21 devnull free(verify);
273 e37302c4 2004-04-21 devnull free(stoff);
274 e37302c4 2004-04-21 devnull free(gotof);
275 e37302c4 2004-04-21 devnull free(nexts);
276 e37302c4 2004-04-21 devnull free(nchar);
277 e37302c4 2004-04-21 devnull free(atable);
278 e37302c4 2004-04-21 devnull free(sfall);
279 e37302c4 2004-04-21 devnull free(cpackflg);
280 e37302c4 2004-04-21 devnull }
281 e37302c4 2004-04-21 devnull # endif
282 e37302c4 2004-04-21 devnull void *
283 e37302c4 2004-04-21 devnull myalloc(int a, int b)
284 e37302c4 2004-04-21 devnull {
285 e37302c4 2004-04-21 devnull void *i;
286 e37302c4 2004-04-21 devnull i = calloc(a, b);
287 e37302c4 2004-04-21 devnull if(i==0)
288 e37302c4 2004-04-21 devnull warning("OOPS - calloc returns a 0");
289 e37302c4 2004-04-21 devnull return(i);
290 e37302c4 2004-04-21 devnull }
291 e37302c4 2004-04-21 devnull
292 e37302c4 2004-04-21 devnull void
293 e37302c4 2004-04-21 devnull yyerror(char *s)
294 e37302c4 2004-04-21 devnull {
295 e37302c4 2004-04-21 devnull fprint(2, "line %d: %s\n", yyline, s);
296 e37302c4 2004-04-21 devnull }