Annotation of researchv10no/cmd/eqn/lex.c, revision 1.1.1.1

1.1       root        1: #include "e.h"
                      2: #include "y.tab.h"
                      3: #include <ctype.h>
                      4: 
                      5: #define        SSIZE   1000
                      6: char   token[SSIZE];
                      7: int    sp;
                      8: 
                      9: void   space(void);
                     10: void   dodef(tbl *);
                     11: void   define(int);
                     12: void   ifdef(void);
                     13: void   include(void);
                     14: void   delim(void);
                     15: 
                     16: yylex(void)
                     17: {
                     18:        register int c;
                     19:        tbl *tp;
                     20: 
                     21:   begin:
                     22:        while ((c = input()) == ' ' || c == '\n' || c == '\t')
                     23:                ;
                     24:        yylval = c;
                     25:        switch (c) {
                     26:        case EOF:
                     27:                ERROR "unexpected end of input inside equation" WARNING;
                     28:                return(EOF);
                     29:        case '~':
                     30:                return(SPACE);
                     31:        case '^':
                     32:                return(THIN);
                     33:        /* case '\t':
                     34:                return(TAB);
                     35:        */
                     36:        case '{':
                     37:                return('{');
                     38:        case '}':
                     39:                return('}');
                     40:        case '"':
                     41:                for (sp = 0; (c=input())!='"' && c != '\n'; ) {
                     42:                        if (c == '\\')
                     43:                                if ((c = input()) != '"')
                     44:                                        token[sp++] = '\\';
                     45:                        token[sp++] = c;
                     46:                        if (sp >= SSIZE)
                     47:                                ERROR "quoted string %.20s... too long", token FATAL;
                     48:                }
                     49:                token[sp] = '\0';
                     50:                yylval = (int) &token[0];
                     51:                if (c == '\n')
                     52:                        ERROR "missing \" in %.20s", token WARNING;
                     53:                return(QTEXT);
                     54:        }
                     55:        if (!display && c == righteq)
                     56:                return(EOF);
                     57: 
                     58:        unput(c);
                     59:        getstr(token, SSIZE);
                     60:        dprintf(".\tlex token = |%s|\n", token);
                     61:        if ((tp = lookup(deftbl, token)) != NULL) {     /* defined term */
                     62:                c = input();
                     63:                unput(c);
                     64:                if (c == '(')   /* macro with args */
                     65:                        dodef(tp);
                     66:                else {          /* no args */
                     67:                        unput(' ');
                     68:                        pbstr(tp->cval);
                     69:                        dprintf(".\tfound %s|=%s|\n", token, tp->cval);
                     70:                }
                     71:                goto begin;
                     72:        }
                     73: 
                     74:        if ((tp = lookup(keytbl, token)) == NULL)       /* not a keyword */
                     75:                return CONTIG;
                     76: 
                     77:        switch (tp->ival) {             /* some kind of keyword */
                     78:        case DEFINE: case TDEFINE: case NDEFINE:
                     79:                define(tp->ival);
                     80:                break;
                     81:        case IFDEF:
                     82:                ifdef();
                     83:                break;
                     84:        case DELIM:
                     85:                delim();
                     86:                break;
                     87:        case GSIZE:
                     88:                globsize();
                     89:                break;
                     90:        case GFONT:
                     91:                globfont();
                     92:                break;
                     93:        case INCLUDE:
                     94:                include();
                     95:                break;
                     96:        case SPACE:
                     97:                space();
                     98:                break;
                     99:        case DOTEQ:
                    100:                        /* .EQ inside equation -- should warn if at bottom level */
                    101:                break;
                    102:        case DOTEN:
                    103:                if (curfile == infile)
                    104:                        return EOF;
                    105:                /* else ignore nested .EN */
                    106:                break;
                    107:        default:
                    108:                return tp->ival;
                    109:        }
                    110:        goto begin;
                    111: }
                    112: 
                    113: void getstr(char *s, int n)
                    114: {
                    115:        register int c;
                    116:        register char *p;
                    117: 
                    118:        p = s;
                    119:        while ((c = input()) == ' ' || c == '\n')
                    120:                ;
                    121:        if (c == EOF) {
                    122:                *s = 0;
                    123:                return;
                    124:        }
                    125:        while (c != ' ' && c != '\t' && c != '\n' && c != '{' && c != '}'
                    126:            && c != '"' && c != '~' && c != '^') {
                    127:                if (!display && c == righteq)
                    128:                        break;
                    129:                if (c == '(' && p > s) {        /* might be defined(...) */
                    130:                        *p = '\0';
                    131:                        if (lookup(deftbl, s) != NULL)
                    132:                                break;
                    133:                }
                    134:                if (c == '\\')
                    135:                        if ((c = input()) != '"')
                    136:                                *p++ = '\\';
                    137:                *p++ = c;
                    138:                if (--n <= 0)
                    139:                        ERROR "token %.20s... too long", s FATAL;
                    140:                c = input();
                    141:        }
                    142:        unput(c);
                    143:        *p = '\0';
                    144:        yylval = (int) s;
                    145: }
                    146: 
                    147: cstr(char *s, int quote, int maxs)
                    148: {
                    149:        int del, c, i;
                    150: 
                    151:        s[0] = 0;
                    152:        while ((del=input()) == ' ' || del == '\t')
                    153:                ;
                    154:        if (quote)
                    155:                for (i=0; (c=input()) != del && c != EOF;) {
                    156:                        s[i++] = c;
                    157:                        if (i >= maxs)
                    158:                                return(1);      /* disaster */
                    159:                }
                    160:        else {
                    161:                if (del == '\n')
                    162:                        return(1);
                    163:                s[0] = del;
                    164:                for (i=1; (c=input())!=' ' && c!= '\t' && c!='\n' && c!=EOF;) {
                    165:                        s[i++] = c;
                    166:                        if (i >= maxs)
                    167:                                return(1);      /* disaster */
                    168:                }
                    169:        }
                    170:        s[i] = '\0';
                    171:        if (c == EOF)
                    172:                ERROR "Unexpected end of input at %.20s", s FATAL;
                    173:        return(0);
                    174: }
                    175: 
                    176: void define(int type)
                    177: {
                    178:        char *p1, *p2;
                    179:        extern int ftune(char *, char *);
                    180: 
                    181:        getstr(token, SSIZE);   /* get name */
                    182:        if (type != DEFINE) {
                    183:                cstr(token, 1, SSIZE);  /* skip the definition too */
                    184:                return;
                    185:        }
                    186:        p1 = strsave(token);
                    187:        if (cstr(token, 1, SSIZE))
                    188:                ERROR "Unterminated definition at %.20s", token FATAL;
                    189:        if (lookup(ftunetbl, p1) != NULL) {     /* double tuning param */
                    190:                dprintf(".\ttune %s %s\n", p1, token);
                    191:                ftune(p1, token);
                    192:        } else {
                    193:                p2 = strsave(token);
                    194:                install(deftbl, p1, p2, 0);
                    195:                dprintf(".\tname %s defined as %s\n", p1, p2);
                    196:        }
                    197: }
                    198: 
                    199: void ifdef(void)               /* do body if name is defined */
                    200: {
                    201:        char name[100], *p;
                    202: 
                    203:        getstr(name, sizeof(name));     /* get name */
                    204:        cstr(token, 1, SSIZE);          /* and body */
                    205:        if (lookup(deftbl, name) != NULL) {     /* found it */
                    206:                p = strsave(token);
                    207:                pushsrc(Free, p);
                    208:                pushsrc(String, p);
                    209:        }
                    210: }
                    211: 
                    212: char   *spaceval       = NULL;
                    213: 
                    214: void space(void)       /* collect line of form "space amt" to replace \x in output */
                    215: {
                    216:        getstr(token, SSIZE);
                    217:        spaceval = strsave(token);
                    218:        dprintf(".\tsetting spaceval to %s\n", token);
                    219: }
                    220: 
                    221: char *strsave(char *s)
                    222: {
                    223:        register char *q;
                    224: 
                    225:        q = malloc(strlen(s)+1);
                    226:        if (q == NULL)
                    227:                ERROR "out of space in strsave on %s", s FATAL;
                    228:        strcpy(q, s);
                    229:        return(q);
                    230: }
                    231: 
                    232: void include(void)
                    233: {
                    234:        char name[100];
                    235:        FILE *fin;
                    236:        int c;
                    237:        extern int errno;
                    238: 
                    239:        while ((c = input()) == ' ')
                    240:                ;
                    241:        unput(c);
                    242:        cstr(name, c == '"', sizeof(name));     /* gets it quoted or not */
                    243:        if ((fin = fopen(name, "r")) == NULL)
                    244:                ERROR "can't open file %s", name FATAL;
                    245:        errno = 0;
                    246:        curfile++;
                    247:        curfile->fin = fin;
                    248:        curfile->fname = strsave(name);
                    249:        curfile->lineno = 0;
                    250:        printf(".lf 1 %s\n", curfile->fname);
                    251:        pushsrc(File, curfile->fname);
                    252: }
                    253: 
                    254: void delim(void)
                    255: {
                    256:        yyval = eqnreg = 0;
                    257:        if (cstr(token, 0, SSIZE))
                    258:                ERROR "Bizarre delimiters" FATAL;
                    259:        lefteq = token[0];
                    260:        righteq = token[1];
                    261:         if (!isprint(lefteq) || !isprint(righteq))
                    262:                ERROR "Bizarre delimiters" FATAL;
                    263:        if (lefteq == 'o' && righteq == 'f')
                    264:                lefteq = righteq = '\0';
                    265: }

unix.superglobalmegacorp.com

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