Annotation of 43BSD/usr.bin/ratfor/r1.c, revision 1.1

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

unix.superglobalmegacorp.com

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