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

unix.superglobalmegacorp.com

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