xref: /csrg-svn/usr.bin/pascal/pxp/rec.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%
622236Sdist  */
722236Sdist 
822236Sdist #ifndef lint
9*62193Sbostic static char sccsid[] = "@(#)rec.c	8.1 (Berkeley) 06/06/93";
1048112Sbostic #endif /* not lint */
1122236Sdist 
1222236Sdist /*
132863Speter  * pxp - Pascal execution profiler
142863Speter  *
152863Speter  * Bill Joy UCB
162863Speter  * Version 1.2 January 1979
172863Speter  */
182863Speter 
192863Speter #include "0.h"
202863Speter 
tyrec(r,p0)212863Speter tyrec(r, p0)
222863Speter 	int *r, p0;
232863Speter {
242863Speter 
252863Speter 	if (r != NIL)
262863Speter 		setinfo(r[1]);
272863Speter 	if (p0 == NIL) {
282863Speter 		ppgoin(DECL);
292863Speter 		ppnl();
302863Speter 		indent();
312863Speter 		ppkw("record");
322863Speter 		ppspac();
332863Speter 	} else {
342863Speter 		ppspac();
352863Speter 		ppbra("(");
362863Speter 	}
372863Speter 	ppgoin(DECL);
382863Speter 	if (r) {
392863Speter 		field(r[2], r[3]);
402863Speter 		variant(r[3]);
412863Speter 	}
422863Speter 	if (r != NIL)
432863Speter 		setinfo(r[1]);
442863Speter 	putcml();
452863Speter 	ppgoout(DECL);
462863Speter 	if (p0 == NIL) {
472863Speter 		ppnl();
482863Speter 		indent();
492863Speter 		ppkw("end");
502863Speter 		ppgoout(DECL);
512863Speter 	} else {
522863Speter 		ppitem();
532863Speter 		ppket(")");
542863Speter 	}
552863Speter }
562863Speter 
field(r,v)572863Speter field(r, v)
582863Speter 	int *r, *v;
592863Speter {
602863Speter 	register int *fp, *tp, *ip;
612863Speter 
622863Speter 	fp = r;
632863Speter 	if (fp != NIL)
642863Speter 		for (;;) {
652863Speter 			tp = fp[1];
662863Speter 			if (tp != NIL) {
672863Speter 				setline(tp[1]);
682863Speter 				ip = tp[2];
692863Speter 				ppitem();
702863Speter 				if (ip != NIL)
712863Speter 					for (;;) {
722863Speter 						ppid(ip[1]);
732863Speter 						ip = ip[2];
742863Speter 						if (ip == NIL)
752863Speter 							break;
762863Speter 						ppsep(", ");
772863Speter 					}
782863Speter 				else
792863Speter 					ppid("{field id list}");
802863Speter 				ppsep(":");
812863Speter 				gtype(tp[3]);
822863Speter 				setinfo(tp[1]);
832863Speter 				putcm();
842863Speter 			}
852863Speter 			fp = fp[2];
862863Speter 			if (fp == NIL)
872863Speter 				break;
882863Speter 			ppsep(";");
892863Speter 		}
902863Speter 	if (v != NIL && r != NIL)
912863Speter 		ppsep(";");
922863Speter }
932863Speter 
variant(r)942863Speter variant(r)
952863Speter 	register int *r;
962863Speter {
972863Speter 	register int *v, *vc;
982863Speter 
992863Speter 	if (r == NIL)
1002863Speter 		return;
1012863Speter 	setline(r[1]);
1022863Speter 	ppitem();
1032863Speter 	ppkw("case");
1042863Speter 	v = r[2];
1052863Speter 	if (v != NIL) {
1062863Speter 		ppspac();
1072863Speter 		ppid(v);
1082863Speter 		ppsep(":");
1092863Speter 	}
1102863Speter 	gtype(r[3]);
1112863Speter 	ppspac();
1122863Speter 	ppkw("of");
1132863Speter 	for (vc = r[4]; vc != NIL;) {
1142863Speter 		v = vc[1];
1152863Speter 		if (v == NIL)
1162863Speter 			continue;
1172863Speter 		ppgoin(DECL);
1182863Speter 		setline(v[1]);
1192863Speter 		ppnl();
1202863Speter 		indent();
1212863Speter 		ppbra(NIL);
1222863Speter 		v = v[2];
1232863Speter 		if (v != NIL) {
1242863Speter 			for (;;) {
1252863Speter 				gconst(v[1]);
1262863Speter 				v = v[2];
1272863Speter 				if (v == NIL)
1282863Speter 					break;
1292863Speter 				ppsep(", ");
1302863Speter 			}
1312863Speter 		} else
1322863Speter 			ppid("{case label list}");
1332863Speter 		ppket(":");
1342863Speter 		v = vc[1];
1352863Speter 		tyrec(v[3], 1);
1362863Speter 		setinfo(v[1]);
1372863Speter 		putcml();
1382863Speter 		ppgoout(DECL);
1392863Speter 		vc = vc[2];
1402863Speter 		if (vc == NIL)
1412863Speter 			break;
1422863Speter 		ppsep(";");
1432863Speter 	}
1442863Speter 	setinfo(r[1]);
1452863Speter 	putcm();
1462863Speter }
147