|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.