plan9port

[fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port # fast
git clone https://src.adamsgaard.dk/plan9port.git # slow
Log | Files | Refs | README | LICENSE Back to index

lmain.c (6094B)


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