15528Slinton /* Copyright (c) 1982 Regents of the University of California */ 25528Slinton 3*11066Slinton static char sccsid[] = "@(#)printdecl.c 1.2 02/14/83"; 45528Slinton 55528Slinton /* 6*11066Slinton * Print out the type of a symbol. 75528Slinton */ 85528Slinton 95528Slinton #include "defs.h" 105528Slinton #include "sym.h" 115528Slinton #include "symtab.h" 125528Slinton #include "tree.h" 135528Slinton #include "btypes.h" 145528Slinton #include "classes.h" 155528Slinton #include "sym.rep" 165528Slinton 175528Slinton printdecl(s) 185528Slinton SYM *s; 195528Slinton { 20*11066Slinton register SYM *t; 21*11066Slinton BOOLEAN semicolon; 225528Slinton 23*11066Slinton semicolon = TRUE; 24*11066Slinton switch(s->class) { 25*11066Slinton case CONST: 26*11066Slinton t = rtype(s->type); 27*11066Slinton if (t->class == SCAL) { 28*11066Slinton printf("(enumeration constant, ord %ld)", s->symvalue.iconval); 29*11066Slinton } else { 30*11066Slinton printf("const %s = ", s->symbol); 31*11066Slinton if (t == t_real) { 32*11066Slinton printf("%g", s->symvalue.fconval); 33*11066Slinton } else { 34*11066Slinton printordinal(s->symvalue.iconval, t); 35*11066Slinton } 36*11066Slinton } 37*11066Slinton break; 385528Slinton 39*11066Slinton case TYPE: 40*11066Slinton printf("type %s = ", s->symbol); 41*11066Slinton printtype(s, s->type); 42*11066Slinton break; 435528Slinton 44*11066Slinton case VAR: 45*11066Slinton if (isparam(s)) { 46*11066Slinton printf("(parameter) %s : ", s->symbol); 47*11066Slinton } else { 48*11066Slinton printf("var %s : ", s->symbol); 49*11066Slinton } 50*11066Slinton printtype(s, s->type); 51*11066Slinton break; 525528Slinton 53*11066Slinton case REF: 54*11066Slinton printf("(var parameter) %s : ", s->symbol); 55*11066Slinton printtype(s, s->type); 56*11066Slinton break; 575528Slinton 58*11066Slinton case RANGE: 59*11066Slinton case ARRAY: 60*11066Slinton case RECORD: 61*11066Slinton case VARNT: 62*11066Slinton case PTR: 63*11066Slinton printtype(s, s); 64*11066Slinton semicolon = FALSE; 65*11066Slinton break; 665528Slinton 67*11066Slinton case FVAR: 68*11066Slinton printf("(function variable) %s : ", s->symbol); 69*11066Slinton printtype(s, s->type); 70*11066Slinton break; 715528Slinton 72*11066Slinton case FIELD: 73*11066Slinton printf("(field) %s : ", s->symbol); 74*11066Slinton printtype(s, s->type); 75*11066Slinton break; 765528Slinton 77*11066Slinton case PROC: 78*11066Slinton printf("procedure %s", s->symbol); 79*11066Slinton listparams(s); 80*11066Slinton break; 815528Slinton 82*11066Slinton case PROG: 83*11066Slinton printf("program %s", s->symbol); 84*11066Slinton t = s->chain; 85*11066Slinton if (t != NIL) { 86*11066Slinton printf("(%s", t->symbol); 87*11066Slinton for (t = t->chain; t != NIL; t = t->chain) { 88*11066Slinton printf(", %s", t->symbol); 89*11066Slinton } 90*11066Slinton printf(")"); 91*11066Slinton } 92*11066Slinton break; 935528Slinton 94*11066Slinton case FUNC: 95*11066Slinton printf("function %s", s->symbol); 96*11066Slinton listparams(s); 97*11066Slinton printf(" : "); 98*11066Slinton printtype(s, s->type); 99*11066Slinton break; 1005528Slinton 101*11066Slinton default: 102*11066Slinton error("class %s in printdecl", classname(s)); 103*11066Slinton } 104*11066Slinton if (semicolon) { 105*11066Slinton putchar(';'); 106*11066Slinton } 107*11066Slinton putchar('\n'); 1085528Slinton } 1095528Slinton 1105528Slinton /* 1115528Slinton * Recursive whiz-bang procedure to print the type portion 1125528Slinton * of a declaration. Doesn't work quite right for variant records. 1135528Slinton * 1145528Slinton * The symbol associated with the type is passed to allow 1155528Slinton * searching for type names without getting "type blah = blah". 1165528Slinton */ 1175528Slinton 1185528Slinton LOCAL printtype(s, t) 1195528Slinton SYM *s; 1205528Slinton SYM *t; 1215528Slinton { 122*11066Slinton register SYM *tmp; 123*11066Slinton long r0, r1; 1245528Slinton 125*11066Slinton tmp = findtype(t); 126*11066Slinton if (tmp != NIL && tmp != s) { 127*11066Slinton printf("%s", tmp->symbol); 128*11066Slinton return; 129*11066Slinton } 130*11066Slinton switch(t->class) { 131*11066Slinton case VAR: 132*11066Slinton case CONST: 133*11066Slinton case FUNC: 134*11066Slinton case PROC: 135*11066Slinton panic("printtype: class %s", classname(t)); 136*11066Slinton break; 1375528Slinton 138*11066Slinton case ARRAY: 139*11066Slinton printf("array["); 140*11066Slinton tmp = t->chain; 141*11066Slinton for (;;) { 142*11066Slinton printtype(tmp, tmp); 143*11066Slinton tmp = tmp->chain; 144*11066Slinton if (tmp == NIL) { 145*11066Slinton break; 146*11066Slinton } 147*11066Slinton printf(", "); 148*11066Slinton } 149*11066Slinton printf("] of "); 150*11066Slinton printtype(t, t->type); 151*11066Slinton break; 1525528Slinton 153*11066Slinton case RECORD: 154*11066Slinton printf("record\n"); 155*11066Slinton if (t->chain != NIL) { 156*11066Slinton printtype(t->chain, t->chain); 157*11066Slinton } 158*11066Slinton printf("end"); 159*11066Slinton break; 1605528Slinton 161*11066Slinton case FIELD: 162*11066Slinton if (t->chain != NIL) { 163*11066Slinton printtype(t->chain, t->chain); 164*11066Slinton } 165*11066Slinton printf("\t%s : ", t->symbol); 166*11066Slinton printtype(t, t->type); 167*11066Slinton printf(";\n"); 168*11066Slinton break; 1695528Slinton 170*11066Slinton case RANGE: 171*11066Slinton r0 = t->symvalue.rangev.lower; 172*11066Slinton r1 = t->symvalue.rangev.upper; 173*11066Slinton printordinal(r0, rtype(t->type)); 174*11066Slinton printf(".."); 175*11066Slinton printordinal(r1, rtype(t->type)); 176*11066Slinton break; 1775528Slinton 178*11066Slinton case PTR: 179*11066Slinton putchar('^'); 180*11066Slinton printtype(t, t->type); 181*11066Slinton break; 1825528Slinton 183*11066Slinton case TYPE: 184*11066Slinton if (t->symbol != NIL) { 185*11066Slinton printf("%s", t->symbol); 186*11066Slinton } else { 187*11066Slinton printtype(t, t->type); 188*11066Slinton } 189*11066Slinton break; 1905528Slinton 191*11066Slinton case SCAL: 192*11066Slinton printf("("); 193*11066Slinton t = t->type->chain; 194*11066Slinton if (t != NIL) { 195*11066Slinton printf("%s", t->symbol); 196*11066Slinton t = t->chain; 197*11066Slinton while (t != NIL) { 198*11066Slinton printf(", %s", t->symbol); 199*11066Slinton t = t->chain; 200*11066Slinton } 201*11066Slinton } else { 202*11066Slinton panic("empty enumeration"); 203*11066Slinton } 204*11066Slinton printf(")"); 205*11066Slinton break; 2065528Slinton 207*11066Slinton default: 208*11066Slinton printf("(class %d)", t->class); 209*11066Slinton break; 210*11066Slinton } 2115528Slinton } 2125528Slinton 2135528Slinton /* 2145528Slinton * List the parameters of a procedure or function. 2155528Slinton * No attempt is made to combine like types. 2165528Slinton */ 2175528Slinton 2185528Slinton listparams(s) 2195528Slinton SYM *s; 2205528Slinton { 221*11066Slinton SYM *t; 2225528Slinton 223*11066Slinton if (s->chain != NIL) { 224*11066Slinton putchar('('); 225*11066Slinton for (t = s->chain; t != NIL; t = t->chain) { 226*11066Slinton switch (t->class) { 227*11066Slinton case REF: 228*11066Slinton printf("var "); 229*11066Slinton break; 2305528Slinton 231*11066Slinton case FPROC: 232*11066Slinton printf("procedure "); 233*11066Slinton break; 2345528Slinton 235*11066Slinton case FFUNC: 236*11066Slinton printf("function "); 237*11066Slinton break; 2385528Slinton 239*11066Slinton case VAR: 240*11066Slinton break; 2415528Slinton 242*11066Slinton default: 243*11066Slinton panic("unexpected class %d for parameter", t->class); 244*11066Slinton } 245*11066Slinton printf("%s : ", t->symbol); 246*11066Slinton printtype(t, t->type); 247*11066Slinton if (t->chain != NIL) { 248*11066Slinton printf("; "); 249*11066Slinton } 2505528Slinton } 251*11066Slinton putchar(')'); 252*11066Slinton } 2535528Slinton } 254