Annotation of cci/usr/src/usr.bin/ratfor/rlex.c, revision 1.1.1.1

1.1       root        1: /*  documentation blocks:
                      2: bll  12/14/84   activate the option -6... in order to produce
                      3:                the character in column 6 for comment line.
                      4: */
                      5: /*#ifndef lint
                      6: static char sccsid[] = "@(#)rlex.c     1.2 (Berkeley) 8/11/83";
                      7: #endif
                      8: */
                      9: 
                     10: # include "r.h"
                     11: 
                     12: char *keyword [] = {
                     13:        "do",
                     14:        "if",
                     15:        "else",
                     16:        "for",
                     17:        "repeat",
                     18:        "until",
                     19:        "while",
                     20:        "break",
                     21:        "next",
                     22:        "define",
                     23:        "include",
                     24:        "return",
                     25:        "switch",
                     26:        "case",
                     27:        "default",
                     28:        0};
                     29: 
                     30: int keytran[] = {
                     31:        DO,
                     32:        IF,
                     33:        ELSE,
                     34:        FOR,
                     35:        REPEAT,
                     36:        UNTIL,
                     37:        WHILE,
                     38:        BREAK,
                     39:        NEXT,
                     40:        DEFINE,
                     41:        INCLUDE,
                     42:        RETURN,
                     43:        SWITCH,
                     44:        CASE,
                     45:        DEFAULT,
                     46:        0};
                     47: 
                     48: char   *fcnloc;        /* spot for "function" */
                     49: 
                     50: int    svargc;
                     51: char   **svargv;
                     52: char   *curfile[10]    = { "" };
                     53: int    infptr  = 0;
                     54: FILE   *outfil = { stdout };
                     55: FILE   *infile[10]     = { stdin };
                     56: int    linect[10];
                     57: 
                     58: int    contfld = CONTFLD;      /* place to put continuation char */
                     59: int    printcom        = 0;    /* print comments if on */
                     60: int    hollerith       = 0;    /* convert "..." to 27H... if on */
                     61: int     contchar        = '&';  /* comment line started & at col 6 */
                     62: 
                     63: #ifdef gcos
                     64: char   *ratfor "tssrat";
                     65: int    bcdrat[2];
                     66: char   *bwkmeter       ".           bwkmeter    ";
                     67: int    bcdbwk[5];
                     68: #endif
                     69: 
                     70: main(argc,argv) int argc; char **argv; {
                     71:        int i;
                     72:        while(argc>1 && argv[1][0]=='-') {
                     73:                if(argv[1][1]=='6') {
                     74:                        contfld=6;
                     75:                        if (argv[1][2]!='\0')
                     76:                                contchar = argv[1][2];
                     77:                } else if (argv[1][1] == 'C')
                     78:                        printcom++;
                     79:                else if (argv[1][1] == 'h')
                     80:                        hollerith++;
                     81:                argc--;
                     82:                argv++;
                     83:        }
                     84: 
                     85: #ifdef gcos
                     86:        if (!intss()) {
                     87:                _fixup();
                     88:                ratfor = "batrat";
                     89:        }
                     90:        ascbcd(ratfor,bcdrat,6);
                     91:        ascbcd(bwkmeter,bcdbwk,24);
                     92:        acdata(bcdrat[0],1);
                     93:        acupdt(bcdbwk[0]);
                     94:        if (!intss()) {
                     95:                if ((infile[infptr]=fopen("s*", "r")) == NULL)
                     96:                        cant("s*");
                     97:                if ((outfil=fopen("*s", "w")) == NULL)
                     98:                        cant("*s");
                     99:        }
                    100: #endif
                    101: 
                    102:        svargc = argc;
                    103:        svargv = argv;
                    104:        if (svargc > 1)
                    105:                putbak('\0');
                    106:        for (i=0; keyword[i]; i++)
                    107:                install(keyword[i], "", keytran[i]);
                    108:        fcnloc = install("function", "", 0);
                    109:        yyparse();
                    110: #ifdef gcos
                    111:        if (!intss())
                    112:                bexit(errorflag);
                    113: #endif
                    114:        exit(errorflag);
                    115: }
                    116: 
                    117: #ifdef gcos
                    118: bexit(status) {
                    119:        /* this is the batch version of exit for gcos tss */
                    120:        FILE *inf, *outf;
                    121:        char c;
                    122: 
                    123:        fclose(stderr); /* make sure diagnostics get flushed */
                    124:        if (status) /* abort */
                    125:                _nogud();
                    126: 
                    127:        /* good: copy output back to s*, call forty */
                    128: 
                    129:        fclose(outfil,"r");
                    130:        fclose(infile[0],"r");
                    131:        inf = fopen("*s", "r");
                    132:        outf = fopen("s*", "w");
                    133:        while ((c=getc(inf)) != EOF)
                    134:                putc(c, outf);
                    135:        fclose(inf,"r");
                    136:        fclose(outf,"r");
                    137:        __imok();
                    138: }
                    139: #endif
                    140: 
                    141: cant(s) char *s; {
                    142:        linect[infptr] = 0;
                    143:        curfile[infptr] = s;
                    144:        error("can't open");
                    145:        exit(1);
                    146: }
                    147: 
                    148: inclstat() {
                    149:        int c;
                    150:        char *ps;
                    151:        char fname[100];
                    152:        while ((c = getchr()) == ' ' || c == '\t');
                    153:        if (c == '(') {
                    154:                for (ps=fname; (*ps=getchr()) != ')'; ps++);
                    155:                *ps = '\0';
                    156:        } else if (c == '"' || c == '\'') {
                    157:                for (ps=fname; (*ps=getchr()) != c; ps++);
                    158:                *ps = '\0';
                    159:        } else {
                    160:                putbak(c);
                    161:                for (ps=fname; (*ps=getchr()) != ' ' &&*ps!='\t' && *ps!='\n' && *ps!=';'; ps++);
                    162:                *ps = '\0';
                    163:        }
                    164:        if ((infile[++infptr] = fopen(fname,"r")) == NULL) {
                    165:                cant(fname);
                    166:                exit(1);
                    167:        }
                    168:        linect[infptr] = 0;
                    169:        curfile[infptr] = fname;
                    170: }
                    171: 
                    172: char   str[500];
                    173: int    nstr;
                    174: 
                    175: yylex() {
                    176:        int c, t;
                    177:        for (;;) {
                    178:                while ((c=gtok(str))==' ' || c=='\n' || c=='\t')
                    179:                        ;
                    180:                yylval = c;
                    181:                if (c==';' || c=='{' || c=='}')
                    182:                        return(c);
                    183:                if (c==EOF)
                    184:                        return(0);
                    185:                yylval = (int) str;
                    186:                if (c == DIG)
                    187:                        return(DIGITS);
                    188:                t = lookup(str)->ydef;
                    189:                if (t==DEFINE)
                    190:                        defstat();
                    191:                else if (t==INCLUDE)
                    192:                        inclstat();
                    193:                else if (t > 0)
                    194:                        return(t);
                    195:                else
                    196:                        return(GOK);
                    197:        }
                    198: }
                    199: 
                    200: int    dbg     = 0;
                    201: 
                    202: yyerror(p) char *p; {;}
                    203: 
                    204: 
                    205: defstat() {
                    206:        int c,i,val,t,nlp;
                    207:        extern int nstr;
                    208:        extern char str[];
                    209:        while ((c=getchr())==' ' || c=='\t');
                    210:        if (c == '(') {
                    211:                t = '(';
                    212:                while ((c=getchr())==' ' || c=='\t');
                    213:                putbak(c);
                    214:        }
                    215:        else {
                    216:                t = ' ';
                    217:                putbak(c);
                    218:        }
                    219:        for (nstr=0; c=getchr(); nstr++) {
                    220:                if (type[c] != LET && type[c] != DIG)
                    221:                        break;
                    222:                str[nstr] = c;
                    223:        }
                    224:        putbak(c);
                    225:        str[nstr] = '\0';
                    226:        if (c != ' ' && c != '\t' && c != '\n' && c != ',') {
                    227:                error("illegal define statement");
                    228:                return;
                    229:        }
                    230:        val = nstr+1;
                    231:        if (t == ' ') {
                    232:                while ((c=getchr())==' ' || c=='\t');
                    233:                putbak(c);
                    234:                for (i=val; (c=getchr())!='\n' && c!='#' && c!='\0'; i++)
                    235:                        str[i] = c;
                    236:                putbak(c);
                    237:        } else {
                    238:                while ((c=getchr())==' ' || c=='\t' || c==',' || c=='\n');
                    239:                putbak(c);
                    240:                nlp  = 0;
                    241:                for (i=val; nlp>=0 && (c=str[i]=getchr()); i++)
                    242:                        if (c == '(')
                    243:                                nlp++;
                    244:                        else if (c == ')')
                    245:                                nlp--;
                    246:                i--;
                    247:        }
                    248:        for ( ; i>0; i--)
                    249:                if (str[i-1] != ' ' && str[i-1] != '\t')
                    250:                        break;
                    251:        str[i] = '\0';
                    252:        install(str, &str[val], 0);
                    253: }
                    254: 

unix.superglobalmegacorp.com

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