Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

/* lex [-[dynvt]] [file] ... [file] */

/* Copyright 1976, Bell Telephone Laboratories, Inc.,
   written by Eric Schmidt, August 27, 1976   */

# include "ldefs.h"
Biobuf  fout;
int     foutopen;
int     errorf = 1;
int     sect = DEFSECTION;
int     prev = '\n';    /* previous input character */
int     pres = '\n';    /* present input character */
int     peek = '\n';    /* next input character */
uchar   *pushptr = pushc;
uchar   *slptr = slist;

char    *cname = "/sys/lib/lex/ncform";

int nine;
int ccount = 1;
int casecount = 1;
int aptr = 1;
int nstates = NSTATES, maxpos = MAXPOS;
int treesize = TREESIZE, ntrans = NTRANS;
int yytop;
int outsize = NOUTPUT;
int sptr = 1;
int report = 2;
int debug;              /* 1 = on */
int charc;
int sargc;
char **sargv;
uchar buf[520];
int yyline;             /* line number of file */
char *yyfile;           /* filename for error messages */
int eof;
int lgatflg;
int divflg;
int funcflag;
int pflag;
int chset;      /* 1 = char set modified */
Biobuf *fin = 0, *fother;
int fptr;
int *name;
int *left;
int *right;
int *parent;
uchar *nullstr;
uchar **ptr;
int tptr;
uchar pushc[TOKENSIZE];
uchar slist[STARTSIZE];
uchar **def, **subs, *dchar;
uchar **sname, *stchar;
uchar *ccl;
uchar *ccptr;
uchar *dp, *sp;
int dptr;
uchar *bptr;            /* store input position */
uchar *tmpstat;
int count;
int **foll;
int *nxtpos;
int *positions;
int *gotof;
int *nexts;
uchar *nchar;
int **state;
int *sfall;             /* fallback state num */
uchar *cpackflg;                /* true if state has been character packed */
int *atable;
int nptr;
uchar symbol[NCH];
uchar cindex[NCH];
int xstate;
int stnum;
uchar match[NCH];
uchar extra[NACTIONS];
uchar *pchar, *pcptr;
int pchlen = TOKENSIZE;
 long rcount;
int *verify, *advance, *stoff;
int scon;
uchar *psave;

static void     free1core(void);
static void     free2core(void);
static void     free3core(void);
static void     get1core(void);
static void     get2core(void);
static void     get3core(void);

void
main(int argc, char **argv)
{
        int i;

        ARGBEGIN {
# ifdef DEBUG
                case 'd': debug++; break;
                case 'y': yydebug = TRUE; break;
# endif
                case 't': case 'T':
                        Binit(&fout, 1, OWRITE);
                        errorf= 2;
                        foutopen = 1;
                        break;
                case 'v': case 'V':
                        report = 1;
                        break;
                case 'n': case 'N':
                        report = 0;
                        break;
                case '9':
                        nine = 1;
                        break;
                default:
                        warning("Unknown option %c", ARGC());
        } ARGEND
        sargc = argc;
        sargv = argv;
        if (argc > 0){
                yyfile = argv[fptr++];
                fin = Bopen(yyfile, OREAD);
                if(fin == 0)
                        error ("%s - can't open file: %r", yyfile);
                sargc--;
                sargv++;
        }
        else {
                yyfile = "/fd/0";
                fin = myalloc(sizeof(Biobuf), 1);
                if(fin == 0)
                        exits("core");
                Binit(fin, 0, OREAD);
        }
        if(Bgetc(fin) == Beof)          /* no input */
                exits(0);
        Bseek(fin, 0, 0);
        gch();
                /* may be gotten: def, subs, sname, stchar, ccl, dchar */
        get1core();
                /* may be gotten: name, left, right, nullstr, parent, ptr */
        strcpy((char*)sp, "INITIAL");
        sname[0] = sp;
        sp += strlen("INITIAL") + 1;
        sname[1] = 0;
        if(yyparse()) exits("error");   /* error return code */
                /* may be disposed of: def, subs, dchar */
        free1core();
                /* may be gotten: tmpstat, foll, positions, gotof, nexts, nchar, state, atable, sfall, cpackflg */
        get2core();
        ptail();
        mkmatch();
# ifdef DEBUG
        if(debug) pccl();
# endif
        sect  = ENDSECTION;
        if(tptr>0)cfoll(tptr-1);
# ifdef DEBUG
        if(debug)pfoll();
# endif
        cgoto();
# ifdef DEBUG
        if(debug){
                print("Print %d states:\n",stnum+1);
                for(i=0;i<=stnum;i++)stprt(i);
                }
# endif
                /* may be disposed of: positions, tmpstat, foll, state, name, left, right, parent, ccl, stchar, sname */
                /* may be gotten: verify, advance, stoff */
        free2core();
        get3core();
        layout();
                /* may be disposed of: verify, advance, stoff, nexts, nchar,
                        gotof, atable, ccpackflg, sfall */
# ifdef DEBUG
        free3core();
# endif
        fother = Bopen(cname,OREAD);
        if(fother == 0)
                error("Lex driver missing, file %s: %r",cname);
        while ( (i=Bgetc(fother)) != Beof)
                Bputc(&fout, i);

        Bterm(fother);
        Bterm(&fout);
        if(
# ifdef DEBUG
                debug   ||
# endif
                        report == 1)statistics();
        if (fin)
                Bterm(fin);
        exits(0);       /* success return code */
}

static void
get1core(void)
{
        ccptr = ccl = myalloc(CCLSIZE,sizeof(*ccl));
        pcptr = pchar = myalloc(pchlen, sizeof(*pchar));
        def = myalloc(DEFSIZE,sizeof(*def));
        subs = myalloc(DEFSIZE,sizeof(*subs));
        dp = dchar = myalloc(DEFCHAR,sizeof(*dchar));
        sname = myalloc(STARTSIZE,sizeof(*sname));
        sp = stchar = myalloc(STARTCHAR,sizeof(*stchar));
        if(ccl == 0 || def == 0 || subs == 0 || dchar == 0 || sname == 0 || stchar == 0)
                error("Too little core to begin");
}

static void
free1core(void)
{
        free(def);
        free(subs);
        free(dchar);
}

static void
get2core(void)
{
        int i;

        gotof = myalloc(nstates,sizeof(*gotof));
        nexts = myalloc(ntrans,sizeof(*nexts));
        nchar = myalloc(ntrans,sizeof(*nchar));
        state = myalloc(nstates,sizeof(*state));
        atable = myalloc(nstates,sizeof(*atable));
        sfall = myalloc(nstates,sizeof(*sfall));
        cpackflg = myalloc(nstates,sizeof(*cpackflg));
        tmpstat = myalloc(tptr+1,sizeof(*tmpstat));
        foll = myalloc(tptr+1,sizeof(*foll));
        nxtpos = positions = myalloc(maxpos,sizeof(*positions));
        if(tmpstat == 0 || foll == 0 || positions == 0 ||
                gotof == 0 || nexts == 0 || nchar == 0 || state == 0 || atable == 0 || sfall == 0 || cpackflg == 0 )
                error("Too little core for state generation");
        for(i=0;i<=tptr;i++)foll[i] = 0;
}

static void
free2core(void)
{
        free(positions);
        free(tmpstat);
        free(foll);
        free(name);
        free(left);
        free(right);
        free(parent);
        free(nullstr);
        free(ptr);
        free(state);
        free(sname);
        free(stchar);
        free(ccl);
}

static void
get3core(void)
{
        verify = myalloc(outsize,sizeof(*verify));
        advance = myalloc(outsize,sizeof(*advance));
        stoff = myalloc(stnum+2,sizeof(*stoff));
        if(verify == 0 || advance == 0 || stoff == 0)
                error("Too little core for final packing");
}
# ifdef DEBUG
static void
free3core(void){
        free(advance);
        free(verify);
        free(stoff);
        free(gotof);
        free(nexts);
        free(nchar);
        free(atable);
        free(sfall);
        free(cpackflg);
}
# endif
void *
myalloc(int a, int b)
{
        void *i;
        i = calloc(a, b);
        if(i==0)
                warning("OOPS - calloc returns a 0");
        return(i);
}

void
yyerror(char *s)
{
        fprint(2, "%s:%d %s\n", yyfile, yyline, s);
}