Annotation of 43BSD/contrib/B/src/bint/b2dis.c, revision 1.1

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: 
        !             3: /*
        !             4:   $Header: b2dis.c,v 1.4 85/08/22 16:54:27 timo Exp $
        !             5: */
        !             6: 
        !             7: #include "b.h"
        !             8: #include "b1obj.h"
        !             9: #include "b2par.h"
        !            10: #include "b2nod.h"
        !            11: 
        !            12: FILE *d_file;
        !            13: 
        !            14: #define Indent "    "
        !            15: 
        !            16: Hidden intlet ilevel= 0;
        !            17: 
        !            18: Hidden Procedure set_ilevel() {
        !            19:        intlet i;
        !            20:        for (i= 0; i<ilevel; i++) fprintf(d_file, Indent);
        !            21: }
        !            22: 
        !            23: Hidden bool new_line= Yes, in_comment= No;
        !            24: 
        !            25: Hidden Procedure put_char(c) char c; {
        !            26:        if (new_line && !in_comment) set_ilevel();
        !            27:        putc(c, d_file);
        !            28:        new_line= No;
        !            29: }
        !            30: 
        !            31: Hidden Procedure put_string(s) string s; {
        !            32:        if (new_line && !in_comment) set_ilevel();
        !            33:        fprintf(d_file, "%s", s);
        !            34:        new_line= No;
        !            35: }
        !            36: 
        !            37: Hidden Procedure put_newline() {
        !            38:        putc('\n', d_file);
        !            39:        new_line= Yes;
        !            40: }
        !            41: 
        !            42: #define Putspace       put_char(' ')
        !            43: 
        !            44: /* ******************************************************************** */
        !            45: 
        !            46: Hidden bool displ_one_line, stop_displ;
        !            47: 
        !            48: Visible Procedure display(f, v, one_line) FILE *f; parsetree v; bool one_line; {
        !            49:        d_file= f;
        !            50:        ilevel= 0;
        !            51:        displ_one_line= one_line;
        !            52:        stop_displ= No;
        !            53:        new_line= !one_line;
        !            54:        displ(v);
        !            55:        if (!new_line) put_newline();
        !            56: }
        !            57: 
        !            58: /* ******************************************************************** */
        !            59: 
        !            60: char *text[] = {
        !            61:        /* HOW_TO */            "HOW'TO #h1:#c2#b34",
        !            62:        /* YIELD */             "YIELD 2:#c3#b45",
        !            63:        /* TEST */              "TEST 2:#c3#b45",
        !            64:        /* REFINEMENT */        "0:#c1#b23",
        !            65:        /* SUITE */             "1#c23",
        !            66: 
        !            67:        /* PUT */               "PUT 0 IN 1",
        !            68:        /* INSERT */            "INSERT 0 IN 1",
        !            69:        /* REMOVE */            "REMOVE 0 FROM 1",
        !            70:        /* CHOOSE */            "CHOOSE 0 FROM 1",
        !            71:        /* DRAW */              "DRAW 0",
        !            72:        /* SET_RANDOM */        "SET'RANDOM 0",
        !            73:        /* DELETE */            "DELETE 0",
        !            74:        /* CHECK */             "CHECK 0",
        !            75:        /* SHARE */             "SHARE 0",
        !            76: 
        !            77:        /* WRITE */             "WRITE #j",
        !            78:        /* READ */              "READ 0 EG 1",
        !            79:        /* READ_RAW */          "READ 0 RAW",
        !            80: 
        !            81:        /* IF */                "IF 0:#c1#b2",
        !            82:        /* WHILE */             "WHILE 0:#c1#b2",
        !            83:        /* FOR */               "FOR 0 IN 1:#c2#b3",
        !            84: 
        !            85:        /* SELECT */            "SELECT:#c0#b1",
        !            86:        /* TEST_SUITE */        "1#d:#c2#b34",
        !            87:        /* ELSE */              "ELSE:#c1#b2",
        !            88: 
        !            89:        /* QUIT */              "QUIT",
        !            90:        /* RETURN */            "RETURN 0",
        !            91:        /* REPORT */            "REPORT 0",
        !            92:        /* SUCCEED */           "SUCCEED",
        !            93:        /* FAIL */              "FAIL",
        !            94: 
        !            95:        /* USER_COMMAND */      "#h1",
        !            96:        /* EXTENDED_COMMAND */  "0 ...",
        !            97: 
        !            98:        /* TAG */               "0",
        !            99:        /* COMPOUND */          "(0)",
        !           100:        /* COLLATERAL */        "#a0",
        !           101:        /* SELECTION */         "0[1]",
        !           102:        /* BEHEAD */            "0@1",
        !           103:        /* CURTAIL */           "0|1",
        !           104:        /* UNPARSED */          "1",
        !           105:        /* MONF */              "#l",
        !           106:        /* DYAF */              "#k",
        !           107:        /* NUMBER */            "1",
        !           108:        /* TEXT_DIS */          "#e",
        !           109:        /* TEXT_LIT */          "#f",
        !           110:        /* TEXT_CONV */         "`0`1",
        !           111:        /* ELT_DIS */           "{}",
        !           112:        /* LIST_DIS */          "{#i0}",
        !           113:        /* RANGE_DIS */         "{0..1}",
        !           114:        /* TAB_DIS */           "{#g0}",
        !           115:        /* AND */               "0 AND 1",
        !           116:        /* OR */                "0 OR 1",
        !           117:        /* NOT */               "NOT 0",
        !           118:        /* SOME_IN */           "SOME 0 IN 1 HAS 2",
        !           119:        /* EACH_IN */           "EACH 0 IN 1 HAS 2",
        !           120:        /* NO_IN */             "NO 0 IN 1 HAS 2",
        !           121:        /* SOME_PARSING */      "SOME 0 PARSING 1 HAS 2",
        !           122:        /* EACH_PARSING */      "EACH 0 PARSING 1 HAS 2",
        !           123:        /* NO_PARSING */        "NO 0 PARSING 1 HAS 2",
        !           124:        /* MONPRD */            "0 1",
        !           125:        /* DYAPRD */            "0 1 2",
        !           126:        /* LESS_THAN */         "0 < 1",
        !           127:        /* AT_MOST */           "0 <= 1",
        !           128:        /* GREATER_THAN */      "0 > 1",
        !           129:        /* AT_LEAST */          "0 >= 1",
        !           130:        /* EQUAL */             "0 = 1",
        !           131:        /* UNEQUAL */           "0 <> 1",
        !           132:        /* Nonode */            "",
        !           133: 
        !           134:        /* TAGformal */         "0",
        !           135:        /* TAGlocal */          "0",
        !           136:        /* TAGglobal */         "0",
        !           137:        /* TAGmystery */        "0",
        !           138:        /* TAGrefinement */     "0",
        !           139:        /* TAGzerfun */         "0",
        !           140:        /* TAGzerprd */         "0",
        !           141: };
        !           142: 
        !           143: #define Is_digit(d) ((d) >= '0' && (d) <= '9')
        !           144: #define Fld(v, t) *Branch(v, (*(t) - '0') + First_fieldnr)
        !           145: 
        !           146: Hidden Procedure displ(v) value v; {
        !           147:        if (Is_text(v)) put_string(strval(v));
        !           148:        else if (Is_parsetree(v)) {
        !           149:                string t= text[nodetype(v)];
        !           150:                while (*t) {
        !           151:                        if (Is_digit(*t)) displ(Fld(v, t));
        !           152:                        else if (*t == '#') {
        !           153:                                special(v, &t);
        !           154:                                if (stop_displ) return;
        !           155:                        } else put_char(*t);
        !           156:                        t++;
        !           157:                }
        !           158:        }
        !           159: }
        !           160: 
        !           161: Hidden Procedure special(v, t) parsetree v; string *t; {
        !           162:        (*t)++;
        !           163:        switch (**t) {
        !           164:                case 'a':       d_collateral(Fld(v, ++*t)); break;
        !           165:                case 'b':       indent(Fld(v, ++*t)); break;
        !           166:                case 'c':       d_comment(Fld(v, ++*t)); break;
        !           167:                case 'd':       /* test suite */
        !           168:                                (*t)++;
        !           169:                                if (!new_line) /* there was a command */
        !           170:                                        put_char(**t);
        !           171:                                break;
        !           172:                case 'e':       d_textdis(v); break;
        !           173:                case 'f':       d_textlit(v); break;
        !           174:                case 'g':       d_tabdis(Fld(v, ++*t)); break;
        !           175:                case 'h':       d_actfor_compound(Fld(v, ++*t)); break;
        !           176:                case 'i':       d_listdis(Fld(v, ++*t)); break;
        !           177:                case 'j':       d_write(v); break;
        !           178:                case 'k':       d_dyaf(v); break;
        !           179:                case 'l':       d_monf(v); break;
        !           180:        }
        !           181: }
        !           182: 
        !           183: Hidden Procedure indent(v) parsetree v; {
        !           184:        if (displ_one_line) { stop_displ= Yes; return; }
        !           185:        ilevel++;
        !           186:        displ(v);
        !           187:        ilevel--;
        !           188: }
        !           189: 
        !           190: Hidden bool no_space_before_comment(v) value v; {
        !           191:        value c, t; bool b;
        !           192:        c= curtail(v, one); t= mk_text("\\");
        !           193:        b= compare(c, t) == 0;
        !           194:        release(c); release(t);
        !           195:        return b;
        !           196: }
        !           197: 
        !           198: 
        !           199: Hidden Procedure d_comment(v) value v; {
        !           200:        if ( v != Vnil) {
        !           201:                in_comment= Yes;
        !           202:                if (!new_line && no_space_before_comment(v)) Putspace;
        !           203:                displ(v);
        !           204:                in_comment= No;
        !           205:        }
        !           206:        if (!new_line) put_newline();
        !           207: }
        !           208: 
        !           209: Hidden value quote= Vnil;
        !           210: 
        !           211: Hidden Procedure d_textdis(v) parsetree v; {
        !           212:        value s_quote= quote;
        !           213:        quote= *Branch(v, XDIS_QUOTE);
        !           214:        displ(quote);
        !           215:        displ(*Branch(v, XDIS_NEXT));
        !           216:        displ(quote);
        !           217:        quote= s_quote;
        !           218: }
        !           219: 
        !           220: Hidden Procedure d_textlit(v) parsetree v; {
        !           221:        value w;
        !           222:        displ(w= *Branch(v, XLIT_TEXT));
        !           223:        if (character(w)) {
        !           224:                value c= mk_text("`");
        !           225:                if (compare(quote, w) == 0 || compare(c, w) == 0) displ(w);
        !           226:                release(c);
        !           227:        }
        !           228:        displ(*Branch(v, XLIT_NEXT));
        !           229: }
        !           230: 
        !           231: Hidden Procedure d_tabdis(v) value v; {
        !           232:        intlet k, len= Nfields(v);
        !           233:        k_Over_len {
        !           234:                if (k>0) put_string("; ");
        !           235:                put_char('[');
        !           236:                displ(*Field(v, k));
        !           237:                put_string("]: ");
        !           238:                displ(*Field(v, ++k));
        !           239:        }
        !           240: }
        !           241: 
        !           242: Hidden Procedure d_collateral(v) value v; {
        !           243:        intlet k, len= Nfields(v);
        !           244:        k_Over_len {
        !           245:                if (k>0) put_string(", ");
        !           246:                displ(*Field(v, k));
        !           247:        }
        !           248: }
        !           249: 
        !           250: Hidden Procedure d_listdis(v) value v; {
        !           251:        intlet k, len= Nfields(v);
        !           252:        k_Over_len {
        !           253:                if (k>0) put_string("; ");
        !           254:                displ(*Field(v, k));
        !           255:        }
        !           256: }
        !           257: 
        !           258: Hidden Procedure d_actfor_compound(v) value v; {
        !           259:        while (v != Vnil) {
        !           260:                displ(*Branch(v, ACT_KEYW));
        !           261:                if (*Branch(v, ACT_EXPR) != Vnil) {
        !           262:                        Putspace;
        !           263:                        displ(*Branch(v, ACT_EXPR));
        !           264:                }
        !           265:                v= *Branch(v, ACT_NEXT);
        !           266:                if (v != Vnil) Putspace;
        !           267:        }
        !           268: }
        !           269: 
        !           270: Hidden Procedure d_write(v) parsetree v; {
        !           271:        value l_lines, e, r_lines;
        !           272:        l_lines= *Branch(v, WRT_L_LINES);
        !           273:        e= *Branch(v, WRT_EXPR);
        !           274:        r_lines= *Branch(v, WRT_R_LINES);
        !           275:        displ(l_lines);
        !           276:        if (e != NilTree) {
        !           277:                value n= size(l_lines);
        !           278:                if (intval(n) > 0) Putspace;
        !           279:                release(n);
        !           280:                displ(e);
        !           281:                n= size(r_lines);
        !           282:                if (intval(n) > 0) Putspace;
        !           283:                release(n);
        !           284:        }
        !           285:        displ(r_lines);
        !           286: }
        !           287: 
        !           288: Hidden Procedure d_dyaf(v) parsetree v; {
        !           289:        parsetree l, r; value name;
        !           290:        l= *Branch(v, DYA_LEFT);
        !           291:        r= *Branch(v, DYA_RIGHT);
        !           292:        name= *Branch(v, DYA_NAME);
        !           293:        displ(l);
        !           294:        if (is_b_tag(name) || nodetype(r) == MONF) {
        !           295:                Putspace;
        !           296:                displ(name);
        !           297:                Putspace;
        !           298:        }
        !           299:        else displ(name);
        !           300:        displ(r);
        !           301: }
        !           302: 
        !           303: Hidden Procedure d_monf(v) parsetree v; {
        !           304:        parsetree r; value name;
        !           305:        name= *Branch(v, MON_NAME);
        !           306:        r= *Branch(v, MON_RIGHT);
        !           307:        displ(name);
        !           308:        if (is_b_tag(name)) {
        !           309:                switch (nodetype(r)) {
        !           310:                        case MONF:
        !           311:                                if (!is_b_tag(*Branch(r, MON_NAME))) break;
        !           312:                        case SELECTION:
        !           313:                        case BEHEAD:
        !           314:                        case CURTAIL:
        !           315:                        case TAG:
        !           316:                        case TAGformal:
        !           317:                        case TAGlocal:
        !           318:                        case TAGglobal:
        !           319:                        case TAGmystery:
        !           320:                        case TAGrefinement:
        !           321:                        case TAGzerfun:
        !           322:                        case TAGzerprd:
        !           323:                        case NUMBER:
        !           324:                        case TEXT_DIS:
        !           325:                                Putspace;
        !           326:                                break;
        !           327:                        default:
        !           328:                                break;
        !           329:                }
        !           330:        }
        !           331:        displ(r);
        !           332: }

unix.superglobalmegacorp.com

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