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