148093Sbostic /*-
2*62149Sbostic * Copyright (c) 1980, 1993
3*62149Sbostic * The Regents of the University of California. All rights reserved.
448093Sbostic *
548093Sbostic * %sccs.include.redist.c%
622526Sdist */
75528Slinton
822526Sdist #ifndef lint
9*62149Sbostic static char sccsid[] = "@(#)printdecl.c 8.1 (Berkeley) 06/06/93";
1048093Sbostic #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
printdecl(s)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
printtype(s,t)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
listparams(s)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