xref: /plan9-contrib/sys/src/cmd/lex/lmain.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier /* lex [-[dynvt]] [file] ... [file] */
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier /* Copyright 1976, Bell Telephone Laboratories, Inc.,
43e12c5d1SDavid du Colombier    written by Eric Schmidt, August 27, 1976   */
53e12c5d1SDavid du Colombier 
63e12c5d1SDavid du Colombier # include "ldefs.h"
7*219b2ee8SDavid du Colombier Biobuf	fout;
8*219b2ee8SDavid du Colombier int	foutopen;
9*219b2ee8SDavid du Colombier int	errorf = 1;
103e12c5d1SDavid du Colombier int	sect = DEFSECTION;
113e12c5d1SDavid du Colombier int	prev = '\n';	/* previous input character */
123e12c5d1SDavid du Colombier int	pres = '\n';	/* present input character */
133e12c5d1SDavid du Colombier int	peek = '\n';	/* next input character */
143e12c5d1SDavid du Colombier uchar	*pushptr = pushc;
153e12c5d1SDavid du Colombier uchar	*slptr = slist;
163e12c5d1SDavid du Colombier 
173e12c5d1SDavid du Colombier char	*cname = "/sys/lib/lex/ncform";
183e12c5d1SDavid du Colombier 
193e12c5d1SDavid du Colombier int ccount = 1;
203e12c5d1SDavid du Colombier int casecount = 1;
213e12c5d1SDavid du Colombier int aptr = 1;
223e12c5d1SDavid du Colombier int nstates = NSTATES, maxpos = MAXPOS;
233e12c5d1SDavid du Colombier int treesize = TREESIZE, ntrans = NTRANS;
243e12c5d1SDavid du Colombier int yytop;
253e12c5d1SDavid du Colombier int outsize = NOUTPUT;
263e12c5d1SDavid du Colombier int sptr = 1;
273e12c5d1SDavid du Colombier int report = 2;
283e12c5d1SDavid du Colombier int debug;		/* 1 = on */
293e12c5d1SDavid du Colombier int charc;
303e12c5d1SDavid du Colombier int sargc;
313e12c5d1SDavid du Colombier char **sargv;
323e12c5d1SDavid du Colombier uchar buf[520];
333e12c5d1SDavid du Colombier int yyline;		/* line number of file */
343e12c5d1SDavid du Colombier int eof;
353e12c5d1SDavid du Colombier int lgatflg;
363e12c5d1SDavid du Colombier int divflg;
373e12c5d1SDavid du Colombier int funcflag;
383e12c5d1SDavid du Colombier int pflag;
393e12c5d1SDavid du Colombier int chset;	/* 1 = char set modified */
40*219b2ee8SDavid du Colombier Biobuf *fin, *fother;
413e12c5d1SDavid du Colombier int fptr;
423e12c5d1SDavid du Colombier int *name;
433e12c5d1SDavid du Colombier int *left;
443e12c5d1SDavid du Colombier int *right;
453e12c5d1SDavid du Colombier int *parent;
463e12c5d1SDavid du Colombier uchar *nullstr;
473e12c5d1SDavid du Colombier int tptr;
483e12c5d1SDavid du Colombier uchar pushc[TOKENSIZE];
493e12c5d1SDavid du Colombier uchar slist[STARTSIZE];
503e12c5d1SDavid du Colombier uchar **def, **subs, *dchar;
513e12c5d1SDavid du Colombier uchar **sname, *stchar;
523e12c5d1SDavid du Colombier uchar *ccl;
533e12c5d1SDavid du Colombier uchar *ccptr;
543e12c5d1SDavid du Colombier uchar *dp, *sp;
553e12c5d1SDavid du Colombier int dptr;
563e12c5d1SDavid du Colombier uchar *bptr;		/* store input position */
573e12c5d1SDavid du Colombier uchar *tmpstat;
583e12c5d1SDavid du Colombier int count;
593e12c5d1SDavid du Colombier int **foll;
603e12c5d1SDavid du Colombier int *nxtpos;
613e12c5d1SDavid du Colombier int *positions;
623e12c5d1SDavid du Colombier int *gotof;
633e12c5d1SDavid du Colombier int *nexts;
643e12c5d1SDavid du Colombier uchar *nchar;
653e12c5d1SDavid du Colombier int **state;
663e12c5d1SDavid du Colombier int *sfall;		/* fallback state num */
673e12c5d1SDavid du Colombier uchar *cpackflg;		/* true if state has been character packed */
683e12c5d1SDavid du Colombier int *atable;
693e12c5d1SDavid du Colombier int nptr;
703e12c5d1SDavid du Colombier uchar symbol[NCH];
713e12c5d1SDavid du Colombier uchar cindex[NCH];
723e12c5d1SDavid du Colombier int xstate;
733e12c5d1SDavid du Colombier int stnum;
743e12c5d1SDavid du Colombier uchar match[NCH];
753e12c5d1SDavid du Colombier uchar extra[NACTIONS];
763e12c5d1SDavid du Colombier uchar *pchar, *pcptr;
773e12c5d1SDavid du Colombier int pchlen = TOKENSIZE;
783e12c5d1SDavid du Colombier  long rcount;
793e12c5d1SDavid du Colombier int *verify, *advance, *stoff;
803e12c5d1SDavid du Colombier int scon;
813e12c5d1SDavid du Colombier uchar *psave;
823e12c5d1SDavid du Colombier 
833e12c5d1SDavid du Colombier static void	free1core(void);
843e12c5d1SDavid du Colombier static void	free2core(void);
853e12c5d1SDavid du Colombier static void	free3core(void);
863e12c5d1SDavid du Colombier static void	get1core(void);
873e12c5d1SDavid du Colombier static void	get2core(void);
883e12c5d1SDavid du Colombier static void	get3core(void);
893e12c5d1SDavid du Colombier 
90*219b2ee8SDavid du Colombier void
913e12c5d1SDavid du Colombier main(int argc, char **argv)
923e12c5d1SDavid du Colombier {
933e12c5d1SDavid du Colombier 	int i;
94*219b2ee8SDavid du Colombier 
953e12c5d1SDavid du Colombier 	ARGBEGIN {
963e12c5d1SDavid du Colombier # ifdef DEBUG
973e12c5d1SDavid du Colombier 		case 'd': debug++; break;
983e12c5d1SDavid du Colombier 		case 'y': yydebug = TRUE; break;
993e12c5d1SDavid du Colombier # endif
1003e12c5d1SDavid du Colombier 		case 't': case 'T':
101*219b2ee8SDavid du Colombier 			Binit(&fout, 1, OWRITE);
102*219b2ee8SDavid du Colombier 			errorf= 2;
103*219b2ee8SDavid du Colombier 			foutopen = 1;
1043e12c5d1SDavid du Colombier 			break;
1053e12c5d1SDavid du Colombier 		case 'v': case 'V':
1063e12c5d1SDavid du Colombier 			report = 1;
1073e12c5d1SDavid du Colombier 			break;
1083e12c5d1SDavid du Colombier 		case 'n': case 'N':
1093e12c5d1SDavid du Colombier 			report = 0;
1103e12c5d1SDavid du Colombier 			break;
1113e12c5d1SDavid du Colombier 		default:
1123e12c5d1SDavid du Colombier 			warning("Unknown option %c", ARGC());
1133e12c5d1SDavid du Colombier 	} ARGEND
1143e12c5d1SDavid du Colombier 	sargc = argc;
1153e12c5d1SDavid du Colombier 	sargv = argv;
1163e12c5d1SDavid du Colombier 	if (argc > 0){
117*219b2ee8SDavid du Colombier 		fin = Bopen(argv[fptr++], OREAD);
118*219b2ee8SDavid du Colombier 		if(fin == 0)
119*219b2ee8SDavid du Colombier 			error ("Can't read input file %s",argv[0]);
1203e12c5d1SDavid du Colombier 		sargc--;
1213e12c5d1SDavid du Colombier 		sargv++;
1223e12c5d1SDavid du Colombier 	}
123*219b2ee8SDavid du Colombier 	else {
124*219b2ee8SDavid du Colombier 		fin = myalloc(sizeof(Biobuf), 1);
125*219b2ee8SDavid du Colombier 		if(fin == 0)
126*219b2ee8SDavid du Colombier 			exits("core");
127*219b2ee8SDavid du Colombier 		Binit(fin, 0, OREAD);
128*219b2ee8SDavid du Colombier 	}
129*219b2ee8SDavid du Colombier 	if(Bgetc(fin) == Beof)		/* no input */
130*219b2ee8SDavid du Colombier 		exits(0);
131*219b2ee8SDavid du Colombier 	Bseek(fin, 0, 0);
1323e12c5d1SDavid du Colombier 	gch();
1333e12c5d1SDavid du Colombier 		/* may be gotten: def, subs, sname, stchar, ccl, dchar */
1343e12c5d1SDavid du Colombier 	get1core();
1353e12c5d1SDavid du Colombier 		/* may be gotten: name, left, right, nullstr, parent */
1363e12c5d1SDavid du Colombier 	strcpy((char*)sp, "INITIAL");
1373e12c5d1SDavid du Colombier 	sname[0] = sp;
1383e12c5d1SDavid du Colombier 	sp += strlen("INITIAL") + 1;
1393e12c5d1SDavid du Colombier 	sname[1] = 0;
1403e12c5d1SDavid du Colombier 	if(yyparse()) exits("error");	/* error return code */
1413e12c5d1SDavid du Colombier 		/* may be disposed of: def, subs, dchar */
1423e12c5d1SDavid du Colombier 	free1core();
1433e12c5d1SDavid du Colombier 		/* may be gotten: tmpstat, foll, positions, gotof, nexts, nchar, state, atable, sfall, cpackflg */
1443e12c5d1SDavid du Colombier 	get2core();
1453e12c5d1SDavid du Colombier 	ptail();
1463e12c5d1SDavid du Colombier 	mkmatch();
1473e12c5d1SDavid du Colombier # ifdef DEBUG
1483e12c5d1SDavid du Colombier 	if(debug) pccl();
1493e12c5d1SDavid du Colombier # endif
1503e12c5d1SDavid du Colombier 	sect  = ENDSECTION;
1513e12c5d1SDavid du Colombier 	if(tptr>0)cfoll(tptr-1);
1523e12c5d1SDavid du Colombier # ifdef DEBUG
1533e12c5d1SDavid du Colombier 	if(debug)pfoll();
1543e12c5d1SDavid du Colombier # endif
1553e12c5d1SDavid du Colombier 	cgoto();
1563e12c5d1SDavid du Colombier # ifdef DEBUG
1573e12c5d1SDavid du Colombier 	if(debug){
158*219b2ee8SDavid du Colombier 		print("Print %d states:\n",stnum+1);
1593e12c5d1SDavid du Colombier 		for(i=0;i<=stnum;i++)stprt(i);
1603e12c5d1SDavid du Colombier 		}
1613e12c5d1SDavid du Colombier # endif
1623e12c5d1SDavid du Colombier 		/* may be disposed of: positions, tmpstat, foll, state, name, left, right, parent, ccl, stchar, sname */
1633e12c5d1SDavid du Colombier 		/* may be gotten: verify, advance, stoff */
1643e12c5d1SDavid du Colombier 	free2core();
1653e12c5d1SDavid du Colombier 	get3core();
1663e12c5d1SDavid du Colombier 	layout();
1673e12c5d1SDavid du Colombier 		/* may be disposed of: verify, advance, stoff, nexts, nchar,
1683e12c5d1SDavid du Colombier 			gotof, atable, ccpackflg, sfall */
1693e12c5d1SDavid du Colombier # ifdef DEBUG
1703e12c5d1SDavid du Colombier 	free3core();
1713e12c5d1SDavid du Colombier # endif
172*219b2ee8SDavid du Colombier 	fother = Bopen(cname,OREAD);
173*219b2ee8SDavid du Colombier 	if(fother == 0)
1743e12c5d1SDavid du Colombier 		error("Lex driver missing, file %s",cname);
175*219b2ee8SDavid du Colombier 	while ( (i=Bgetc(fother)) != Beof)
176*219b2ee8SDavid du Colombier 		Bputc(&fout, i);
1773e12c5d1SDavid du Colombier 
178*219b2ee8SDavid du Colombier 	Bterm(fother);
179*219b2ee8SDavid du Colombier 	Bterm(&fout);
1803e12c5d1SDavid du Colombier 	if(
1813e12c5d1SDavid du Colombier # ifdef DEBUG
1823e12c5d1SDavid du Colombier 		debug   ||
1833e12c5d1SDavid du Colombier # endif
1843e12c5d1SDavid du Colombier 			report == 1)statistics();
185*219b2ee8SDavid du Colombier 	Bterm(fin);
1863e12c5d1SDavid du Colombier 	exits(0);	/* success return code */
1873e12c5d1SDavid du Colombier }
1883e12c5d1SDavid du Colombier 
1893e12c5d1SDavid du Colombier static void
1903e12c5d1SDavid du Colombier get1core(void)
1913e12c5d1SDavid du Colombier {
1923e12c5d1SDavid du Colombier 	ccptr =	ccl = myalloc(CCLSIZE,sizeof(*ccl));
1933e12c5d1SDavid du Colombier 	pcptr = pchar = myalloc(pchlen, sizeof(*pchar));
1943e12c5d1SDavid du Colombier 	def = myalloc(DEFSIZE,sizeof(*def));
1953e12c5d1SDavid du Colombier 	subs = myalloc(DEFSIZE,sizeof(*subs));
1963e12c5d1SDavid du Colombier 	dp = dchar = myalloc(DEFCHAR,sizeof(*dchar));
1973e12c5d1SDavid du Colombier 	sname = myalloc(STARTSIZE,sizeof(*sname));
1983e12c5d1SDavid du Colombier 	sp = stchar = myalloc(STARTCHAR,sizeof(*stchar));
1993e12c5d1SDavid du Colombier 	if(ccl == 0 || def == 0 || subs == 0 || dchar == 0 || sname == 0 || stchar == 0)
2003e12c5d1SDavid du Colombier 		error("Too little core to begin");
2013e12c5d1SDavid du Colombier }
2023e12c5d1SDavid du Colombier 
2033e12c5d1SDavid du Colombier static void
2043e12c5d1SDavid du Colombier free1core(void)
2053e12c5d1SDavid du Colombier {
2063e12c5d1SDavid du Colombier 	free(def);
2073e12c5d1SDavid du Colombier 	free(subs);
2083e12c5d1SDavid du Colombier 	free(dchar);
2093e12c5d1SDavid du Colombier }
2103e12c5d1SDavid du Colombier 
2113e12c5d1SDavid du Colombier static void
2123e12c5d1SDavid du Colombier get2core(void)
2133e12c5d1SDavid du Colombier {
214*219b2ee8SDavid du Colombier 	int i;
2153e12c5d1SDavid du Colombier 
2163e12c5d1SDavid du Colombier 	gotof = myalloc(nstates,sizeof(*gotof));
2173e12c5d1SDavid du Colombier 	nexts = myalloc(ntrans,sizeof(*nexts));
2183e12c5d1SDavid du Colombier 	nchar = myalloc(ntrans,sizeof(*nchar));
2193e12c5d1SDavid du Colombier 	state = myalloc(nstates,sizeof(*state));
2203e12c5d1SDavid du Colombier 	atable = myalloc(nstates,sizeof(*atable));
2213e12c5d1SDavid du Colombier 	sfall = myalloc(nstates,sizeof(*sfall));
2223e12c5d1SDavid du Colombier 	cpackflg = myalloc(nstates,sizeof(*cpackflg));
2233e12c5d1SDavid du Colombier 	tmpstat = myalloc(tptr+1,sizeof(*tmpstat));
2243e12c5d1SDavid du Colombier 	foll = myalloc(tptr+1,sizeof(*foll));
2253e12c5d1SDavid du Colombier 	nxtpos = positions = myalloc(maxpos,sizeof(*positions));
2263e12c5d1SDavid du Colombier 	if(tmpstat == 0 || foll == 0 || positions == 0 ||
2273e12c5d1SDavid du Colombier 		gotof == 0 || nexts == 0 || nchar == 0 || state == 0 || atable == 0 || sfall == 0 || cpackflg == 0 )
2283e12c5d1SDavid du Colombier 		error("Too little core for state generation");
2293e12c5d1SDavid du Colombier 	for(i=0;i<=tptr;i++)foll[i] = 0;
2303e12c5d1SDavid du Colombier }
2313e12c5d1SDavid du Colombier 
2323e12c5d1SDavid du Colombier static void
2333e12c5d1SDavid du Colombier free2core(void)
2343e12c5d1SDavid du Colombier {
2353e12c5d1SDavid du Colombier 	free(positions);
2363e12c5d1SDavid du Colombier 	free(tmpstat);
2373e12c5d1SDavid du Colombier 	free(foll);
2383e12c5d1SDavid du Colombier 	free(name);
2393e12c5d1SDavid du Colombier 	free(left);
2403e12c5d1SDavid du Colombier 	free(right);
2413e12c5d1SDavid du Colombier 	free(parent);
2423e12c5d1SDavid du Colombier 	free(nullstr);
2433e12c5d1SDavid du Colombier 	free(state);
2443e12c5d1SDavid du Colombier 	free(sname);
2453e12c5d1SDavid du Colombier 	free(stchar);
2463e12c5d1SDavid du Colombier 	free(ccl);
2473e12c5d1SDavid du Colombier }
2483e12c5d1SDavid du Colombier 
2493e12c5d1SDavid du Colombier static void
2503e12c5d1SDavid du Colombier get3core(void)
2513e12c5d1SDavid du Colombier {
2523e12c5d1SDavid du Colombier 	verify = myalloc(outsize,sizeof(*verify));
2533e12c5d1SDavid du Colombier 	advance = myalloc(outsize,sizeof(*advance));
2543e12c5d1SDavid du Colombier 	stoff = myalloc(stnum+2,sizeof(*stoff));
2553e12c5d1SDavid du Colombier 	if(verify == 0 || advance == 0 || stoff == 0)
2563e12c5d1SDavid du Colombier 		error("Too little core for final packing");
2573e12c5d1SDavid du Colombier }
2583e12c5d1SDavid du Colombier # ifdef DEBUG
2593e12c5d1SDavid du Colombier static void
2603e12c5d1SDavid du Colombier free3core(void){
2613e12c5d1SDavid du Colombier 	free(advance);
2623e12c5d1SDavid du Colombier 	free(verify);
2633e12c5d1SDavid du Colombier 	free(stoff);
2643e12c5d1SDavid du Colombier 	free(gotof);
2653e12c5d1SDavid du Colombier 	free(nexts);
2663e12c5d1SDavid du Colombier 	free(nchar);
2673e12c5d1SDavid du Colombier 	free(atable);
2683e12c5d1SDavid du Colombier 	free(sfall);
2693e12c5d1SDavid du Colombier 	free(cpackflg);
2703e12c5d1SDavid du Colombier }
2713e12c5d1SDavid du Colombier # endif
2723e12c5d1SDavid du Colombier void *
2733e12c5d1SDavid du Colombier myalloc(int a, int b)
2743e12c5d1SDavid du Colombier {
2753e12c5d1SDavid du Colombier 	void *i;
2763e12c5d1SDavid du Colombier 	i = calloc(a, b);
2773e12c5d1SDavid du Colombier 	if(i==0)
2783e12c5d1SDavid du Colombier 		warning("OOPS - calloc returns a 0");
2793e12c5d1SDavid du Colombier 	return(i);
2803e12c5d1SDavid du Colombier }
2813e12c5d1SDavid du Colombier 
2823e12c5d1SDavid du Colombier void
2833e12c5d1SDavid du Colombier yyerror(char *s)
2843e12c5d1SDavid du Colombier {
285*219b2ee8SDavid du Colombier 	fprint(2, "line %d: %s\n", yyline, s);
2863e12c5d1SDavid du Colombier }
287