Annotation of 42BSD/ucb/pascal/pxp/rmothers.c, revision 1.1

1.1     ! root        1: static char *sccsid = "@(#)rmothers.c  1.3 (Berkeley) 7/26/83";
        !             2: /* Copyright (c) 1983 Regents of the University of California */
        !             3: #ifdef RMOTHERS
        !             4:     /* and the rest of the file */
        !             5: 
        !             6: #include "0.h"
        !             7: #include "tree.h"
        !             8: 
        !             9:     /*
        !            10:      * translate extended case statements to pascal (for tex).
        !            11:      * don knuth should know better.  enough said.
        !            12:      *         ... peter 5/4/83
        !            13:      *
        !            14:      * extended case statements have the form:
        !            15:      *     case expresion of
        !            16:      *         label1,label2,...: statement1;
        !            17:      *         ...
        !            18:      *         others: otherstatement
        !            19:      *         end
        !            20:      * which i am going to translate to:
        !            21:      *     if expression in [ label1,label2,...] then
        !            22:      *         case expression of
        !            23:      *             label1,label2,...: statement1;
        !            24:      *             ...
        !            25:      *             end
        !            26:      *     else otherstatement
        !            27:      * which has the effect that the expression will be evaluated twice.
        !            28:      * i've looked very briefly at all cases in tex and
        !            29:      * they seem to be variables or pure functions.
        !            30:      * for simplicity i'm assuming that the others is the last labeled
        !            31:      * statement, and that no other labels appear with the label others.
        !            32:      * this appears correct from the tex82 documentation.
        !            33:      */
        !            34: 
        !            35:     /*
        !            36:      * given a case statement tree and the address of an others pointer,
        !            37:      * amputate the others statement from the case statement tree
        !            38:      * and hang it on the the others pointer.
        !            39:      *
        !            40:      * Case statement
        !            41:      * r       [0]     T_CASE
        !            42:      *         [1]     lineof "case"
        !            43:      *         [2]     expression
        !            44:      *         [3]     list of cased statements:
        !            45:      *                 cstat   [0]     T_CSTAT
        !            46:      *                         [1]     lineof ":"
        !            47:      *                         [2]     list of constant labels
        !            48:      *                         [3]     statement
        !            49:      */
        !            50: needscaseguard(r, otherspp)
        !            51:     int        *r;
        !            52:     int        **otherspp;
        !            53: {
        !            54:     int        *statlistp;
        !            55:     int        *cutpointer;
        !            56:     int        *lstatementp;
        !            57:     int        *lablistp;
        !            58:     int        *label;
        !            59:     int        hasothers;
        !            60: 
        !            61:     *otherspp = NIL;
        !            62:     hasothers = 0;
        !            63:     if (!rmothers) {
        !            64:        return hasothers;
        !            65:     }
        !            66:     for (cutpointer = &r[3], statlistp = r[3];
        !            67:         statlistp != NIL;
        !            68:         cutpointer = &statlistp[2], statlistp = statlistp[2]) {
        !            69:        lstatementp = statlistp[1];
        !            70:        if (lstatementp == NIL)
        !            71:            continue;
        !            72:        lablistp = lstatementp[2];
        !            73:        if (lablistp != NIL) {
        !            74:            label = lablistp[1];
        !            75:                /* only look at the first label */
        !            76:            if (label != NIL &&
        !            77:                label[0] == T_ID && !strcmp(label[1],"others")) {
        !            78:                    hasothers = 1;
        !            79:                    *otherspp = lstatementp[3];
        !            80:                    *cutpointer = NIL;
        !            81:                    if (statlistp[2] != NIL) {
        !            82:                        panic("others not last case");
        !            83:                    }
        !            84:                    if (lablistp[2] != NIL) {
        !            85:                        panic("others not only case label");
        !            86:                    }
        !            87:            }
        !            88:        }
        !            89:     }
        !            90:     return hasothers;
        !            91: }
        !            92: 
        !            93: precaseguard(r)
        !            94:     int        *r;
        !            95: {
        !            96:     int        *statlistp;
        !            97:     int        *cutpointer;
        !            98:     int        *lstatementp;
        !            99:     int        *lablistp;
        !           100:     int        *label;
        !           101:     int        hadsome;
        !           102:     int        counter;
        !           103: 
        !           104:     if (!rmothers) {
        !           105:        return;
        !           106:     }
        !           107:     ppkw("if");
        !           108:     ppspac();
        !           109:     rvalue(r[2], NIL);
        !           110:     ppspac();
        !           111:     ppkw("in");
        !           112:     ppgoin(DECL);
        !           113:     ppnl();
        !           114:     indent();
        !           115:     ppsep("[");
        !           116:     hadsome = 0;
        !           117:     counter = 0;
        !           118:     for (statlistp = r[3]; statlistp != NIL; statlistp = statlistp[2]) {
        !           119:        lstatementp = statlistp[1];
        !           120:        if (lstatementp == NIL)
        !           121:            continue;
        !           122:        for (lablistp = lstatementp[2];lablistp != NIL;lablistp = lablistp[2]) {
        !           123:            label = lablistp[1];
        !           124:            if (hadsome) {
        !           125:                if (counter < 8) {
        !           126:                    ppsep(", ");
        !           127:                } else {
        !           128:                    ppsep(",");
        !           129:                    ppnl();
        !           130:                    indent();
        !           131:                    ppspac();
        !           132:                    counter = 0;
        !           133:                }
        !           134:            } else {
        !           135:                hadsome = 1;
        !           136:            }
        !           137:            gconst(label);
        !           138:            counter += 1;
        !           139:        }
        !           140:     }
        !           141:     ppsep("]");
        !           142:     ppspac();
        !           143:     ppkw("then");
        !           144:     ppgoout(DECL);
        !           145:     ppgoin(STAT);
        !           146:     ppnl();
        !           147:     indent();
        !           148: }
        !           149: 
        !           150:     /*
        !           151:      * given an others statement, hang it on the else branch of the guard.
        !           152:      */
        !           153: postcaseguard(othersp)
        !           154:     int        *othersp;
        !           155: {
        !           156:     if (!rmothers) {
        !           157:        return;
        !           158:     }
        !           159:     ppgoout(STAT);
        !           160:     ppnl();
        !           161:     indent();
        !           162:     ppkw("else");
        !           163:     ppgoin(STAT);
        !           164:     if (othersp == NIL) {
        !           165:            /*
        !           166:             *  this will print a call to the routine ``null''.
        !           167:             *  but it has to be checked first, or we will indirect through
        !           168:             *  NIL to check the statement type.
        !           169:             */
        !           170:        statement(NIL);
        !           171:        ppgoout(STAT);
        !           172:        return;
        !           173:     }
        !           174:     if (othersp[0] == T_BLOCK) {
        !           175:        ppnl();
        !           176:        indent();
        !           177:        ppstbl1(othersp, STAT);
        !           178:        ppstbl2();
        !           179:     } else {
        !           180:        statement(othersp);
        !           181:     }
        !           182:     ppgoout(STAT);
        !           183: }
        !           184: #endif RMOTHERS

unix.superglobalmegacorp.com

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