xref: /csrg-svn/usr.bin/pascal/pxp/fdec.c (revision 2854)
1*2854Speter static	char *sccsid = "@(#)fdec.c	1.1 (Berkeley) 03/02/81";
2*2854Speter /* Copyright (c) 1979 Regents of the University of California */
3*2854Speter #
4*2854Speter /*
5*2854Speter  * pxp - Pascal execution profiler
6*2854Speter  *
7*2854Speter  * Bill Joy UCB
8*2854Speter  * Version 1.2 January 1979
9*2854Speter  */
10*2854Speter 
11*2854Speter #include "0.h"
12*2854Speter #include "tree.h"
13*2854Speter 
14*2854Speter /*
15*2854Speter  * Program, procedure or function "header", i.e.:
16*2854Speter  *
17*2854Speter  *	function sin: real;
18*2854Speter  */
19*2854Speter funchdr(r)
20*2854Speter 	int *r;
21*2854Speter {
22*2854Speter 	register **rl, *il;
23*2854Speter 
24*2854Speter 	if (inpflist(r[2])) {
25*2854Speter 		optstk['z'-'a'] =<< 1;
26*2854Speter 		optstk['z'-'a'] =| opts['z'-'a'];
27*2854Speter 		opts['z'-'a'] = 1;
28*2854Speter 	}
29*2854Speter 	cbn++;
30*2854Speter 	lastbn = cbn;
31*2854Speter 	getcnt();
32*2854Speter 	if (nojunk && !inpflist(r[2]))
33*2854Speter 		setprint();
34*2854Speter 	else
35*2854Speter 		printon();
36*2854Speter 	if (r[0] == T_PROG && noinclude && bracket)
37*2854Speter 		printoff();
38*2854Speter 	if (cbn > 1 && !justify)
39*2854Speter 		ppgoin(PRFN);
40*2854Speter 	puthedr();
41*2854Speter 	if (noblank(setline(r[1])))
42*2854Speter 		ppnl();
43*2854Speter 	cnttab(r[2], pfcnt++);
44*2854Speter 	ppnl();
45*2854Speter 	indent();
46*2854Speter 	switch (r[0]) {
47*2854Speter 		case T_PROG:
48*2854Speter 			ppkw("program");
49*2854Speter 			break;
50*2854Speter 		case T_PDEC:
51*2854Speter 			ppkw("procedure");
52*2854Speter 			break;
53*2854Speter 		case T_FDEC:
54*2854Speter 			ppkw("function");
55*2854Speter 			break;
56*2854Speter 		default:
57*2854Speter 			panic("funchdr");
58*2854Speter 	}
59*2854Speter 	ppspac();
60*2854Speter 	ppid(r[2]);
61*2854Speter 	if (r[0] != T_PROG) {
62*2854Speter 		rl = r[3];
63*2854Speter 		if (rl != NIL) {
64*2854Speter 			ppbra("(");
65*2854Speter 			for (;;) {
66*2854Speter 				if (rl[1] == NIL) {
67*2854Speter 					rl = rl[2];
68*2854Speter 					continue;
69*2854Speter 				}
70*2854Speter 				switch (rl[1][0]) {
71*2854Speter 					case T_PVAR:
72*2854Speter 						ppkw("var");
73*2854Speter 						ppspac();
74*2854Speter 						break;
75*2854Speter 					case T_PPROC:
76*2854Speter 						ppkw("procedure");
77*2854Speter 						ppspac();
78*2854Speter 						break;
79*2854Speter 					case T_PFUNC:
80*2854Speter 						ppkw("function");
81*2854Speter 						ppspac();
82*2854Speter 						break;
83*2854Speter 				}
84*2854Speter 				il = rl[1][1];
85*2854Speter 				if (il != NIL)
86*2854Speter 					for (;;) {
87*2854Speter 						ppid(il[1]);
88*2854Speter 						il = il[2];
89*2854Speter 						if (il == NIL)
90*2854Speter 							break;
91*2854Speter 						ppsep(", ");
92*2854Speter 					}
93*2854Speter 				else
94*2854Speter 					ppid("{identifier list}");
95*2854Speter 				if (rl[1][0] != T_PPROC) {
96*2854Speter 					ppsep(":");
97*2854Speter 					gtype(rl[1][2]);
98*2854Speter 				}
99*2854Speter 				rl = rl[2];
100*2854Speter 				if (rl == NIL)
101*2854Speter 					break;
102*2854Speter 				ppsep(";");
103*2854Speter 				ppspac();
104*2854Speter 			}
105*2854Speter 			ppket(")");
106*2854Speter 		}
107*2854Speter 		if (r[0] == T_FDEC && r[4] != NIL) {
108*2854Speter 			ppsep(":");
109*2854Speter 			gtype(r[4]);
110*2854Speter 		}
111*2854Speter 		ppsep(";");
112*2854Speter 	} else {
113*2854Speter 		rl = r[3];
114*2854Speter 		if (rl != NIL) {
115*2854Speter 			ppbra("(");
116*2854Speter 			for (;;) {
117*2854Speter 				ppid(rl[1]);
118*2854Speter 				rl = rl[2];
119*2854Speter 				if (rl == NIL)
120*2854Speter 					break;
121*2854Speter 				ppsep(", ");
122*2854Speter 			}
123*2854Speter 			ppket(")");
124*2854Speter 		}
125*2854Speter 		ppsep(";");
126*2854Speter 	}
127*2854Speter fhout:
128*2854Speter 	setline(r[1]);
129*2854Speter 	putcml();
130*2854Speter 	savecnt(&pfcnts[cbn]);
131*2854Speter 	setprint();
132*2854Speter 	--cbn;
133*2854Speter 	if (cbn && !justify)
134*2854Speter 		ppgoout(PRFN);
135*2854Speter 	return (r[2]);
136*2854Speter }
137*2854Speter 
138*2854Speter /*
139*2854Speter  * Forward declaration i.e. the second line of
140*2854Speter  *
141*2854Speter  *	procedure fum(var i: integer);
142*2854Speter  *	    forward;
143*2854Speter  */
144*2854Speter funcfwd(fp)
145*2854Speter 	char *fp;
146*2854Speter {
147*2854Speter 
148*2854Speter 	baroff();
149*2854Speter 	ppgoin(DECL);
150*2854Speter 	ppnl();
151*2854Speter 	indent();
152*2854Speter 	ppkw("forward");
153*2854Speter 	ppsep(";");
154*2854Speter 	ppgoout(DECL);
155*2854Speter 	baron();
156*2854Speter 	return (fp);
157*2854Speter }
158*2854Speter 
159*2854Speter /*
160*2854Speter  * The "body" of a procedure, function, or program declaration,
161*2854Speter  * i.e. a non-forward definition encounter.
162*2854Speter  */
163*2854Speter funcbody(fp)
164*2854Speter 	char *fp;
165*2854Speter {
166*2854Speter 
167*2854Speter 	if (cbn && !justify)
168*2854Speter 		ppgoin(PRFN);
169*2854Speter 	cbn++;
170*2854Speter 	lastbn = cbn;
171*2854Speter 	return (fp);
172*2854Speter }
173*2854Speter 
174*2854Speter /*
175*2854Speter  * The guts of the procedure, function or program, i.e.
176*2854Speter  * the part between the begin and the end.
177*2854Speter  */
178*2854Speter funcend(fp, bundle, binfo)
179*2854Speter 	char *fp;
180*2854Speter 	int *bundle, *binfo;
181*2854Speter {
182*2854Speter 	int *blk;
183*2854Speter 	extern int cntstat;
184*2854Speter 
185*2854Speter 	cntstat = 0;
186*2854Speter 	blk = bundle[2];
187*2854Speter 	rescnt(&pfcnts[cbn]);
188*2854Speter 	setprint();
189*2854Speter 	if (cbn == 1 && noinclude && bracket)
190*2854Speter 		printoff();
191*2854Speter 	if (lastbn > cbn)
192*2854Speter 		unprint();
193*2854Speter 	if (cbn == 1)
194*2854Speter 		puthedr();
195*2854Speter 	if (noblank(setline(bundle[1])) && lastbn > cbn)
196*2854Speter 		ppnl();
197*2854Speter 	ppnl();
198*2854Speter 	indent();
199*2854Speter 	ppkw("begin");
200*2854Speter 	setline(bundle[1]);
201*2854Speter 	if (putcml() == 0 && lastbn > cbn)
202*2854Speter 		ppsname(fp);
203*2854Speter 	ppgoin(DECL);
204*2854Speter 	statlist(blk);
205*2854Speter 	setinfo(bundle[1]);
206*2854Speter 	putcmp();
207*2854Speter 	ppgoout(DECL);
208*2854Speter 	ppnl();
209*2854Speter 	indent();
210*2854Speter 	ppkw("end");
211*2854Speter 	ppsep(cbn == 1 ? "." : ";");
212*2854Speter 	setinfo(binfo);
213*2854Speter 	if (putcml() == 0)
214*2854Speter 		ppsname(fp);
215*2854Speter 	cbn--;
216*2854Speter 	if (cbn && !justify)
217*2854Speter 		ppgoout(PRFN);
218*2854Speter 	if (inpflist(fp)) {
219*2854Speter 		opts['z'-'a'] = optstk['z'-'a'] & 1;
220*2854Speter 		optstk['z'-'a'] =>> 1;
221*2854Speter 	}
222*2854Speter 	if (cbn == 0) {
223*2854Speter 		flushcm();
224*2854Speter 		printon();
225*2854Speter 		ppnl();
226*2854Speter 	}
227*2854Speter }
228*2854Speter 
229*2854Speter ppsname(fp)
230*2854Speter 	char *fp;
231*2854Speter {
232*2854Speter 	if (fp == NIL)
233*2854Speter 		return;
234*2854Speter 	ppsep(" { ");
235*2854Speter 	ppid(fp);
236*2854Speter 	ppsep(" }");
237*2854Speter }
238