xref: /csrg-svn/usr.bin/pascal/pxp/0.h (revision 15989)
1 /* static	char *sccsid = "@(#)0.h	2.1 (Berkeley) 02/08/84";*/
2 /* Copyright (c) 1979 Regents of the University of California */
3 /* #define DEBUG */
4 #define	CHAR
5 #define	STATIC
6 /*
7  * pxp - Pascal execution profiler
8  *
9  * Bill Joy
10  * University of California, Berkeley (UCB)
11  * Version 1.1 February 1978
12  */
13 
14 /*
15  * Option flags
16  *
17  * The following options are recognized on the command line by pxp.
18  * Only the u, w, and z options here have effect in comments in the
19  * program; the others are command line only, and unrelated
20  * to the options with the same designations in comments.
21  *
22  *	a	Print all routines in a profile; normally, routines
23  *		which have never been executed have their bodies suppressed.
24  *
25  *	c	Extract profile data from the file core, or the file
26  *		named after the last argument rather than the file 'pmon.out'.
27  *		Must be used with z to have an effect.
28  *
29  *	d	Suppress declarations
30  *
31  *	f	Fully parenthesize expressions.
32  *
33  *	j	Left justify all procedures and functions rather than
34  *		indenting them.
35  *
36  *	n	Eject a new page in the listing as each 'include' file
37  *		is incorporated into the profile.
38  *
39  *	o	Put output prettyprint in first argument file
40  *
41  *	p	Pretty print a main program without processing
42  *		the include statements.
43  *
44  *	t	Print a table summarizing procedure and function call counts.
45  *
46  *	u	Card image mode; only the first 72 chars on a line count.
47  *
48  *	w	Suppress certain warning diagnostics.
49  *
50  *	z	Generate an execution profile of the program.
51  *		May also be followed by a list of procedure and function
52  *		names mixed, if desired, with include file names.
53  *		Only these procedures and functions, and the contents
54  *		of the specified include files will then be profiled.
55  *
56  *  [23456789]	Use the specified number of spaces for the basic
57  *		indenting unit in the program.
58  *
59  *	_	Underline keywords in the output.
60  *
61  *	O	remove `others'.  if an `others' label is found in a
62  *		case statement the case statement (minus the others case)
63  *		is printed as a guarded case statement, and the others case
64  *		is the else branch of the guard.  this transformation
65  *		causes the case selector to be evaluated twice, a lose
66  *		if the selector has side-effects.  this option is only
67  *		available if pxp is compiled with RMOTHERS defined.
68  */
69 
70 char	all, core, nodecl, full, justify, pmain, stripcomm, table, underline;
71 char	profile, onefile;
72 #ifdef RMOTHERS
73 char	rmothers;
74 #endif RMOTHERS
75 char	*firstname, *stdoutn;
76 #ifdef DEBUG
77 char	fulltrace, errtrace, testtrace, yyunique, typetest;
78 #endif
79 int	unit;
80 
81 /*
82  * The flag nojunk means that header lines
83  * of procedures and functions are to be suppressed
84  * when the z option is off.
85  * It is the default when command line z option
86  * control is specified.
87  *
88  * The flag noinclude indicates that include statements are not
89  * to be processed since we are pretty-printing the contents
90  * of a single file.
91  *
92  * The flag bracket indicates that the source code should be
93  * bracketed with lines of the form
94  *	program x(output);
95  * and
96  *	begin end.
97  * so that an include will pretty print without syntax errors.
98  */
99 char	nojunk, noinclude, bracket;
100 
101 /*
102  * IMPORTANT NOTE
103  *
104  * Many of the following globals are shared by pi and pxp.
105  * For more discussion of these see the available documentation
106  * on the structure of pi.
107  */
108 
109 /*
110  * Each option has a stack of 17 option values, with opts giving
111  * the current, top value, and optstk the value beneath it.
112  * One refers to option `l' as, e.g., opt('l') in the text for clarity.
113  */
114 char	opts[26];
115 int	optstk[26];
116 
117 #define opt(c) opts[c-'a']
118 
119 /*
120  * NOTES ON THE DYNAMIC NATURE OF THE DATA STRUCTURES
121  *
122  * Pxp uses expandable tables for its string table
123  * hash table, and parse tree space.  The following
124  * definitions specify the size of the increments
125  * for these items in fundamental units so that
126  * each uses approximately 1024 bytes.
127  */
128 
129 #define	STRINC	1024		/* string space increment */
130 #define	TRINC	512		/* tree space increment */
131 #define	HASHINC	509		/* hash table size in words, each increment */
132 
133 /*
134  * The initial sizes of the structures.
135  * These should be large enough to profile
136  * an "average" sized program so as to minimize
137  * storage requests.
138  * On a small system or and 11/34 or 11/40
139  * these numbers can be trimmed to make the
140  * profiler smaller.
141  */
142 #define	ITREE	2000
143 #define	IHASH	509
144 
145 /*
146  * The following limits on hash and tree tables currently
147  * allow approximately 1200 symbols and 20k words of tree
148  * space.  The fundamental limit of 64k total data space
149  * should be exceeded well before these are full.
150  */
151 /*
152  * TABLE_MULTIPLIER is for uniformly increasing the sizes of the tables
153  */
154 #ifdef ADDR32
155 #define TABLE_MULTIPLIER	8
156 #endif ADDR32
157 #ifdef ADDR16
158 #define TABLE_MULTIPLIER	1
159 #endif ADDR16
160 #define	MAXHASH	(4 * TABLE_MULTIPLIER)
161 #define	MAXTREE	(30 * TABLE_MULTIPLIER)
162 /*
163  * MAXDEPTH is the depth of the parse stack.
164  * STACK_MULTIPLIER is for increasing its size.
165  */
166 #ifdef ADDR32
167 #define	STACK_MULTIPLIER	8
168 #endif ADDR32
169 #ifdef ADDR16
170 #define	STACK_MULTIPLIER	1
171 #endif ADDR16
172 #define	MAXDEPTH ( 150 * STACK_MULTIPLIER )
173 
174 /*
175  * ERROR RELATED DEFINITIONS
176  */
177 
178 /*
179  * Exit statuses to pexit
180  *
181  * AOK
182  * ERRS		Compilation errors inhibit obj productin
183  * NOSTART	Errors before we ever got started
184  * DIED		We ran out of memory or some such
185  */
186 #define	AOK	0
187 #define	ERRS	1
188 #define	NOSTART	2
189 #define	DIED	3
190 
191 char	Recovery;
192 /*
193  * The flag eflg is set whenever we have a hard error.
194  * The character in errpfx will precede the next error message.
195  */
196 int	eflg;
197 char	errpfx;
198 
199 #define	setpfx(x)	errpfx = x
200 
201 #define	standard()	setpfx('s')
202 #define	warning()	setpfx('w')
203 #define	recovered()	setpfx('e')
204 #define	quit()		setpfx('Q')
205 #define	continuation()	setpfx(' ')
206 
207 /*
208  * SEMANTIC DEFINITIONS
209  */
210 
211 #define	NIL	0
212 
213 /*
214  * NOCON and SAWCON are flags in the tree telling whether
215  * a constant set is part of an expression.
216  */
217 #define	NOCON	0
218 #define	SAWCON	1
219 
220 /*
221  * The variable cbn gives the current block number.
222  * The variable lastbn gives the block number before
223  * it last changed and is used to know that we were
224  * in a nested procedure so that we can print
225  *	begin { solve }
226  * when solve has nested procedures or functions in it.
227  */
228 int	cbn, lastbn;
229 
230 /*
231  * The variable line is the current semantic
232  * line and is set in stat.c from the numbers
233  * embedded in statement type tree nodes.
234  */
235 int	line;
236 
237 /*
238  * The size of the display
239  * which defines the maximum nesting
240  * of procedures and functions allowed.
241  */
242 #define	DSPLYSZ 20
243 
244 /*
245  * Routines which need types
246  * other than "integer" to be
247  * assumed by the compiler.
248  */
249 int	*tree();
250 int	*hash();
251 char	*alloc();
252 long	cntof();
253 long	nowcnt();
254 
255 /*
256  * Funny structures to use
257  * pointers in wild and wooly ways
258  */
259 struct {
260 	char	pchar;
261 };
262 struct {
263 	int	pint;
264 	int	pint2;
265 };
266 struct {
267 	long	plong;
268 };
269 struct {
270 	double	pdouble;
271 };
272 
273 #define	OCT	1
274 #define	HEX	2
275 
276 /*
277  * MAIN PROGRAM GLOBALS, MISCELLANY
278  */
279 
280 /*
281  * Variables forming a data base referencing
282  * the command line arguments with the "z" option.
283  */
284 char	**pflist;
285 int	pflstc;
286 int	pfcnt;
287 
288 char	*filename;		/* current source file name */
289 char	*lastname;		/* last file name printed */
290 long	tvec;			/* mod time of the source file */
291 long	ptvec;			/* time profiled */
292 char	printed;		/* current file has been printed */
293 char	hadsome;		/* had some output */
294 
295 /*
296  * PROFILING AND FORMATTING DEFINITIONS
297  */
298 
299 /*
300  * The basic counter information recording structure.
301  * This is global only because people outside
302  * the cluster in pmon.c need to know its size.
303  */
304 struct pxcnt {
305 	long	ntimes;		/* the count this structure is all about */
306 	int	counter;	/* a unique counter number for us */
307 	int	gos;		/* global goto count when we hatched */
308 	int	printed;	/* are we considered to have been printed? */
309 } pfcnts[DSPLYSZ];
310 
311 /*
312  * The pieces we divide the output line indents into:
313  *	line#  PRFN  label:   STAT  999.---|  DECL   text
314  */
315 #define	STAT	0
316 #define	DECL	1
317 #define	PRFN	2
318 
319 /*
320  * Gocnt records the total number of goto's and
321  * cnts records the current counter for generating
322  * COUNT operators.
323  */
324 int	gocnt;
325 int	cnts;
326 
327 #include <stdio.h>
328 
329 typedef enum {FALSE, TRUE} bool;
330 
331 #undef putchar
332