15528Slinton /* Copyright (c) 1982 Regents of the University of California */
25528Slinton 
3*11066Slinton static char sccsid[] = "@(#)printdecl.c 1.2 02/14/83";
45528Slinton 
55528Slinton /*
6*11066Slinton  * Print out the type of a symbol.
75528Slinton  */
85528Slinton 
95528Slinton #include "defs.h"
105528Slinton #include "sym.h"
115528Slinton #include "symtab.h"
125528Slinton #include "tree.h"
135528Slinton #include "btypes.h"
145528Slinton #include "classes.h"
155528Slinton #include "sym.rep"
165528Slinton 
175528Slinton printdecl(s)
185528Slinton SYM *s;
195528Slinton {
20*11066Slinton     register SYM *t;
21*11066Slinton     BOOLEAN semicolon;
225528Slinton 
23*11066Slinton     semicolon = TRUE;
24*11066Slinton     switch(s->class) {
25*11066Slinton 	case CONST:
26*11066Slinton 	    t = rtype(s->type);
27*11066Slinton 	    if (t->class == SCAL) {
28*11066Slinton 		printf("(enumeration constant, ord %ld)", s->symvalue.iconval);
29*11066Slinton 	    } else {
30*11066Slinton 		printf("const %s = ", s->symbol);
31*11066Slinton 		if (t == t_real) {
32*11066Slinton 		    printf("%g", s->symvalue.fconval);
33*11066Slinton 		} else {
34*11066Slinton 		    printordinal(s->symvalue.iconval, t);
35*11066Slinton 		}
36*11066Slinton 	    }
37*11066Slinton 	    break;
385528Slinton 
39*11066Slinton 	case TYPE:
40*11066Slinton 	    printf("type %s = ", s->symbol);
41*11066Slinton 	    printtype(s, s->type);
42*11066Slinton 	    break;
435528Slinton 
44*11066Slinton 	case VAR:
45*11066Slinton 	    if (isparam(s)) {
46*11066Slinton 		printf("(parameter) %s : ", s->symbol);
47*11066Slinton 	    } else {
48*11066Slinton 		printf("var %s : ", s->symbol);
49*11066Slinton 	    }
50*11066Slinton 	    printtype(s, s->type);
51*11066Slinton 	    break;
525528Slinton 
53*11066Slinton 	case REF:
54*11066Slinton 	    printf("(var parameter) %s : ", s->symbol);
55*11066Slinton 	    printtype(s, s->type);
56*11066Slinton 	    break;
575528Slinton 
58*11066Slinton 	case RANGE:
59*11066Slinton 	case ARRAY:
60*11066Slinton 	case RECORD:
61*11066Slinton 	case VARNT:
62*11066Slinton 	case PTR:
63*11066Slinton 	    printtype(s, s);
64*11066Slinton 	    semicolon = FALSE;
65*11066Slinton 	    break;
665528Slinton 
67*11066Slinton 	case FVAR:
68*11066Slinton 	    printf("(function variable) %s : ", s->symbol);
69*11066Slinton 	    printtype(s, s->type);
70*11066Slinton 	    break;
715528Slinton 
72*11066Slinton 	case FIELD:
73*11066Slinton 	    printf("(field) %s : ", s->symbol);
74*11066Slinton 	    printtype(s, s->type);
75*11066Slinton 	    break;
765528Slinton 
77*11066Slinton 	case PROC:
78*11066Slinton 	    printf("procedure %s", s->symbol);
79*11066Slinton 	    listparams(s);
80*11066Slinton 	    break;
815528Slinton 
82*11066Slinton 	case PROG:
83*11066Slinton 	    printf("program %s", s->symbol);
84*11066Slinton 	    t = s->chain;
85*11066Slinton 	    if (t != NIL) {
86*11066Slinton 		printf("(%s", t->symbol);
87*11066Slinton 		for (t = t->chain; t != NIL; t = t->chain) {
88*11066Slinton 		    printf(", %s", t->symbol);
89*11066Slinton 		}
90*11066Slinton 		printf(")");
91*11066Slinton 	    }
92*11066Slinton 	    break;
935528Slinton 
94*11066Slinton 	case FUNC:
95*11066Slinton 	    printf("function %s", s->symbol);
96*11066Slinton 	    listparams(s);
97*11066Slinton 	    printf(" : ");
98*11066Slinton 	    printtype(s, s->type);
99*11066Slinton 	    break;
1005528Slinton 
101*11066Slinton 	default:
102*11066Slinton 	    error("class %s in printdecl", classname(s));
103*11066Slinton     }
104*11066Slinton     if (semicolon) {
105*11066Slinton 	putchar(';');
106*11066Slinton     }
107*11066Slinton     putchar('\n');
1085528Slinton }
1095528Slinton 
1105528Slinton /*
1115528Slinton  * Recursive whiz-bang procedure to print the type portion
1125528Slinton  * of a declaration.  Doesn't work quite right for variant records.
1135528Slinton  *
1145528Slinton  * The symbol associated with the type is passed to allow
1155528Slinton  * searching for type names without getting "type blah = blah".
1165528Slinton  */
1175528Slinton 
1185528Slinton LOCAL printtype(s, t)
1195528Slinton SYM *s;
1205528Slinton SYM *t;
1215528Slinton {
122*11066Slinton     register SYM *tmp;
123*11066Slinton     long r0, r1;
1245528Slinton 
125*11066Slinton     tmp = findtype(t);
126*11066Slinton     if (tmp != NIL && tmp != s) {
127*11066Slinton 	printf("%s", tmp->symbol);
128*11066Slinton 	return;
129*11066Slinton     }
130*11066Slinton     switch(t->class) {
131*11066Slinton 	case VAR:
132*11066Slinton 	case CONST:
133*11066Slinton 	case FUNC:
134*11066Slinton 	case PROC:
135*11066Slinton 	    panic("printtype: class %s", classname(t));
136*11066Slinton 	    break;
1375528Slinton 
138*11066Slinton 	case ARRAY:
139*11066Slinton 	    printf("array[");
140*11066Slinton 	    tmp = t->chain;
141*11066Slinton 	    for (;;) {
142*11066Slinton 		printtype(tmp, tmp);
143*11066Slinton 		tmp = tmp->chain;
144*11066Slinton 		if (tmp == NIL) {
145*11066Slinton 		    break;
146*11066Slinton 		}
147*11066Slinton 		printf(", ");
148*11066Slinton 	    }
149*11066Slinton 	    printf("] of ");
150*11066Slinton 	    printtype(t, t->type);
151*11066Slinton 	    break;
1525528Slinton 
153*11066Slinton 	case RECORD:
154*11066Slinton 	    printf("record\n");
155*11066Slinton 	    if (t->chain != NIL) {
156*11066Slinton 		printtype(t->chain, t->chain);
157*11066Slinton 	    }
158*11066Slinton 	    printf("end");
159*11066Slinton 	    break;
1605528Slinton 
161*11066Slinton 	case FIELD:
162*11066Slinton 	    if (t->chain != NIL) {
163*11066Slinton 		printtype(t->chain, t->chain);
164*11066Slinton 	    }
165*11066Slinton 	    printf("\t%s : ", t->symbol);
166*11066Slinton 	    printtype(t, t->type);
167*11066Slinton 	    printf(";\n");
168*11066Slinton 	    break;
1695528Slinton 
170*11066Slinton 	case RANGE:
171*11066Slinton 	    r0 = t->symvalue.rangev.lower;
172*11066Slinton 	    r1 = t->symvalue.rangev.upper;
173*11066Slinton 	    printordinal(r0, rtype(t->type));
174*11066Slinton 	    printf("..");
175*11066Slinton 	    printordinal(r1, rtype(t->type));
176*11066Slinton 	    break;
1775528Slinton 
178*11066Slinton 	case PTR:
179*11066Slinton 	    putchar('^');
180*11066Slinton 	    printtype(t, t->type);
181*11066Slinton 	    break;
1825528Slinton 
183*11066Slinton 	case TYPE:
184*11066Slinton 	    if (t->symbol != NIL) {
185*11066Slinton 		printf("%s", t->symbol);
186*11066Slinton 	    } else {
187*11066Slinton 		printtype(t, t->type);
188*11066Slinton 	    }
189*11066Slinton 	    break;
1905528Slinton 
191*11066Slinton 	case SCAL:
192*11066Slinton 	    printf("(");
193*11066Slinton 	    t = t->type->chain;
194*11066Slinton 	    if (t != NIL) {
195*11066Slinton 		printf("%s", t->symbol);
196*11066Slinton 		t = t->chain;
197*11066Slinton 		while (t != NIL) {
198*11066Slinton 		    printf(", %s", t->symbol);
199*11066Slinton 		    t = t->chain;
200*11066Slinton 		}
201*11066Slinton 	    } else {
202*11066Slinton 		panic("empty enumeration");
203*11066Slinton 	    }
204*11066Slinton 	    printf(")");
205*11066Slinton 	    break;
2065528Slinton 
207*11066Slinton 	default:
208*11066Slinton 	    printf("(class %d)", t->class);
209*11066Slinton 	    break;
210*11066Slinton     }
2115528Slinton }
2125528Slinton 
2135528Slinton /*
2145528Slinton  * List the parameters of a procedure or function.
2155528Slinton  * No attempt is made to combine like types.
2165528Slinton  */
2175528Slinton 
2185528Slinton listparams(s)
2195528Slinton SYM *s;
2205528Slinton {
221*11066Slinton     SYM *t;
2225528Slinton 
223*11066Slinton     if (s->chain != NIL) {
224*11066Slinton 	putchar('(');
225*11066Slinton 	for (t = s->chain; t != NIL; t = t->chain) {
226*11066Slinton 	    switch (t->class) {
227*11066Slinton 		case REF:
228*11066Slinton 		    printf("var ");
229*11066Slinton 		    break;
2305528Slinton 
231*11066Slinton 		case FPROC:
232*11066Slinton 		    printf("procedure ");
233*11066Slinton 		    break;
2345528Slinton 
235*11066Slinton 		case FFUNC:
236*11066Slinton 		    printf("function ");
237*11066Slinton 		    break;
2385528Slinton 
239*11066Slinton 		case VAR:
240*11066Slinton 		    break;
2415528Slinton 
242*11066Slinton 		default:
243*11066Slinton 		    panic("unexpected class %d for parameter", t->class);
244*11066Slinton 	    }
245*11066Slinton 	    printf("%s : ", t->symbol);
246*11066Slinton 	    printtype(t, t->type);
247*11066Slinton 	    if (t->chain != NIL) {
248*11066Slinton 		printf("; ");
249*11066Slinton 	    }
2505528Slinton 	}
251*11066Slinton 	putchar(')');
252*11066Slinton     }
2535528Slinton }
254