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

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

unix.superglobalmegacorp.com

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