122526Sdist /* 222526Sdist * Copyright (c) 1980 Regents of the University of California. 322526Sdist * All rights reserved. The Berkeley software License Agreement 422526Sdist * specifies the terms and conditions for redistribution. 522526Sdist */ 65528Slinton 722526Sdist #ifndef lint 8*22787Smckusick static char sccsid[] = "@(#)printdecl.c 5.2 (Berkeley) 06/07/85"; 922526Sdist #endif not lint 10*22787Smckusick 11*22787Smckusick /* 1211066Slinton * Print out the type of a symbol. 135528Slinton */ 145528Slinton 155528Slinton #include "defs.h" 165528Slinton #include "sym.h" 175528Slinton #include "symtab.h" 185528Slinton #include "tree.h" 195528Slinton #include "btypes.h" 205528Slinton #include "classes.h" 215528Slinton #include "sym.rep" 225528Slinton 235528Slinton printdecl(s) 245528Slinton SYM *s; 255528Slinton { 2611066Slinton register SYM *t; 2711066Slinton BOOLEAN semicolon; 285528Slinton 2911066Slinton semicolon = TRUE; 3011066Slinton switch(s->class) { 3111066Slinton case CONST: 3211066Slinton t = rtype(s->type); 3311066Slinton if (t->class == SCAL) { 3411066Slinton printf("(enumeration constant, ord %ld)", s->symvalue.iconval); 3511066Slinton } else { 3611066Slinton printf("const %s = ", s->symbol); 3711066Slinton if (t == t_real) { 3811066Slinton printf("%g", s->symvalue.fconval); 3911066Slinton } else { 4011066Slinton printordinal(s->symvalue.iconval, t); 4111066Slinton } 4211066Slinton } 4311066Slinton break; 445528Slinton 4511066Slinton case TYPE: 4611066Slinton printf("type %s = ", s->symbol); 4711066Slinton printtype(s, s->type); 4811066Slinton break; 495528Slinton 5011066Slinton case VAR: 5111066Slinton if (isparam(s)) { 5211066Slinton printf("(parameter) %s : ", s->symbol); 5311066Slinton } else { 5411066Slinton printf("var %s : ", s->symbol); 5511066Slinton } 5611066Slinton printtype(s, s->type); 5711066Slinton break; 585528Slinton 5911066Slinton case REF: 6011066Slinton printf("(var parameter) %s : ", s->symbol); 6111066Slinton printtype(s, s->type); 6211066Slinton break; 635528Slinton 6411066Slinton case RANGE: 6511066Slinton case ARRAY: 6611066Slinton case RECORD: 6711066Slinton case VARNT: 6811066Slinton case PTR: 6911066Slinton printtype(s, s); 7011066Slinton semicolon = FALSE; 7111066Slinton break; 725528Slinton 7311066Slinton case FVAR: 7411066Slinton printf("(function variable) %s : ", s->symbol); 7511066Slinton printtype(s, s->type); 7611066Slinton break; 775528Slinton 7811066Slinton case FIELD: 7911066Slinton printf("(field) %s : ", s->symbol); 8011066Slinton printtype(s, s->type); 8111066Slinton break; 825528Slinton 8311066Slinton case PROC: 8411066Slinton printf("procedure %s", s->symbol); 8511066Slinton listparams(s); 8611066Slinton break; 875528Slinton 8811066Slinton case PROG: 8911066Slinton printf("program %s", s->symbol); 9011066Slinton t = s->chain; 9111066Slinton if (t != NIL) { 9211066Slinton printf("(%s", t->symbol); 9311066Slinton for (t = t->chain; t != NIL; t = t->chain) { 9411066Slinton printf(", %s", t->symbol); 9511066Slinton } 9611066Slinton printf(")"); 9711066Slinton } 9811066Slinton break; 995528Slinton 10011066Slinton case FUNC: 10111066Slinton printf("function %s", s->symbol); 10211066Slinton listparams(s); 10311066Slinton printf(" : "); 10411066Slinton printtype(s, s->type); 10511066Slinton break; 1065528Slinton 10711066Slinton default: 10811066Slinton error("class %s in printdecl", classname(s)); 10911066Slinton } 11011066Slinton if (semicolon) { 11111066Slinton putchar(';'); 11211066Slinton } 11311066Slinton putchar('\n'); 1145528Slinton } 1155528Slinton 1165528Slinton /* 1175528Slinton * Recursive whiz-bang procedure to print the type portion 1185528Slinton * of a declaration. Doesn't work quite right for variant records. 1195528Slinton * 1205528Slinton * The symbol associated with the type is passed to allow 1215528Slinton * searching for type names without getting "type blah = blah". 1225528Slinton */ 1235528Slinton 1245528Slinton LOCAL printtype(s, t) 1255528Slinton SYM *s; 1265528Slinton SYM *t; 1275528Slinton { 12811066Slinton register SYM *tmp; 12911066Slinton long r0, r1; 1305528Slinton 13111066Slinton tmp = findtype(t); 13211066Slinton if (tmp != NIL && tmp != s) { 13311066Slinton printf("%s", tmp->symbol); 13411066Slinton return; 13511066Slinton } 13611066Slinton switch(t->class) { 13711066Slinton case VAR: 13811066Slinton case CONST: 13911066Slinton case FUNC: 14011066Slinton case PROC: 14111066Slinton panic("printtype: class %s", classname(t)); 14211066Slinton break; 1435528Slinton 14411066Slinton case ARRAY: 14511066Slinton printf("array["); 14611066Slinton tmp = t->chain; 14711066Slinton for (;;) { 14811066Slinton printtype(tmp, tmp); 14911066Slinton tmp = tmp->chain; 15011066Slinton if (tmp == NIL) { 15111066Slinton break; 15211066Slinton } 15311066Slinton printf(", "); 15411066Slinton } 15511066Slinton printf("] of "); 15611066Slinton printtype(t, t->type); 15711066Slinton break; 1585528Slinton 15911066Slinton case RECORD: 16011066Slinton printf("record\n"); 16111066Slinton if (t->chain != NIL) { 16211066Slinton printtype(t->chain, t->chain); 16311066Slinton } 16411066Slinton printf("end"); 16511066Slinton break; 1665528Slinton 16711066Slinton case FIELD: 16811066Slinton if (t->chain != NIL) { 16911066Slinton printtype(t->chain, t->chain); 17011066Slinton } 17111066Slinton printf("\t%s : ", t->symbol); 17211066Slinton printtype(t, t->type); 17311066Slinton printf(";\n"); 17411066Slinton break; 1755528Slinton 17611066Slinton case RANGE: 17711066Slinton r0 = t->symvalue.rangev.lower; 17811066Slinton r1 = t->symvalue.rangev.upper; 17911066Slinton printordinal(r0, rtype(t->type)); 18011066Slinton printf(".."); 18111066Slinton printordinal(r1, rtype(t->type)); 18211066Slinton break; 1835528Slinton 18411066Slinton case PTR: 18511066Slinton putchar('^'); 18611066Slinton printtype(t, t->type); 18711066Slinton break; 1885528Slinton 18911066Slinton case TYPE: 19011066Slinton if (t->symbol != NIL) { 19111066Slinton printf("%s", t->symbol); 19211066Slinton } else { 19311066Slinton printtype(t, t->type); 19411066Slinton } 19511066Slinton break; 1965528Slinton 19711066Slinton case SCAL: 19811066Slinton printf("("); 19911066Slinton t = t->type->chain; 20011066Slinton if (t != NIL) { 20111066Slinton printf("%s", t->symbol); 20211066Slinton t = t->chain; 20311066Slinton while (t != NIL) { 20411066Slinton printf(", %s", t->symbol); 20511066Slinton t = t->chain; 20611066Slinton } 20711066Slinton } else { 20811066Slinton panic("empty enumeration"); 20911066Slinton } 21011066Slinton printf(")"); 21111066Slinton break; 2125528Slinton 21311066Slinton default: 21411066Slinton printf("(class %d)", t->class); 21511066Slinton break; 21611066Slinton } 2175528Slinton } 2185528Slinton 2195528Slinton /* 2205528Slinton * List the parameters of a procedure or function. 2215528Slinton * No attempt is made to combine like types. 2225528Slinton */ 2235528Slinton 2245528Slinton listparams(s) 2255528Slinton SYM *s; 2265528Slinton { 22711066Slinton SYM *t; 2285528Slinton 22911066Slinton if (s->chain != NIL) { 23011066Slinton putchar('('); 23111066Slinton for (t = s->chain; t != NIL; t = t->chain) { 23211066Slinton switch (t->class) { 23311066Slinton case REF: 23411066Slinton printf("var "); 23511066Slinton break; 2365528Slinton 23711066Slinton case FPROC: 23811066Slinton printf("procedure "); 23911066Slinton break; 2405528Slinton 24111066Slinton case FFUNC: 24211066Slinton printf("function "); 24311066Slinton break; 2445528Slinton 24511066Slinton case VAR: 24611066Slinton break; 2475528Slinton 24811066Slinton default: 24911066Slinton panic("unexpected class %d for parameter", t->class); 25011066Slinton } 25111066Slinton printf("%s : ", t->symbol); 25211066Slinton printtype(t, t->type); 25311066Slinton if (t->chain != NIL) { 25411066Slinton printf("; "); 25511066Slinton } 2565528Slinton } 25711066Slinton putchar(')'); 25811066Slinton } 2595528Slinton } 260