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