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