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