xref: /csrg-svn/usr.bin/pascal/pxp/fdec.c (revision 7718)
12854Speter /* Copyright (c) 1979 Regents of the University of California */
22854Speter #
3*7718Smckusick static	char *sccsid = "@(#)fdec.c	1.3 (Berkeley) 08/12/82";
42854Speter /*
52854Speter  * pxp - Pascal execution profiler
62854Speter  *
72854Speter  * Bill Joy UCB
82854Speter  * Version 1.2 January 1979
92854Speter  */
102854Speter 
112854Speter #include "0.h"
122854Speter #include "tree.h"
132854Speter 
142854Speter /*
152854Speter  * Program, procedure or function "header", i.e.:
162854Speter  *
172854Speter  *	function sin: real;
182854Speter  */
192854Speter funchdr(r)
202854Speter 	int *r;
212854Speter {
222854Speter 	register **rl, *il;
232854Speter 
242854Speter 	if (inpflist(r[2])) {
252854Speter 		optstk['z'-'a'] =<< 1;
262854Speter 		optstk['z'-'a'] =| opts['z'-'a'];
272854Speter 		opts['z'-'a'] = 1;
282854Speter 	}
292854Speter 	cbn++;
302854Speter 	lastbn = cbn;
312854Speter 	getcnt();
322854Speter 	if (nojunk && !inpflist(r[2]))
332854Speter 		setprint();
342854Speter 	else
352854Speter 		printon();
362854Speter 	if (r[0] == T_PROG && noinclude && bracket)
372854Speter 		printoff();
382854Speter 	if (cbn > 1 && !justify)
392854Speter 		ppgoin(PRFN);
402854Speter 	puthedr();
412854Speter 	if (noblank(setline(r[1])))
422854Speter 		ppnl();
432854Speter 	cnttab(r[2], pfcnt++);
442854Speter 	ppnl();
452854Speter 	indent();
462854Speter 	switch (r[0]) {
472854Speter 		case T_PROG:
482854Speter 			ppkw("program");
492854Speter 			break;
502854Speter 		case T_PDEC:
512854Speter 			ppkw("procedure");
522854Speter 			break;
532854Speter 		case T_FDEC:
542854Speter 			ppkw("function");
552854Speter 			break;
562854Speter 		default:
572854Speter 			panic("funchdr");
582854Speter 	}
592854Speter 	ppspac();
602854Speter 	ppid(r[2]);
612854Speter 	if (r[0] != T_PROG) {
622854Speter 		rl = r[3];
632854Speter 		if (rl != NIL) {
642854Speter 			ppbra("(");
652854Speter 			for (;;) {
662854Speter 				if (rl[1] == NIL) {
672854Speter 					rl = rl[2];
682854Speter 					continue;
692854Speter 				}
702854Speter 				switch (rl[1][0]) {
712854Speter 					case T_PVAR:
722854Speter 						ppkw("var");
732854Speter 						ppspac();
742854Speter 						break;
752854Speter 					case T_PPROC:
762854Speter 						ppkw("procedure");
772854Speter 						ppspac();
782854Speter 						break;
792854Speter 					case T_PFUNC:
802854Speter 						ppkw("function");
812854Speter 						ppspac();
822854Speter 						break;
832854Speter 				}
842854Speter 				il = rl[1][1];
852854Speter 				if (il != NIL)
862854Speter 					for (;;) {
872854Speter 						ppid(il[1]);
882854Speter 						il = il[2];
892854Speter 						if (il == NIL)
902854Speter 							break;
912854Speter 						ppsep(", ");
922854Speter 					}
932854Speter 				else
942854Speter 					ppid("{identifier list}");
952854Speter 				if (rl[1][0] != T_PPROC) {
962854Speter 					ppsep(":");
972854Speter 					gtype(rl[1][2]);
982854Speter 				}
992854Speter 				rl = rl[2];
1002854Speter 				if (rl == NIL)
1012854Speter 					break;
1022854Speter 				ppsep(";");
1032854Speter 				ppspac();
1042854Speter 			}
1052854Speter 			ppket(")");
1062854Speter 		}
1072854Speter 		if (r[0] == T_FDEC && r[4] != NIL) {
1082854Speter 			ppsep(":");
1092854Speter 			gtype(r[4]);
1102854Speter 		}
1112854Speter 		ppsep(";");
1122854Speter 	} else {
1132854Speter 		rl = r[3];
1142854Speter 		if (rl != NIL) {
1152854Speter 			ppbra("(");
1162854Speter 			for (;;) {
1172854Speter 				ppid(rl[1]);
1182854Speter 				rl = rl[2];
1192854Speter 				if (rl == NIL)
1202854Speter 					break;
1212854Speter 				ppsep(", ");
1222854Speter 			}
1232854Speter 			ppket(")");
1242854Speter 		}
1252854Speter 		ppsep(";");
1262854Speter 	}
1272854Speter fhout:
1282854Speter 	setline(r[1]);
1292854Speter 	putcml();
1302854Speter 	savecnt(&pfcnts[cbn]);
1312854Speter 	setprint();
1322854Speter 	--cbn;
1332854Speter 	if (cbn && !justify)
1342854Speter 		ppgoout(PRFN);
1352854Speter 	return (r[2]);
1362854Speter }
1372854Speter 
1382854Speter /*
1392854Speter  * Forward declaration i.e. the second line of
1402854Speter  *
1412854Speter  *	procedure fum(var i: integer);
1422854Speter  *	    forward;
1432854Speter  */
1442854Speter funcfwd(fp)
1452854Speter 	char *fp;
1462854Speter {
1472854Speter 
1482854Speter 	baroff();
1492854Speter 	ppgoin(DECL);
1502854Speter 	ppnl();
1512854Speter 	indent();
1522854Speter 	ppkw("forward");
1532854Speter 	ppsep(";");
1542854Speter 	ppgoout(DECL);
1552854Speter 	baron();
1562854Speter 	return (fp);
1572854Speter }
1582854Speter 
1592854Speter /*
1602854Speter  * The "body" of a procedure, function, or program declaration,
1612854Speter  * i.e. a non-forward definition encounter.
1622854Speter  */
1632854Speter funcbody(fp)
1642854Speter 	char *fp;
1652854Speter {
1662854Speter 
1672854Speter 	if (cbn && !justify)
1682854Speter 		ppgoin(PRFN);
1692854Speter 	cbn++;
1702854Speter 	lastbn = cbn;
1712854Speter 	return (fp);
1722854Speter }
1732854Speter 
1742854Speter /*
1752854Speter  * The guts of the procedure, function or program, i.e.
1762854Speter  * the part between the begin and the end.
1772854Speter  */
1782854Speter funcend(fp, bundle, binfo)
1792854Speter 	char *fp;
1802854Speter 	int *bundle, *binfo;
1812854Speter {
1822854Speter 	int *blk;
1832854Speter 	extern int cntstat;
1842854Speter 
1852854Speter 	cntstat = 0;
1862854Speter 	blk = bundle[2];
1872854Speter 	rescnt(&pfcnts[cbn]);
1882854Speter 	setprint();
1892854Speter 	if (cbn == 1 && noinclude && bracket)
1902854Speter 		printoff();
1912854Speter 	if (lastbn > cbn)
1922854Speter 		unprint();
1932854Speter 	if (cbn == 1)
1942854Speter 		puthedr();
1952854Speter 	if (noblank(setline(bundle[1])) && lastbn > cbn)
1962854Speter 		ppnl();
1972854Speter 	ppnl();
1982854Speter 	indent();
1992854Speter 	ppkw("begin");
2002854Speter 	setline(bundle[1]);
2012854Speter 	if (putcml() == 0 && lastbn > cbn)
2022854Speter 		ppsname(fp);
2032854Speter 	ppgoin(DECL);
2042854Speter 	statlist(blk);
2052854Speter 	setinfo(bundle[1]);
2062854Speter 	putcmp();
2072854Speter 	ppgoout(DECL);
2082854Speter 	ppnl();
2092854Speter 	indent();
2102854Speter 	ppkw("end");
2112854Speter 	ppsep(cbn == 1 ? "." : ";");
2122854Speter 	setinfo(binfo);
2132854Speter 	if (putcml() == 0)
2142854Speter 		ppsname(fp);
2152854Speter 	cbn--;
2162854Speter 	if (cbn && !justify)
2172854Speter 		ppgoout(PRFN);
2182854Speter 	if (inpflist(fp)) {
2192854Speter 		opts['z'-'a'] = optstk['z'-'a'] & 1;
2202854Speter 		optstk['z'-'a'] =>> 1;
2212854Speter 	}
2222854Speter 	if (cbn == 0) {
2232854Speter 		flushcm();
2242854Speter 		printon();
2252854Speter 		ppnl();
2262854Speter 	}
2272854Speter }
2282854Speter 
2292854Speter ppsname(fp)
2302854Speter 	char *fp;
2312854Speter {
2322854Speter 	if (fp == NIL)
2332854Speter 		return;
2342854Speter 	ppsep(" { ");
2352854Speter 	ppid(fp);
2362854Speter 	ppsep(" }");
2372854Speter }
2387717Smckusick 
2397717Smckusick /*
2407717Smckusick  * Segend is called at the end of a routine segment (a separately
2417717Smckusick  * compiled segment that is not the main program). Since pxp only works
2427717Smckusick  * with a single pascal file, this routine should never be called.
2437717Smckusick  */
2447717Smckusick segend()
2457717Smckusick {
2467717Smckusick 
247*7718Smckusick 	if ( profile ) {
248*7718Smckusick 	    error("Missing program statement and program body");
249*7718Smckusick 	}
2507717Smckusick }
2517717Smckusick 
2527717Smckusick /*
2537717Smckusick  * External declaration i.e. the second line of
2547717Smckusick  *
2557717Smckusick  *	procedure fum(var i: integer);
2567717Smckusick  *	    external;
2577717Smckusick  */
2587717Smckusick struct nl *
2597717Smckusick funcext(fp)
2607717Smckusick 	struct nl *fp;
2617717Smckusick {
2627717Smckusick 
2637717Smckusick 	baroff();
2647717Smckusick 	ppgoin(DECL);
2657717Smckusick 	ppnl();
2667717Smckusick 	indent();
2677717Smckusick 	ppkw("external");
2687717Smckusick 	ppsep(";");
2697717Smckusick 	ppgoout(DECL);
2707717Smckusick 	baron();
2717717Smckusick 	return (fp);
2727717Smckusick }
273