Commit | Line | Data |
---|---|---|
a5423a97 | 1 | #ifndef lint |
35b3a500 | 2 | static char sccsid[] = "@(#)lmain.c 4.3 (Berkeley) %G%"; |
a5423a97 SL |
3 | #endif |
4 | ||
5 | # include "ldefs.c" | |
6 | # include "once.c" | |
7 | ||
8 | /* lex [-[drcyvntf]] [file] ... [file] */ | |
9 | ||
10 | /* Copyright 1976, Bell Telephone Laboratories, Inc., | |
11 | written by Eric Schmidt, August 27, 1976 */ | |
12 | ||
13 | main(argc,argv) | |
14 | int argc; | |
15 | char **argv; { | |
16 | register int i; | |
17 | # ifdef DEBUG | |
18 | #include <signal.h> | |
19 | signal(SIGBUS,buserr); | |
20 | signal(SIGSEGV,segviol); | |
21 | # endif | |
22 | while (argc > 1 && argv[1][0] == '-' ){ | |
23 | i = 0; | |
24 | while(argv[1][++i]){ | |
25 | switch (argv[1][i]){ | |
26 | # ifdef DEBUG | |
27 | case 'd': debug++; break; | |
28 | case 'y': yydebug = TRUE; break; | |
29 | # endif | |
30 | case 'r': case 'R': | |
31 | ratfor=TRUE; break; | |
32 | case 'c': case 'C': | |
33 | ratfor=FALSE; break; | |
34 | case 't': case 'T': | |
35 | fout = stdout; | |
36 | errorf = stderr; | |
37 | break; | |
38 | case 'v': case 'V': | |
39 | report = 1; | |
40 | break; | |
41 | case 'f': case 'F': | |
42 | optim = FALSE; | |
43 | break; | |
44 | case 'n': case 'N': | |
45 | report = 0; | |
46 | break; | |
47 | default: | |
48 | warning("Unknown option %c",argv[1][i]); | |
49 | } | |
50 | } | |
51 | argc--; | |
52 | argv++; | |
53 | } | |
54 | sargc = argc; | |
55 | sargv = argv; | |
56 | if (argc > 1){ | |
57 | fin = fopen(argv[++fptr], "r"); /* open argv[1] */ | |
58 | sargc--; | |
a5423a97 SL |
59 | } |
60 | else fin = stdin; | |
61 | if(fin == NULL) | |
62 | error ("Can't read input file %s",argc>1?argv[1]:"standard input"); | |
63 | gch(); | |
64 | /* may be gotten: def, subs, sname, schar, ccl, dchar */ | |
65 | get1core(); | |
66 | /* may be gotten: name, left, right, nullstr, parent */ | |
67 | scopy("INITIAL",sp); | |
68 | sname[0] = sp; | |
69 | sp += slength("INITIAL") + 1; | |
70 | sname[1] = 0; | |
71 | if(yyparse(0)) exit(1); /* error return code */ | |
72 | /* may be disposed of: def, subs, dchar */ | |
73 | free1core(); | |
74 | /* may be gotten: tmpstat, foll, positions, gotof, nexts, nchar, state, atable, sfall, cpackflg */ | |
75 | get2core(); | |
76 | ptail(); | |
77 | mkmatch(); | |
78 | # ifdef DEBUG | |
79 | if(debug) pccl(); | |
80 | # endif | |
81 | sect = ENDSECTION; | |
82 | if(tptr>0)cfoll(tptr-1); | |
83 | # ifdef DEBUG | |
84 | if(debug)pfoll(); | |
85 | # endif | |
86 | cgoto(); | |
87 | # ifdef DEBUG | |
88 | if(debug){ | |
89 | printf("Print %d states:\n",stnum+1); | |
90 | for(i=0;i<=stnum;i++)stprt(i); | |
91 | } | |
92 | # endif | |
93 | /* may be disposed of: positions, tmpstat, foll, state, name, left, right, parent, ccl, schar, sname */ | |
94 | /* may be gotten: verify, advance, stoff */ | |
95 | free2core(); | |
96 | get3core(); | |
97 | layout(); | |
98 | /* may be disposed of: verify, advance, stoff, nexts, nchar, | |
99 | gotof, atable, ccpackflg, sfall */ | |
100 | # ifdef DEBUG | |
101 | free3core(); | |
102 | # endif | |
103 | if (ZCH>NCH) cname="/usr/lib/lex/ebcform"; | |
104 | fother = fopen(ratfor?ratname:cname,"r"); | |
105 | if(fother == NULL) | |
106 | error("Lex driver missing, file %s",ratfor?ratname:cname); | |
107 | while ( (i=getc(fother)) != EOF) | |
108 | putc(i,fout); | |
109 | ||
110 | fclose(fother); | |
111 | fclose(fout); | |
112 | if( | |
113 | # ifdef DEBUG | |
114 | debug || | |
115 | # endif | |
116 | report == 1)statistics(); | |
117 | fclose(stdout); | |
118 | fclose(stderr); | |
119 | exit(0); /* success return code */ | |
120 | } | |
121 | get1core(){ | |
122 | register int i, val; | |
123 | register char *p; | |
124 | ccptr = ccl = myalloc(CCLSIZE,sizeof(*ccl)); | |
125 | pcptr = pchar = myalloc(pchlen, sizeof(*pchar)); | |
3d47cc8b RC |
126 | def = (char **) myalloc(DEFSIZE,sizeof(*def)); |
127 | subs = (char **) myalloc(DEFSIZE,sizeof(*subs)); | |
a5423a97 | 128 | dp = dchar = myalloc(DEFCHAR,sizeof(*dchar)); |
3d47cc8b | 129 | sname = (char **) myalloc(STARTSIZE,sizeof(*sname)); |
a5423a97 SL |
130 | sp = schar = myalloc(STARTCHAR,sizeof(*schar)); |
131 | if(ccl == 0 || def == 0 || subs == 0 || dchar == 0 || sname == 0 || schar == 0) | |
132 | error("Too little core to begin"); | |
133 | } | |
134 | free1core(){ | |
135 | cfree(def,DEFSIZE,sizeof(*def)); | |
136 | cfree(subs,DEFSIZE,sizeof(*subs)); | |
137 | cfree(dchar,DEFCHAR,sizeof(*dchar)); | |
138 | } | |
139 | get2core(){ | |
140 | register int i, val; | |
141 | register char *p; | |
3d47cc8b RC |
142 | gotof = (int *) myalloc(nstates,sizeof(*gotof)); |
143 | nexts = (int *) myalloc(ntrans,sizeof(*nexts)); | |
a5423a97 | 144 | nchar = myalloc(ntrans,sizeof(*nchar)); |
3d47cc8b RC |
145 | state = (int **) myalloc(nstates,sizeof(*state)); |
146 | atable = (int *) myalloc(nstates,sizeof(*atable)); | |
147 | sfall = (int *) myalloc(nstates,sizeof(*sfall)); | |
a5423a97 SL |
148 | cpackflg = myalloc(nstates,sizeof(*cpackflg)); |
149 | tmpstat = myalloc(tptr+1,sizeof(*tmpstat)); | |
3d47cc8b RC |
150 | foll = (int **) myalloc(tptr+1,sizeof(*foll)); |
151 | nxtpos = positions = (int *) myalloc(maxpos,sizeof(*positions)); | |
a5423a97 SL |
152 | if(tmpstat == 0 || foll == 0 || positions == 0 || |
153 | gotof == 0 || nexts == 0 || nchar == 0 || state == 0 || atable == 0 || sfall == 0 || cpackflg == 0 ) | |
154 | error("Too little core for state generation"); | |
155 | for(i=0;i<=tptr;i++)foll[i] = 0; | |
156 | } | |
157 | free2core(){ | |
158 | cfree(positions,maxpos,sizeof(*positions)); | |
159 | cfree(tmpstat,tptr+1,sizeof(*tmpstat)); | |
160 | cfree(foll,tptr+1,sizeof(*foll)); | |
161 | cfree(name,treesize,sizeof(*name)); | |
162 | cfree(left,treesize,sizeof(*left)); | |
163 | cfree(right,treesize,sizeof(*right)); | |
164 | cfree(parent,treesize,sizeof(*parent)); | |
165 | cfree(nullstr,treesize,sizeof(*nullstr)); | |
166 | cfree(state,nstates,sizeof(*state)); | |
167 | cfree(sname,STARTSIZE,sizeof(*sname)); | |
168 | cfree(schar,STARTCHAR,sizeof(*schar)); | |
169 | cfree(ccl,CCLSIZE,sizeof(*ccl)); | |
170 | } | |
171 | get3core(){ | |
172 | register int i, val; | |
173 | register char *p; | |
3d47cc8b RC |
174 | verify = (int *) myalloc(outsize,sizeof(*verify)); |
175 | advance = (int *) myalloc(outsize,sizeof(*advance)); | |
176 | stoff = (int *) myalloc(stnum+2,sizeof(*stoff)); | |
a5423a97 SL |
177 | if(verify == 0 || advance == 0 || stoff == 0) |
178 | error("Too little core for final packing"); | |
179 | } | |
180 | # ifdef DEBUG | |
181 | free3core(){ | |
182 | cfree(advance,outsize,sizeof(*advance)); | |
183 | cfree(verify,outsize,sizeof(*verify)); | |
184 | cfree(stoff,stnum+1,sizeof(*stoff)); | |
185 | cfree(gotof,nstates,sizeof(*gotof)); | |
186 | cfree(nexts,ntrans,sizeof(*nexts)); | |
187 | cfree(nchar,ntrans,sizeof(*nchar)); | |
188 | cfree(atable,nstates,sizeof(*atable)); | |
189 | cfree(sfall,nstates,sizeof(*sfall)); | |
190 | cfree(cpackflg,nstates,sizeof(*cpackflg)); | |
191 | } | |
192 | # endif | |
193 | char *myalloc(a,b) | |
194 | int a,b; { | |
3d47cc8b | 195 | register char *i; |
a5423a97 SL |
196 | i = calloc(a, b); |
197 | if(i==0) | |
198 | warning("OOPS - calloc returns a 0"); | |
3d47cc8b | 199 | else if(i == (char *)-1){ |
a5423a97 SL |
200 | # ifdef DEBUG |
201 | warning("calloc returns a -1"); | |
202 | # endif | |
203 | return(0); | |
204 | } | |
205 | return(i); | |
206 | } | |
207 | # ifdef DEBUG | |
208 | buserr(){ | |
209 | fflush(errorf); | |
210 | fflush(fout); | |
211 | fflush(stdout); | |
212 | fprintf(errorf,"Bus error\n"); | |
213 | if(report == 1)statistics(); | |
214 | fflush(errorf); | |
215 | } | |
216 | segviol(){ | |
217 | fflush(errorf); | |
218 | fflush(fout); | |
219 | fflush(stdout); | |
220 | fprintf(errorf,"Segmentation violation\n"); | |
221 | if(report == 1)statistics(); | |
222 | fflush(errorf); | |
223 | } | |
224 | # endif | |
225 | ||
226 | yyerror(s) | |
227 | char *s; | |
228 | { | |
5092bf15 S |
229 | fprintf(stderr, "\"%s\", line %d: %s\n", |
230 | fptr > 0 ? sargv[fptr] : "<stdin>", yyline, s); | |
a5423a97 | 231 | } |