Annotation of 42BSD/ucb/pascal/pdx/sym/printdecl.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1982 Regents of the University of California */
                      2: 
                      3: static char sccsid[] = "@(#)printdecl.c 1.2 2/14/83";
                      4: 
                      5: /*
                      6:  * Print out the type of a symbol.
                      7:  */
                      8: 
                      9: #include "defs.h"
                     10: #include "sym.h"
                     11: #include "symtab.h"
                     12: #include "tree.h"
                     13: #include "btypes.h"
                     14: #include "classes.h"
                     15: #include "sym.rep"
                     16: 
                     17: printdecl(s)
                     18: SYM *s;
                     19: {
                     20:     register SYM *t;
                     21:     BOOLEAN semicolon;
                     22: 
                     23:     semicolon = TRUE;
                     24:     switch(s->class) {
                     25:        case CONST:
                     26:            t = rtype(s->type);
                     27:            if (t->class == SCAL) {
                     28:                printf("(enumeration constant, ord %ld)", s->symvalue.iconval);
                     29:            } else {
                     30:                printf("const %s = ", s->symbol);
                     31:                if (t == t_real) {
                     32:                    printf("%g", s->symvalue.fconval);
                     33:                } else {
                     34:                    printordinal(s->symvalue.iconval, t);
                     35:                }
                     36:            }
                     37:            break;
                     38: 
                     39:        case TYPE:
                     40:            printf("type %s = ", s->symbol);
                     41:            printtype(s, s->type);
                     42:            break;
                     43: 
                     44:        case VAR:
                     45:            if (isparam(s)) {
                     46:                printf("(parameter) %s : ", s->symbol);
                     47:            } else {
                     48:                printf("var %s : ", s->symbol);
                     49:            }
                     50:            printtype(s, s->type);
                     51:            break;
                     52: 
                     53:        case REF:
                     54:            printf("(var parameter) %s : ", s->symbol);
                     55:            printtype(s, s->type);
                     56:            break;
                     57: 
                     58:        case RANGE:
                     59:        case ARRAY:
                     60:        case RECORD:
                     61:        case VARNT:
                     62:        case PTR:
                     63:            printtype(s, s);
                     64:            semicolon = FALSE;
                     65:            break;
                     66: 
                     67:        case FVAR:
                     68:            printf("(function variable) %s : ", s->symbol);
                     69:            printtype(s, s->type);
                     70:            break;
                     71: 
                     72:        case FIELD:
                     73:            printf("(field) %s : ", s->symbol);
                     74:            printtype(s, s->type);
                     75:            break;
                     76: 
                     77:        case PROC:
                     78:            printf("procedure %s", s->symbol);
                     79:            listparams(s);
                     80:            break;
                     81: 
                     82:        case PROG:
                     83:            printf("program %s", s->symbol);
                     84:            t = s->chain;
                     85:            if (t != NIL) {
                     86:                printf("(%s", t->symbol);
                     87:                for (t = t->chain; t != NIL; t = t->chain) {
                     88:                    printf(", %s", t->symbol);
                     89:                }
                     90:                printf(")");
                     91:            }
                     92:            break;
                     93: 
                     94:        case FUNC:
                     95:            printf("function %s", s->symbol);
                     96:            listparams(s);
                     97:            printf(" : ");
                     98:            printtype(s, s->type);
                     99:            break;
                    100: 
                    101:        default:
                    102:            error("class %s in printdecl", classname(s));
                    103:     }
                    104:     if (semicolon) {
                    105:        putchar(';');
                    106:     }
                    107:     putchar('\n');
                    108: }
                    109: 
                    110: /*
                    111:  * Recursive whiz-bang procedure to print the type portion
                    112:  * of a declaration.  Doesn't work quite right for variant records.
                    113:  *
                    114:  * The symbol associated with the type is passed to allow
                    115:  * searching for type names without getting "type blah = blah".
                    116:  */
                    117: 
                    118: LOCAL printtype(s, t)
                    119: SYM *s;
                    120: SYM *t;
                    121: {
                    122:     register SYM *tmp;
                    123:     long r0, r1;
                    124: 
                    125:     tmp = findtype(t);
                    126:     if (tmp != NIL && tmp != s) {
                    127:        printf("%s", tmp->symbol);
                    128:        return;
                    129:     }
                    130:     switch(t->class) {
                    131:        case VAR:
                    132:        case CONST:
                    133:        case FUNC:
                    134:        case PROC:
                    135:            panic("printtype: class %s", classname(t));
                    136:            break;
                    137: 
                    138:        case ARRAY:
                    139:            printf("array[");
                    140:            tmp = t->chain;
                    141:            for (;;) {
                    142:                printtype(tmp, tmp);
                    143:                tmp = tmp->chain;
                    144:                if (tmp == NIL) {
                    145:                    break;
                    146:                }
                    147:                printf(", ");
                    148:            }
                    149:            printf("] of ");
                    150:            printtype(t, t->type);
                    151:            break;
                    152: 
                    153:        case RECORD:
                    154:            printf("record\n");
                    155:            if (t->chain != NIL) {
                    156:                printtype(t->chain, t->chain);
                    157:            }
                    158:            printf("end");
                    159:            break;
                    160: 
                    161:        case FIELD:
                    162:            if (t->chain != NIL) {
                    163:                printtype(t->chain, t->chain);
                    164:            }
                    165:            printf("\t%s : ", t->symbol);
                    166:            printtype(t, t->type);
                    167:            printf(";\n");
                    168:            break;
                    169: 
                    170:        case RANGE:
                    171:            r0 = t->symvalue.rangev.lower;
                    172:            r1 = t->symvalue.rangev.upper;
                    173:            printordinal(r0, rtype(t->type));
                    174:            printf("..");
                    175:            printordinal(r1, rtype(t->type));
                    176:            break;
                    177: 
                    178:        case PTR:
                    179:            putchar('^');
                    180:            printtype(t, t->type);
                    181:            break;
                    182: 
                    183:        case TYPE:
                    184:            if (t->symbol != NIL) {
                    185:                printf("%s", t->symbol);
                    186:            } else {
                    187:                printtype(t, t->type);
                    188:            }
                    189:            break;
                    190: 
                    191:        case SCAL:
                    192:            printf("(");
                    193:            t = t->type->chain;
                    194:            if (t != NIL) {
                    195:                printf("%s", t->symbol);
                    196:                t = t->chain;
                    197:                while (t != NIL) {
                    198:                    printf(", %s", t->symbol);
                    199:                    t = t->chain;
                    200:                }
                    201:            } else {
                    202:                panic("empty enumeration");
                    203:            }
                    204:            printf(")");
                    205:            break;
                    206: 
                    207:        default:
                    208:            printf("(class %d)", t->class);
                    209:            break;
                    210:     }
                    211: }
                    212: 
                    213: /*
                    214:  * List the parameters of a procedure or function.
                    215:  * No attempt is made to combine like types.
                    216:  */
                    217: 
                    218: listparams(s)
                    219: SYM *s;
                    220: {
                    221:     SYM *t;
                    222: 
                    223:     if (s->chain != NIL) {
                    224:        putchar('(');
                    225:        for (t = s->chain; t != NIL; t = t->chain) {
                    226:            switch (t->class) {
                    227:                case REF:
                    228:                    printf("var ");
                    229:                    break;
                    230: 
                    231:                case FPROC:
                    232:                    printf("procedure ");
                    233:                    break;
                    234: 
                    235:                case FFUNC:
                    236:                    printf("function ");
                    237:                    break;
                    238: 
                    239:                case VAR:
                    240:                    break;
                    241: 
                    242:                default:
                    243:                    panic("unexpected class %d for parameter", t->class);
                    244:            }
                    245:            printf("%s : ", t->symbol);
                    246:            printtype(t, t->type);
                    247:            if (t->chain != NIL) {
                    248:                printf("; ");
                    249:            }
                    250:        }
                    251:        putchar(')');
                    252:     }
                    253: }

unix.superglobalmegacorp.com

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