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