Annotation of 3BSD/cmd/eqn/lex.c, revision 1.1

1.1     ! root        1: #include "e.h"
        !             2: #include "e.def"
        !             3: 
        !             4: #define        SSIZE   400
        !             5: char   token[SSIZE];
        !             6: int    sp;
        !             7: #define        putbak(c)       *ip++ = c;
        !             8: #define        PUSHBACK        300     /* maximum pushback characters */
        !             9: char   ibuf[PUSHBACK+SSIZE];   /* pushback buffer for definitions, etc. */
        !            10: char   *ip     = ibuf;
        !            11: 
        !            12: gtc() {
        !            13:   loop:
        !            14:        if (ip > ibuf)
        !            15:                return(*--ip);  /* already present */
        !            16:        lastchar = getc(curfile);
        !            17:        if (lastchar=='\n')
        !            18:                linect++;
        !            19:        if (lastchar != EOF)
        !            20:                return(lastchar);
        !            21:        if (++ifile > svargc) {
        !            22:                return(EOF);
        !            23:        }
        !            24:        fclose(curfile);
        !            25:        linect = 1;
        !            26:        if ((curfile=fopen(svargv[ifile], "r")) != NULL)
        !            27:                goto loop;
        !            28:        error(FATAL, "can't open file %s", svargv[ifile]);
        !            29:        return(EOF);
        !            30: }
        !            31: 
        !            32: pbstr(str)
        !            33: register char *str;
        !            34: {
        !            35:        register char *p;
        !            36: 
        !            37:        p = str;
        !            38:        while (*p++);
        !            39:        --p;
        !            40:        if (ip >= &ibuf[PUSHBACK])
        !            41:                error( FATAL, "pushback overflow");
        !            42:        while (p > str)
        !            43:                putbak(*--p);
        !            44: }
        !            45: 
        !            46: yylex() {
        !            47:        register int c;
        !            48:        tbl *tp, *lookup();
        !            49:        extern tbl **keytbl, **deftbl;
        !            50: 
        !            51:   beg:
        !            52:        while ((c=gtc())==' ' || c=='\n')
        !            53:                ;
        !            54:        yylval=c;
        !            55:        switch(c) {
        !            56: 
        !            57:        case EOF:
        !            58:                return(EOF);
        !            59:        case '~':
        !            60:                return(SPACE);
        !            61:        case '^':
        !            62:                return(THIN);
        !            63:        case '\t':
        !            64:                return(TAB);
        !            65:        case '{':
        !            66:                return('{');
        !            67:        case '}':
        !            68:                return('}');
        !            69:        case '"':
        !            70:                for (sp=0; (c=gtc())!='"' && c != '\n'; ) {
        !            71:                        if (c == '\\')
        !            72:                                if ((c = gtc()) != '"')
        !            73:                                        token[sp++] = '\\';
        !            74:                        token[sp++] = c;
        !            75:                        if (sp>=SSIZE)
        !            76:                                error(FATAL, "quoted string %.20s... too long", token);
        !            77:                }
        !            78:                token[sp]='\0';
        !            79:                yylval = (int) &token[0];
        !            80:                if (c == '\n')
        !            81:                        error(!FATAL, "missing \" in %.20s", token);
        !            82:                return(QTEXT);
        !            83:        }
        !            84:        if (c==righteq)
        !            85:                return(EOF);
        !            86: 
        !            87:        putbak(c);
        !            88:        getstr(token, SSIZE);
        !            89:        if (dbg)printf(".\tlex token = |%s|\n", token);
        !            90:        if ((tp = lookup(&deftbl, token, NULL)) != NULL) {
        !            91:                putbak(' ');
        !            92:                pbstr(tp->defn);
        !            93:                putbak(' ');
        !            94:                if (dbg)
        !            95:                        printf(".\tfound %s|=%s|\n", token, tp->defn);
        !            96:        }
        !            97:        else if ((tp = lookup(&keytbl, token, NULL)) == NULL) {
        !            98:                if(dbg)printf(".\t%s is not a keyword\n", token);
        !            99:                return(CONTIG);
        !           100:        }
        !           101:        else if (tp->defn == (char *) DEFINE || tp->defn == (char *) NDEFINE || tp->defn == (char *) TDEFINE)
        !           102:                define(tp->defn);
        !           103:        else if (tp->defn == (char *) DELIM)
        !           104:                delim();
        !           105:        else if (tp->defn == (char *) GSIZE)
        !           106:                globsize();
        !           107:        else if (tp->defn == (char *) GFONT)
        !           108:                globfont();
        !           109:        else if (tp->defn == (char *) INCLUDE)
        !           110:                include();
        !           111:        else {
        !           112:                return((int) tp->defn);
        !           113:        }
        !           114:        goto beg;
        !           115: }
        !           116: 
        !           117: getstr(s, n) char *s; register int n; {
        !           118:        register int c;
        !           119:        register char *p;
        !           120: 
        !           121:        p = s;
        !           122:        while ((c = gtc()) == ' ' || c == '\n')
        !           123:                ;
        !           124:        if (c == EOF) {
        !           125:                *s = 0;
        !           126:                return;
        !           127:        }
        !           128:        while (c != ' ' && c != '\t' && c != '\n' && c != '{' && c != '}'
        !           129:          && c != '"' && c != '~' && c != '^' && c != righteq) {
        !           130:                if (c == '\\')
        !           131:                        if ((c = gtc()) != '"')
        !           132:                                *p++ = '\\';
        !           133:                *p++ = c;
        !           134:                if (--n <= 0)
        !           135:                        error(FATAL, "token %.20s... too long", s);
        !           136:                c = gtc();
        !           137:        }
        !           138:        if (c=='{' || c=='}' || c=='"' || c=='~' || c=='^' || c=='\t' || c==righteq)
        !           139:                putbak(c);
        !           140:        *p = '\0';
        !           141:        yylval = (int) s;
        !           142: }
        !           143: 
        !           144: cstr(s, quote, maxs) char *s; int quote; {
        !           145:        int del, c, i;
        !           146: 
        !           147:        while((del=gtc()) == ' ' || del == '\t' || del == '\n');
        !           148:        if (quote)
        !           149:                for (i=0; (c=gtc()) != del && c != EOF;) {
        !           150:                        s[i++] = c;
        !           151:                        if (i >= maxs)
        !           152:                                return(1);      /* disaster */
        !           153:                }
        !           154:        else {
        !           155:                s[0] = del;
        !           156:                for (i=1; (c=gtc())!=' ' && c!= '\t' && c!='\n' && c!=EOF;) {
        !           157:                        s[i++]=c;
        !           158:                        if (i >= maxs)
        !           159:                                return(1);      /* disaster */
        !           160:                }
        !           161:        }
        !           162:        s[i] = '\0';
        !           163:        if (c == EOF)
        !           164:                error(FATAL, "Unexpected end of input at %.20s", s);
        !           165:        return(0);
        !           166: }
        !           167: 
        !           168: define(type) int type; {
        !           169:        char *strsave(), *p1, *p2;
        !           170:        tbl *lookup();
        !           171:        extern tbl **deftbl;
        !           172: 
        !           173:        getstr(token, SSIZE);   /* get name */
        !           174:        if (type != DEFINE) {
        !           175:                cstr(token, 1, SSIZE);  /* skip the definition too */
        !           176:                return;
        !           177:        }
        !           178:        p1 = strsave(token);
        !           179:        if (cstr(token, 1, SSIZE))
        !           180:                error(FATAL, "Unterminated definition at %.20s", token);
        !           181:        p2 = strsave(token);
        !           182:        lookup(&deftbl, p1, p2);
        !           183:        if (dbg)printf(".\tname %s defined as %s\n", p1, p2);
        !           184: }
        !           185: 
        !           186: char *strsave(s)
        !           187: char *s;
        !           188: {
        !           189:        char *malloc();
        !           190:        register char *q;
        !           191: 
        !           192:        q = malloc(strlen(s)+1);
        !           193:        if (q == NULL)
        !           194:                error(FATAL, "out of space in strsave on %s", s);
        !           195:        strcpy(q, s);
        !           196:        return(q);
        !           197: }
        !           198: 
        !           199: include() {
        !           200:        error(!FATAL, "Include not yet implemented");
        !           201: }
        !           202: 
        !           203: delim() {
        !           204:        yyval = eqnreg = 0;
        !           205:        if (cstr(token, 0, SSIZE))
        !           206:                error(FATAL, "Bizarre delimiters at %.20s", token);
        !           207:        lefteq = token[0];
        !           208:        righteq = token[1];
        !           209:        if (lefteq == 'o' && righteq == 'f')
        !           210:                lefteq = righteq = '\0';
        !           211: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.