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