Annotation of 3BSD/cmd/ratfor/r1.c, revision 1.1.1.1

1.1       root        1: #include "r.h"
                      2: 
                      3: #define        wasbreak        brkused[brkptr]==1 || brkused[brkptr]==3
                      4: #define        wasnext brkused[brkptr]==2 || brkused[brkptr]==3
                      5: 
                      6: int    transfer        = 0;    /* 1 if just finished retrun, break, next */
                      7: 
                      8: char   fcname[10];
                      9: char   scrat[500];
                     10: 
                     11: int    brkptr  = -1;
                     12: int    brkstk[10];     /* break label */
                     13: int    typestk[10];    /* type of loop construct */
                     14: int    brkused[10];    /* loop contains BREAK or NEXT */
                     15: 
                     16: int    forptr  = 0;
                     17: char   *forstk[10];
                     18: 
                     19: repcode() {
                     20:        transfer = 0;
                     21:        outcont(0);
                     22:        putcom("repeat");
                     23:        yyval = genlab(3);
                     24:        indent++;
                     25:        outcont(yyval);
                     26:        brkstk[++brkptr] = yyval+1;
                     27:        typestk[brkptr] = REPEAT;
                     28:        brkused[brkptr] = 0;
                     29: }
                     30: 
                     31: untils(p1,un) int p1,un; {
                     32:        outnum(p1+1);
                     33:        outtab();
                     34:        if (un > 0) {
                     35:                outcode("if(.not.");
                     36:                balpar();
                     37:                outcode(")");
                     38:        }
                     39:        transfer = 0;
                     40:        outgoto(p1);
                     41:        indent--;
                     42:        if (wasbreak)
                     43:                outcont(p1+2);
                     44:        brkptr--;
                     45: }
                     46: 
                     47: ifcode() {
                     48:        transfer = 0;
                     49:        outtab();
                     50:        outcode("if(.not.");
                     51:        balpar();
                     52:        outcode(")");
                     53:        outgoto(yyval=genlab(2));
                     54:        indent++;
                     55: }
                     56: 
                     57: elsecode(p1) {
                     58:        outgoto(p1+1);
                     59:        indent--;
                     60:        putcom("else");
                     61:        indent++;
                     62:        outcont(p1);
                     63: }
                     64: 
                     65: whilecode() {
                     66:        transfer = 0;
                     67:        outcont(0);
                     68:        putcom("while");
                     69:        brkstk[++brkptr] = yyval = genlab(2);
                     70:        typestk[brkptr] = WHILE;
                     71:        brkused[brkptr] = 0;
                     72:        outnum(yyval);
                     73:        outtab();
                     74:        outcode("if(.not.");
                     75:        balpar();
                     76:        outcode(")");
                     77:        outgoto(yyval+1);
                     78:        indent++;
                     79: }
                     80: 
                     81: whilestat(p1) int p1; {
                     82:        outgoto(p1);
                     83:        indent--;
                     84:        putcom("endwhile");
                     85:        outcont(p1+1);
                     86:        brkptr--;
                     87: }
                     88: 
                     89: balpar() {
                     90:        register c, lpar;
                     91:        while ((c=gtok(scrat)) == ' ' || c == '\t')
                     92:                ;
                     93:        if (c != '(') {
                     94:                error("missing left paren");
                     95:                return;
                     96:        }
                     97:        outcode(scrat);
                     98:        lpar = 1;
                     99:        do {
                    100:                c = gtok(scrat);
                    101:                if (c==';' || c=='{' || c=='}' || c==EOF) {
                    102:                        pbstr(scrat);
                    103:                        break;
                    104:                }
                    105:                if (c=='(')
                    106:                        lpar++;
                    107:                else if (c==')')
                    108:                        lpar--;
                    109:                else if (c == '\n') {
                    110:                        while ((c = gtok(scrat)) == ' ' || c=='\t' || c=='\n')
                    111:                                ;
                    112:                        pbstr(scrat);
                    113:                        continue;
                    114:                }
                    115:                else if (c == '=' && scrat[1] == '\0')
                    116:                        error("assigment inside conditional");
                    117:                outcode(scrat);
                    118:        } while (lpar > 0);
                    119:        if (lpar != 0)
                    120:                error("missing parenthesis");
                    121: }
                    122: 
                    123: int    labval  = 23000;
                    124: 
                    125: genlab(n){
                    126:        labval += n;
                    127:        return(labval-n);
                    128: }
                    129: 
                    130: gokcode(p1) {
                    131:        transfer = 0;
                    132:        outtab();
                    133:        outcode(p1);
                    134:        eatup();
                    135:        outdon();
                    136: }
                    137: 
                    138: eatup() {
                    139:        int t, lpar;
                    140:        char temp[100];
                    141:        lpar = 0;
                    142:        do {
                    143:                if ((t = gtok(scrat)) == ';' || t == '\n')
                    144:                        break;
                    145:                if (t == '{' || t == '}' || t == EOF) {
                    146:                        pbstr(scrat);
                    147:                        break;
                    148:                }
                    149:                if (t == ',' || t == '+' || t == '-' || t == '*' || t == '('
                    150:                  || t == '&' || t == '|' || t == '=') {
                    151:                        while (gtok(temp) == '\n')
                    152:                                ;
                    153:                        pbstr(temp);
                    154:                }
                    155:                if (t == '(')
                    156:                        lpar++;
                    157:                else if (t==')') {
                    158:                        lpar--;
                    159:                        if (lpar < 0) {
                    160:                                error("missing left paren");
                    161:                                return(1);
                    162:                        }
                    163:                }
                    164:                outcode(scrat);
                    165:        } while (lpar >= 0);
                    166:        if (lpar > 0) {
                    167:                error("missing right paren");
                    168:                return(1);
                    169:        }
                    170:        return(0);
                    171: }
                    172: 
                    173: forcode(){
                    174:        int lpar, t;
                    175:        char *ps, *qs;
                    176: 
                    177:        transfer = 0;
                    178:        outcont(0);
                    179:        putcom("for");
                    180:        yyval = genlab(3);
                    181:        brkstk[++brkptr] = yyval+1;
                    182:        typestk[brkptr] = FOR;
                    183:        brkused[brkptr] = 0;
                    184:        forstk[forptr++] = malloc(1);
                    185:        if ((t = gnbtok(scrat)) != '(') {
                    186:                error("missing left paren in FOR");
                    187:                pbstr(scrat);
                    188:                return;
                    189:        }
                    190:        if (gnbtok(scrat) != ';') {     /* real init clause */
                    191:                pbstr(scrat);
                    192:                outtab();
                    193:                if (eatup() > 0) {
                    194:                        error("illegal FOR clause");
                    195:                        return;
                    196:                }
                    197:                outdon();
                    198:        }
                    199:        if (gnbtok(scrat) == ';')       /* empty condition */
                    200:                outcont(yyval);
                    201:        else {  /* non-empty condition */
                    202:                pbstr(scrat);
                    203:                outnum(yyval);
                    204:                outtab();
                    205:                outcode("if(.not.(");
                    206:                for (lpar=0; lpar >= 0;) {
                    207:                        if ((t = gnbtok(scrat)) == ';')
                    208:                                break;
                    209:                        if (t == '(')
                    210:                                lpar++;
                    211:                        else if (t == ')') {
                    212:                                lpar--;
                    213:                                if (lpar < 0) {
                    214:                                        error("missing left paren in FOR clause");
                    215:                                        return;
                    216:                                }
                    217:                        }
                    218:                        if (t != '\n')
                    219:                                outcode(scrat);
                    220:                }
                    221:                outcode("))");
                    222:                outgoto(yyval+2);
                    223:                if (lpar < 0)
                    224:                        error("invalid FOR clause");
                    225:        }
                    226:        ps = scrat;
                    227:        for (lpar=0; lpar >= 0;) {
                    228:                if ((t = gtok(ps)) == '(')
                    229:                        lpar++;
                    230:                else if (t == ')')
                    231:                        lpar--;
                    232:                if (lpar >= 0 && t != '\n')
                    233:                        while(*ps)
                    234:                                ps++;
                    235:        }
                    236:        *ps = '\0';
                    237:        qs = forstk[forptr-1] = malloc((unsigned)(ps-scrat+1));
                    238:        ps = scrat;
                    239:        while (*qs++ = *ps++)
                    240:                ;
                    241:        indent++;
                    242: }
                    243: 
                    244: forstat(p1) int p1; {
                    245:        char *bp, *q;
                    246:        bp = forstk[--forptr];
                    247:        if (wasnext)
                    248:                outnum(p1+1);
                    249:        if (nonblank(bp)){
                    250:                outtab();
                    251:                outcode(bp);
                    252:                outdon();
                    253:        }
                    254:        outgoto(p1);
                    255:        indent--;
                    256:        putcom("endfor");
                    257:        outcont(p1+2);
                    258:        for (q=bp; *q++;);
                    259:        free(bp);
                    260:        brkptr--;
                    261: }
                    262: 
                    263: retcode() {
                    264:        register c;
                    265:        if ((c = gnbtok(scrat)) != '\n' && c != ';' && c != '}') {
                    266:                pbstr(scrat);
                    267:                outtab();
                    268:                outcode(fcname);
                    269:                outcode(" = ");
                    270:                eatup();
                    271:                outdon();
                    272:        }
                    273:        else if (c == '}')
                    274:                pbstr(scrat);
                    275:        outtab();
                    276:        outcode("return");
                    277:        outdon();
                    278:        transfer = 1;
                    279: }
                    280: 
                    281: docode() {
                    282:        transfer = 0;
                    283:        outtab();
                    284:        outcode("do ");
                    285:        yyval = genlab(2);
                    286:        brkstk[++brkptr] = yyval;
                    287:        typestk[brkptr] = DO;
                    288:        brkused[brkptr] = 0;
                    289:        outnum(yyval);
                    290:        eatup();
                    291:        outdon();
                    292:        indent++;
                    293: }
                    294: 
                    295: dostat(p1) int p1; {
                    296:        outcont(p1);
                    297:        indent--;
                    298:        if (wasbreak)
                    299:                outcont(p1+1);
                    300:        brkptr--;
                    301: }
                    302: 
                    303: #ifdef gcos
                    304: #define        atoi(s) (*s-'0')        /* crude!!! */
                    305: #endif
                    306: 
                    307: breakcode() {
                    308:        int level, t;
                    309: 
                    310:        level = 0;
                    311:        if ((t=gnbtok(scrat)) == DIG)
                    312:                level = atoi(scrat) - 1;
                    313:        else if (t != ';')
                    314:                pbstr(scrat);
                    315:        if (brkptr-level < 0)
                    316:                error("illegal BREAK");
                    317:        else {
                    318:                outgoto(brkstk[brkptr-level]+1);
                    319:                brkused[brkptr-level] |= 1;
                    320:        }
                    321:        transfer = 1;
                    322: }
                    323: 
                    324: nextcode() {
                    325:        int level, t;
                    326: 
                    327:        level = 0;
                    328:        if ((t=gnbtok(scrat)) == DIG)
                    329:                level = atoi(scrat) - 1;
                    330:        else if (t != ';')
                    331:                pbstr(scrat);
                    332:        if (brkptr-level < 0)
                    333:                error("illegal NEXT");
                    334:        else {
                    335:                outgoto(brkstk[brkptr-level]);
                    336:                brkused[brkptr-level] |= 2;
                    337:        }
                    338:        transfer = 1;
                    339: }
                    340: 
                    341: nonblank(s) char *s; {
                    342:        int c;
                    343:        while (c = *s++)
                    344:                if (c!=' ' && c!='\t' && c!='\n')
                    345:                        return(1);
                    346:        return(0);
                    347: }
                    348: 
                    349: int    errorflag       = 0;
                    350: 
                    351: error(s1) char *s1; {
                    352:        if (errorflag == 0)
                    353:                fprintf(stderr, "ratfor:");
                    354:        fprintf(stderr, "error at line %d, file %s: ",linect[infptr],curfile[infptr]);
                    355:        fprintf(stderr, s1);
                    356:        fprintf(stderr, "\n");
                    357:        errorflag = 1;
                    358: }
                    359: 
                    360: errcode() {
                    361:        int c;
                    362:        if (errorflag == 0)
                    363:                fprintf(stderr, "******\n");
                    364:        fprintf(stderr, "*****F ratfor:");
                    365:        fprintf(stderr, "syntax error, line %d, file %s\n", linect[infptr], curfile[infptr]);
                    366:        while ((c=getchr())!=';' && c!='}' && c!='\n' && c!=EOF && c!='\0')
                    367:                ;
                    368:        if (c == EOF || c == '\0')
                    369:                putbak(c);
                    370:        errorflag = 1;
                    371: }

unix.superglobalmegacorp.com

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