| 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 | } |