1*48093Sbostic /*- 2*48093Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48093Sbostic * All rights reserved. 4*48093Sbostic * 5*48093Sbostic * %sccs.include.redist.c% 622526Sdist */ 75528Slinton 822526Sdist #ifndef lint 9*48093Sbostic static char sccsid[] = "@(#)printdecl.c 5.3 (Berkeley) 04/16/91"; 10*48093Sbostic #endif /* not lint */ 1122787Smckusick 1222787Smckusick /* 1311066Slinton * Print out the type of a symbol. 145528Slinton */ 155528Slinton 165528Slinton #include "defs.h" 175528Slinton #include "sym.h" 185528Slinton #include "symtab.h" 195528Slinton #include "tree.h" 205528Slinton #include "btypes.h" 215528Slinton #include "classes.h" 225528Slinton #include "sym.rep" 235528Slinton 245528Slinton printdecl(s) 255528Slinton SYM *s; 265528Slinton { 2711066Slinton register SYM *t; 2811066Slinton BOOLEAN semicolon; 295528Slinton 3011066Slinton semicolon = TRUE; 3111066Slinton switch(s->class) { 3211066Slinton case CONST: 3311066Slinton t = rtype(s->type); 3411066Slinton if (t->class == SCAL) { 3511066Slinton printf("(enumeration constant, ord %ld)", s->symvalue.iconval); 3611066Slinton } else { 3711066Slinton printf("const %s = ", s->symbol); 3811066Slinton if (t == t_real) { 3911066Slinton printf("%g", s->symvalue.fconval); 4011066Slinton } else { 4111066Slinton printordinal(s->symvalue.iconval, t); 4211066Slinton } 4311066Slinton } 4411066Slinton break; 455528Slinton 4611066Slinton case TYPE: 4711066Slinton printf("type %s = ", s->symbol); 4811066Slinton printtype(s, s->type); 4911066Slinton break; 505528Slinton 5111066Slinton case VAR: 5211066Slinton if (isparam(s)) { 5311066Slinton printf("(parameter) %s : ", s->symbol); 5411066Slinton } else { 5511066Slinton printf("var %s : ", s->symbol); 5611066Slinton } 5711066Slinton printtype(s, s->type); 5811066Slinton break; 595528Slinton 6011066Slinton case REF: 6111066Slinton printf("(var parameter) %s : ", s->symbol); 6211066Slinton printtype(s, s->type); 6311066Slinton break; 645528Slinton 6511066Slinton case RANGE: 6611066Slinton case ARRAY: 6711066Slinton case RECORD: 6811066Slinton case VARNT: 6911066Slinton case PTR: 7011066Slinton printtype(s, s); 7111066Slinton semicolon = FALSE; 7211066Slinton break; 735528Slinton 7411066Slinton case FVAR: 7511066Slinton printf("(function variable) %s : ", s->symbol); 7611066Slinton printtype(s, s->type); 7711066Slinton break; 785528Slinton 7911066Slinton case FIELD: 8011066Slinton printf("(field) %s : ", s->symbol); 8111066Slinton printtype(s, s->type); 8211066Slinton break; 835528Slinton 8411066Slinton case PROC: 8511066Slinton printf("procedure %s", s->symbol); 8611066Slinton listparams(s); 8711066Slinton break; 885528Slinton 8911066Slinton case PROG: 9011066Slinton printf("program %s", s->symbol); 9111066Slinton t = s->chain; 9211066Slinton if (t != NIL) { 9311066Slinton printf("(%s", t->symbol); 9411066Slinton for (t = t->chain; t != NIL; t = t->chain) { 9511066Slinton printf(", %s", t->symbol); 9611066Slinton } 9711066Slinton printf(")"); 9811066Slinton } 9911066Slinton break; 1005528Slinton 10111066Slinton case FUNC: 10211066Slinton printf("function %s", s->symbol); 10311066Slinton listparams(s); 10411066Slinton printf(" : "); 10511066Slinton printtype(s, s->type); 10611066Slinton break; 1075528Slinton 10811066Slinton default: 10911066Slinton error("class %s in printdecl", classname(s)); 11011066Slinton } 11111066Slinton if (semicolon) { 11211066Slinton putchar(';'); 11311066Slinton } 11411066Slinton putchar('\n'); 1155528Slinton } 1165528Slinton 1175528Slinton /* 1185528Slinton * Recursive whiz-bang procedure to print the type portion 1195528Slinton * of a declaration. Doesn't work quite right for variant records. 1205528Slinton * 1215528Slinton * The symbol associated with the type is passed to allow 1225528Slinton * searching for type names without getting "type blah = blah". 1235528Slinton */ 1245528Slinton 1255528Slinton LOCAL printtype(s, t) 1265528Slinton SYM *s; 1275528Slinton SYM *t; 1285528Slinton { 12911066Slinton register SYM *tmp; 13011066Slinton long r0, r1; 1315528Slinton 13211066Slinton tmp = findtype(t); 13311066Slinton if (tmp != NIL && tmp != s) { 13411066Slinton printf("%s", tmp->symbol); 13511066Slinton return; 13611066Slinton } 13711066Slinton switch(t->class) { 13811066Slinton case VAR: 13911066Slinton case CONST: 14011066Slinton case FUNC: 14111066Slinton case PROC: 14211066Slinton panic("printtype: class %s", classname(t)); 14311066Slinton break; 1445528Slinton 14511066Slinton case ARRAY: 14611066Slinton printf("array["); 14711066Slinton tmp = t->chain; 14811066Slinton for (;;) { 14911066Slinton printtype(tmp, tmp); 15011066Slinton tmp = tmp->chain; 15111066Slinton if (tmp == NIL) { 15211066Slinton break; 15311066Slinton } 15411066Slinton printf(", "); 15511066Slinton } 15611066Slinton printf("] of "); 15711066Slinton printtype(t, t->type); 15811066Slinton break; 1595528Slinton 16011066Slinton case RECORD: 16111066Slinton printf("record\n"); 16211066Slinton if (t->chain != NIL) { 16311066Slinton printtype(t->chain, t->chain); 16411066Slinton } 16511066Slinton printf("end"); 16611066Slinton break; 1675528Slinton 16811066Slinton case FIELD: 16911066Slinton if (t->chain != NIL) { 17011066Slinton printtype(t->chain, t->chain); 17111066Slinton } 17211066Slinton printf("\t%s : ", t->symbol); 17311066Slinton printtype(t, t->type); 17411066Slinton printf(";\n"); 17511066Slinton break; 1765528Slinton 17711066Slinton case RANGE: 17811066Slinton r0 = t->symvalue.rangev.lower; 17911066Slinton r1 = t->symvalue.rangev.upper; 18011066Slinton printordinal(r0, rtype(t->type)); 18111066Slinton printf(".."); 18211066Slinton printordinal(r1, rtype(t->type)); 18311066Slinton break; 1845528Slinton 18511066Slinton case PTR: 18611066Slinton putchar('^'); 18711066Slinton printtype(t, t->type); 18811066Slinton break; 1895528Slinton 19011066Slinton case TYPE: 19111066Slinton if (t->symbol != NIL) { 19211066Slinton printf("%s", t->symbol); 19311066Slinton } else { 19411066Slinton printtype(t, t->type); 19511066Slinton } 19611066Slinton break; 1975528Slinton 19811066Slinton case SCAL: 19911066Slinton printf("("); 20011066Slinton t = t->type->chain; 20111066Slinton if (t != NIL) { 20211066Slinton printf("%s", t->symbol); 20311066Slinton t = t->chain; 20411066Slinton while (t != NIL) { 20511066Slinton printf(", %s", t->symbol); 20611066Slinton t = t->chain; 20711066Slinton } 20811066Slinton } else { 20911066Slinton panic("empty enumeration"); 21011066Slinton } 21111066Slinton printf(")"); 21211066Slinton break; 2135528Slinton 21411066Slinton default: 21511066Slinton printf("(class %d)", t->class); 21611066Slinton break; 21711066Slinton } 2185528Slinton } 2195528Slinton 2205528Slinton /* 2215528Slinton * List the parameters of a procedure or function. 2225528Slinton * No attempt is made to combine like types. 2235528Slinton */ 2245528Slinton 2255528Slinton listparams(s) 2265528Slinton SYM *s; 2275528Slinton { 22811066Slinton SYM *t; 2295528Slinton 23011066Slinton if (s->chain != NIL) { 23111066Slinton putchar('('); 23211066Slinton for (t = s->chain; t != NIL; t = t->chain) { 23311066Slinton switch (t->class) { 23411066Slinton case REF: 23511066Slinton printf("var "); 23611066Slinton break; 2375528Slinton 23811066Slinton case FPROC: 23911066Slinton printf("procedure "); 24011066Slinton break; 2415528Slinton 24211066Slinton case FFUNC: 24311066Slinton printf("function "); 24411066Slinton break; 2455528Slinton 24611066Slinton case VAR: 24711066Slinton break; 2485528Slinton 24911066Slinton default: 25011066Slinton panic("unexpected class %d for parameter", t->class); 25111066Slinton } 25211066Slinton printf("%s : ", t->symbol); 25311066Slinton printtype(t, t->type); 25411066Slinton if (t->chain != NIL) { 25511066Slinton printf("; "); 25611066Slinton } 2575528Slinton } 25811066Slinton putchar(')'); 25911066Slinton } 2605528Slinton } 261