xref: /csrg-svn/usr.bin/pascal/pxp/type.c (revision 62193)
148112Sbostic /*-
2*62193Sbostic  * Copyright (c) 1980, 1993
3*62193Sbostic  *	The Regents of the University of California.  All rights reserved.
448112Sbostic  *
548112Sbostic  * %sccs.include.redist.c%
622240Sdist  */
715988Saoki 
822240Sdist #ifndef lint
9*62193Sbostic static char sccsid[] = "@(#)type.c	8.1 (Berkeley) 06/06/93";
1048112Sbostic #endif /* not lint */
1115988Saoki 
122866Speter /*
132866Speter  * pxp - Pascal execution profiler
142866Speter  *
152866Speter  * Bill Joy UCB
162866Speter  * Version 1.2 January 1979
172866Speter  */
182866Speter 
192866Speter #include "0.h"
202866Speter #include "tree.h"
212866Speter 
223053Smckusic STATIC	int typecnt = -1;
232866Speter /*
242866Speter  * Type declaration part
252866Speter  */
typebeg(l,tline)262866Speter typebeg(l, tline)
272866Speter 	int l, tline;
282866Speter {
292866Speter 
302866Speter 	line = l;
312866Speter 	if (nodecl)
322866Speter 		printoff();
332866Speter 	puthedr();
342866Speter 	putcm();
352866Speter 	ppnl();
362866Speter 	indent();
372866Speter 	ppkw("type");
382866Speter 	ppgoin(DECL);
392866Speter 	typecnt = 0;
402866Speter 	setline(tline);
412866Speter }
422866Speter 
type(tline,tid,tdecl)432866Speter type(tline, tid, tdecl)
442866Speter 	int tline;
452866Speter 	char *tid;
462866Speter 	int *tdecl;
472866Speter {
482866Speter 
492866Speter 	if (typecnt)
502866Speter 		putcm();
512866Speter 	setline(tline);
522866Speter 	ppitem();
532866Speter 	ppid(tid);
542866Speter 	ppsep(" =");
552866Speter 	gtype(tdecl);
562866Speter 	ppsep(";");
572866Speter 	setinfo(tline);
582866Speter 	putcml();
592866Speter 	typecnt++;
602866Speter }
612866Speter 
typeend()622866Speter typeend()
632866Speter {
642866Speter 
652866Speter 	if (typecnt == -1)
662866Speter 		return;
672866Speter 	if (typecnt == 0)
682866Speter 		ppid("{type decls}");
692866Speter 	ppgoout(DECL);
702866Speter 	typecnt = -1;
712866Speter }
722866Speter 
732866Speter /*
742866Speter  * A single type declaration
752866Speter  */
gtype(r)762866Speter gtype(r)
772866Speter 	register int *r;
782866Speter {
792866Speter 
802866Speter 	if (r == NIL) {
812866Speter 		ppid("{type}");
822866Speter 		return;
832866Speter 	}
842866Speter 	if (r[0] != T_ID && r[0] != T_TYPACK)
852866Speter 		setline(r[1]);
862866Speter 	switch (r[0]) {
872866Speter 		default:
882866Speter 			panic("type");
892866Speter 		case T_ID:
902866Speter 			ppspac();
912866Speter 			ppid(r[1]);
922866Speter 			return;
932866Speter 		case T_TYID:
942866Speter 			ppspac();
952866Speter 			ppid(r[2]);
962866Speter 			break;
972866Speter 		case T_TYSCAL:
982866Speter 			ppspac();
992866Speter 			tyscal(r);
1002866Speter 			break;
10115988Saoki 		case T_TYCRANG:
10215988Saoki 			ppspac();
10315988Saoki 			tycrang(r);
10415988Saoki 			break;
1052866Speter 		case T_TYRANG:
1062866Speter 			ppspac();
1072866Speter 			tyrang(r);
1082866Speter 			break;
1092866Speter 		case T_TYPTR:
1102866Speter 			ppspac();
1112866Speter 			ppop("^");
1122866Speter 			gtype(r[2]);
1132866Speter 			break;
1142866Speter 		case T_TYPACK:
1152866Speter 			ppspac();
1162866Speter 			ppkw("packed");
1172866Speter 			gtype(r[2]);
1182866Speter 			break;
11915988Saoki 		case T_TYCARY:
1202866Speter 		case T_TYARY:
1212866Speter 			ppspac();
1222866Speter 			tyary(r);
1232866Speter 			break;
1242866Speter 		case T_TYREC:
1252866Speter 			ppspac();
1262866Speter 			tyrec(r[2], NIL);
1272866Speter 			break;
1282866Speter 		case T_TYFILE:
1292866Speter 			ppspac();
1302866Speter 			ppkw("file");
1312866Speter 			ppspac();
1322866Speter 			ppkw("of");
1332866Speter 			gtype(r[2]);
1342866Speter 			break;
1352866Speter 		case T_TYSET:
1362866Speter 			ppspac();
1372866Speter 			ppkw("set");
1382866Speter 			ppspac();
1392866Speter 			ppkw("of");
1402866Speter 			gtype(r[2]);
1412866Speter 			break;
1422866Speter 	}
1432866Speter 	setline(r[1]);
1442866Speter 	putcml();
1452866Speter }
1462866Speter 
1472866Speter /*
1482866Speter  * Scalar type declaration
1492866Speter  */
tyscal(r)1502866Speter tyscal(r)
1512866Speter 	register int *r;
1522866Speter {
1532866Speter 	register int i;
1542866Speter 
1552866Speter 	ppsep("(");
1562866Speter 	r = r[2];
1572866Speter 	if (r != NIL) {
1582866Speter 		i = 0;
1592866Speter 		ppgoin(DECL);
1602866Speter 		for (;;) {
1612866Speter 			ppid(r[1]);
1622866Speter 			r = r[2];
1632866Speter 			if (r == NIL)
1642866Speter 				break;
1652866Speter 			ppsep(", ");
1662866Speter 			i++;
1672866Speter 			if (i == 7) {
1682866Speter 				ppitem();
1692866Speter 				i = 0;
1702866Speter 			}
1712866Speter 		}
1722866Speter 		ppgoout(DECL);
1732866Speter 	} else
1742866Speter 		ppid("{constant list}");
1752866Speter 	ppsep(")");
1762866Speter }
1772866Speter 
1782866Speter /*
17915988Saoki  * Conformant array subrange.
18015988Saoki  */
tycrang(r)18115988Saoki tycrang(r)
18215988Saoki 	register int *r;
18315988Saoki {
18415988Saoki 
18515988Saoki 	ppid(r[2]);
18615988Saoki 	ppsep("..");
18715988Saoki 	ppid(r[3]);
18815988Saoki 	ppsep(":");
18915988Saoki 	gtype(r[4]);
19015988Saoki }
19115988Saoki 
19215988Saoki /*
1932866Speter  * Subrange type declaration
1942866Speter  */
tyrang(r)1952866Speter tyrang(r)
1962866Speter 	register int *r;
1972866Speter {
1982866Speter 
1992866Speter 	gconst(r[2]);
2002866Speter 	ppsep("..");
2012866Speter 	gconst(r[3]);
2022866Speter }
2032866Speter 
2042866Speter /*
2052866Speter  * Array type declaration
2062866Speter  */
tyary(r)2072866Speter tyary(r)
2082866Speter 	register int *r;
2092866Speter {
2102866Speter 	register int *tl;
2112866Speter 
2122866Speter 	ppkw("array");
2132866Speter 	ppspac();
2142866Speter 	ppsep("[");
2152866Speter 	tl = r[2];
2162866Speter 	if (tl != NIL) {
2172866Speter 		ppunspac();
2182866Speter 		for (;;) {
2192866Speter 			gtype(tl[1]);
2202866Speter 			tl = tl[2];
2212866Speter 			if (tl == NIL)
2222866Speter 				break;
2232866Speter 			ppsep(",");
2242866Speter 		}
2252866Speter 	} else
2262866Speter 		ppid("{subscr list}");
2272866Speter 	ppsep("]");
2282866Speter 	ppspac();
2292866Speter 	ppkw("of");
2302866Speter 	gtype(r[3]);
2312866Speter }
232