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