Annotation of 43BSD/usr.bin/ratfor/rio.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)rio.c      1.2 (Berkeley) 8/11/83";
                      3: #endif
                      4: 
                      5: #include "r.h"
                      6: char   ibuf[BUFSIZ];
                      7: char   *ip = ibuf;
                      8: 
                      9: char   type[] = {
                     10:        0,      CRAP,   CRAP,   CRAP,   CRAP,   CRAP,   CRAP,   CRAP,
                     11:        CRAP,   '\t',   '\n',   CRAP,   CRAP,   CRAP,   CRAP,   CRAP,
                     12:        CRAP,   CRAP,   CRAP,   CRAP,   CRAP,   CRAP,   CRAP,   CRAP,
                     13:        CRAP,   CRAP,   CRAP,   CRAP,   CRAP,   CRAP,   CRAP,   CRAP,
                     14:        ' ',    '!',    '"',    '#',    '$',    '%',    '&',    '\'',
                     15:        '(',    ')',    '*',    '+',    ',',    '-',    '.',    '/',
                     16:        DIG,    DIG,    DIG,    DIG,    DIG,    DIG,    DIG,    DIG,
                     17:        DIG,    DIG,    ':',    ';',    '<',    '=',    '>',    '?',
                     18:        '@',    LET,    LET,    LET,    LET,    LET,    LET,    LET,
                     19:        LET,    LET,    LET,    LET,    LET,    LET,    LET,    LET,
                     20:        LET,    LET,    LET,    LET,    LET,    LET,    LET,    LET,
                     21:        LET,    LET,    LET,    '[',    '\\',   ']',    '^',    '_',
                     22:        '`',    LET,    LET,    LET,    LET,    LET,    LET,    LET,
                     23:        LET,    LET,    LET,    LET,    LET,    LET,    LET,    LET,
                     24:        LET,    LET,    LET,    LET,    LET,    LET,    LET,    LET,
                     25:        LET,    LET,    LET,    '{',    '|',    '}',    '~',    0,
                     26: };
                     27: 
                     28: gtok(s) char *s; {     /* get token into s */
                     29:        register c, t;
                     30:        register char *p;
                     31:        struct nlist *q;
                     32: 
                     33:        for(;;) {
                     34:                p = s;
                     35:                *p++ = c = getchr();
                     36:                switch(t = type[c]) {
                     37:                case 0:
                     38:                        if (infptr > 0) {
                     39:                                fclose(infile[infptr]);
                     40:                                infptr--;
                     41:                                continue;
                     42:                        }
                     43:                        if (svargc > 1) {
                     44:                                svargc--;
                     45:                                svargv++;
                     46:                                if (infile[infptr] != stdin)
                     47:                                        fclose(infile[infptr]);
                     48:                                if( (infile[infptr] = fopen(*svargv,"r")) == NULL )
                     49:                                        cant(*svargv);
                     50:                                linect[infptr] = 0;
                     51:                                curfile[infptr] = *svargv;
                     52:                                continue;
                     53:                        }
                     54:                        return(EOF);    /* real eof */
                     55:                case ' ':
                     56:                case '\t':
                     57:                        while ((c = getchr()) == ' ' || c == '\t')
                     58:                                ;       /* skip others */
                     59:                        if (c == COMMENT || c == '_') {
                     60:                                putbak(c);
                     61:                                continue;
                     62:                        }
                     63:                        if (c != '\n') {
                     64:                                putbak(c);
                     65:                                *p = '\0';
                     66:                                return(' ');
                     67:                        } else {
                     68:                                *s = '\n';
                     69:                                *(s+1) = '\0';
                     70:                                return(*s);
                     71:                        }
                     72:                case '_':
                     73:                        while ((c = getchr()) == ' ' || c == '\t')
                     74:                                ;
                     75:                        if (c == COMMENT) {
                     76:                                putbak(c);
                     77:                                gtok(s);        /* recursive */
                     78:                        }
                     79:                        else if (c != '\n')
                     80:                                putbak(c);
                     81:                        continue;
                     82:                case LET:
                     83:                case DIG:
                     84:                        while ((t=type[*p = getchr()]) == LET || t == DIG)
                     85:                                p++;
                     86:                        putbak(*p);
                     87:                        *p = '\0';
                     88:                        if ((q = lookup(s))->name != NULL && q->ydef == 0) {    /* found but not keyword */
                     89:                                if (q->def != fcnloc) { /* not "function" */
                     90:                                        pbstr(q->def);
                     91:                                        continue;
                     92:                                }
                     93:                                getfname();     /* recursive gtok */
                     94:                        }
                     95:                        for (p=s; *p; p++)
                     96:                                if (*p>='A' && *p<='Z')
                     97:                                        *p += 'a' - 'A';
                     98:                        for (p=s; *p; p++)
                     99:                                if (*p < '0' || *p > '9')
                    100:                                        return(LET);
                    101:                        return(DIG);
                    102:                case '[':
                    103:                        *p = '\0';
                    104:                        return('{');
                    105:                case ']':
                    106:                        *p = '\0';
                    107:                        return('}');
                    108:                case '$':
                    109:                case '\\':
                    110:                        if ((*p = getchr()) == '(' || *p == ')') {
                    111:                                putbak(*p=='(' ? '{' : '}');
                    112:                                continue;
                    113:                        }
                    114:                        if (*p == '"' || *p == '\'')
                    115:                                p++;
                    116:                        else
                    117:                                putbak(*p);
                    118:                        *p = '\0';
                    119:                        return('$');
                    120:                case COMMENT:
                    121:                        comment[comptr++] = 'c';
                    122:                        while ((comment[comptr++] = getchr()) != '\n')
                    123:                                ;
                    124:                        flushcom();
                    125:                        *s = '\n';
                    126:                        *(s+1) = '\0';
                    127:                        return(*s);
                    128:                case '"':
                    129:                case '\'':
                    130:                        for (; (*p = getchr()) != c; p++) {
                    131:                                if (*p == '\\')
                    132:                                        *++p = getchr();
                    133:                                if (*p == '\n') {
                    134:                                        error("missing quote");
                    135:                                        putbak('\n');
                    136:                                        break;
                    137:                                }
                    138:                        }
                    139:                        *p++ = c;
                    140:                        *p = '\0';
                    141:                        return(QUOTE);
                    142:                case '%':
                    143:                        while ((*p = getchr()) != '\n')
                    144:                                p++;
                    145:                        putbak(*p);
                    146:                        *p = '\0';
                    147:                        return('%');
                    148:                case '>': case '<': case '=': case '!': case '^':
                    149:                        return(peek(p, '='));
                    150:                case '&':
                    151:                        return(peek(p, '&'));
                    152:                case '|':
                    153:                        return(peek(p, '|'));
                    154:                case CRAP:
                    155:                        continue;
                    156:                default:
                    157:                        *p = '\0';
                    158:                        return(*s);
                    159:                }
                    160:        }
                    161: }
                    162: 
                    163: gnbtok(s) char *s; {
                    164:        register c;
                    165:        while ((c = gtok(s)) == ' ' || c == '\t')
                    166:                ;
                    167:        return(c);
                    168: }
                    169: 
                    170: getfname() {
                    171:        while (gtok(fcname) == ' ')
                    172:                ;
                    173:        pbstr(fcname);
                    174:        putbak(' ');
                    175: }
                    176: 
                    177: peek(p, c1) char *p, c1; {
                    178:        register c;
                    179:        c = *(p-1);
                    180:        if ((*p = getchr()) == c1)
                    181:                p++;
                    182:        else
                    183:                putbak(*p);
                    184:        *p = '\0';
                    185:        return(c);
                    186: }
                    187: 
                    188: pbstr(str)
                    189: register char *str;
                    190: {
                    191:        register char *p;
                    192: 
                    193:        p = str;
                    194:        while (*p++);
                    195:        --p;
                    196:        if (ip >= &ibuf[BUFSIZ]) {
                    197:                error("pushback overflow");
                    198:                exit(1);
                    199:        }
                    200:        while (p > str)
                    201:                putbak(*--p);
                    202: }
                    203: 
                    204: getchr() {
                    205:        register c;
                    206: 
                    207:        if (ip > ibuf)
                    208:                return(*--ip);
                    209:        c = getc(infile[infptr]);
                    210:        if (c == '\n')
                    211:                linect[infptr]++;
                    212:        if (c == EOF)
                    213:                return(0);
                    214:        return(c);
                    215: }

unix.superglobalmegacorp.com

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