Annotation of 43BSDReno/pgrm/pascal/pdx/sym/printdecl.c, revision 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.