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