xref: /csrg-svn/usr.bin/pascal/src/0.h (revision 733)
1*733Speter /* Copyright (c) 1979 Regents of the University of California */
2*733Speter 
3*733Speter /* static	char sccsid[] = "@(#)0.h 1.1 08/27/80"; */
4*733Speter 
5*733Speter #define DEBUG
6*733Speter #define	CHAR
7*733Speter #define	STATIC
8*733Speter #define hp21mx 0
9*733Speter 
10*733Speter #include	<stdio.h>
11*733Speter #include	<sys/types.h>
12*733Speter 
13*733Speter #define		bool	short
14*733Speter #define		TRUE	1
15*733Speter #define		FALSE	0
16*733Speter 
17*733Speter /*
18*733Speter  * Option flags
19*733Speter  *
20*733Speter  * The following options are recognized in the text of the program
21*733Speter  * and also on the command line:
22*733Speter  *
23*733Speter  *	b	block buffer the file output
24*733Speter  *
25*733Speter  *	i	make a listing of the procedures and functions in
26*733Speter  *		the following include files
27*733Speter  *
28*733Speter  *	l	make a listing of the program
29*733Speter  *
30*733Speter  *	n	place each include file on a new page with a header
31*733Speter  *
32*733Speter  *	p	disable post mortem and statement limit counting
33*733Speter  *
34*733Speter  *	t	disable run-time tests
35*733Speter  *
36*733Speter  *	u	card image mode; only first 72 chars of input count
37*733Speter  *
38*733Speter  *	w	suppress special diagnostic warnings
39*733Speter  *
40*733Speter  *	z	generate counters for an execution profile
41*733Speter  */
42*733Speter #ifdef DEBUG
43*733Speter bool	fulltrace, errtrace, testtrace, yyunique;
44*733Speter #endif DEBUG
45*733Speter 
46*733Speter /*
47*733Speter  * Each option has a stack of 17 option values, with opts giving
48*733Speter  * the current, top value, and optstk the value beneath it.
49*733Speter  * One refers to option `l' as, e.g., opt('l') in the text for clarity.
50*733Speter  */
51*733Speter char	opts[ 'z' - 'A' + 1];
52*733Speter short	optstk[ 'z' - 'A' + 1];
53*733Speter 
54*733Speter #define opt(c) opts[c-'A']
55*733Speter 
56*733Speter /*
57*733Speter  * Monflg is set when we are generating
58*733Speter  * a pxp profile.  this is set by the -z command line option.
59*733Speter  */
60*733Speter bool	monflg;
61*733Speter 
62*733Speter     /*
63*733Speter      *	profflag is set when we are generating a prof profile.
64*733Speter      *	this is set by the -p command line option.
65*733Speter      */
66*733Speter bool	profflag;
67*733Speter 
68*733Speter 
69*733Speter /*
70*733Speter  * NOTES ON THE DYNAMIC NATURE OF THE DATA STRUCTURES
71*733Speter  *
72*733Speter  * Pi uses expandable tables for
73*733Speter  * its namelist (symbol table), string table
74*733Speter  * hash table, and parse tree space.  The following
75*733Speter  * definitions specify the size of the increments
76*733Speter  * for these items in fundamental units so that
77*733Speter  * each uses approximately 1024 bytes.
78*733Speter  */
79*733Speter 
80*733Speter #define	STRINC	1024		/* string space increment */
81*733Speter #define	TRINC	512		/* tree space increment */
82*733Speter #define	HASHINC	509		/* hash table size in words, each increment */
83*733Speter #define	NLINC	56		/* namelist increment size in nl structs */
84*733Speter 
85*733Speter /*
86*733Speter  * The initial sizes of the structures.
87*733Speter  * These should be large enough to compile
88*733Speter  * an "average" sized program so as to minimize
89*733Speter  * storage requests.
90*733Speter  * On a small system or and 11/34 or 11/40
91*733Speter  * these numbers can be trimmed to make the
92*733Speter  * compiler smaller.
93*733Speter  */
94*733Speter #define	ITREE	2000
95*733Speter #define	INL	200
96*733Speter #define	IHASH	509
97*733Speter 
98*733Speter /*
99*733Speter  * The following limits on hash and tree tables currently
100*733Speter  * allow approximately 1200 symbols and 20k words of tree
101*733Speter  * space.  The fundamental limit of 64k total data space
102*733Speter  * should be exceeded well before these are full.
103*733Speter  */
104*733Speter /*
105*733Speter  * TABLE_MULTIPLIER is for uniformly increasing the sizes of the tables
106*733Speter  */
107*733Speter #define TABLE_MULTIPLIER	8
108*733Speter #define	MAXHASH	(4 * TABLE_MULTIPLIER)
109*733Speter #define	MAXNL	(12 * TABLE_MULTIPLIER)
110*733Speter #define	MAXTREE	(30 * TABLE_MULTIPLIER)
111*733Speter /*
112*733Speter  * MAXDEPTH is the depth of the parse stack.
113*733Speter  * STACK_MULTIPLIER is for increasing its size.
114*733Speter  */
115*733Speter #define	STACK_MULTIPLIER	8
116*733Speter #define	MAXDEPTH ( 150 * STACK_MULTIPLIER )
117*733Speter 
118*733Speter /*
119*733Speter  * ERROR RELATED DEFINITIONS
120*733Speter  */
121*733Speter 
122*733Speter /*
123*733Speter  * Exit statuses to pexit
124*733Speter  *
125*733Speter  * AOK
126*733Speter  * ERRS		Compilation errors inhibit obj productin
127*733Speter  * NOSTART	Errors before we ever got started
128*733Speter  * DIED		We ran out of memory or some such
129*733Speter  */
130*733Speter #define	AOK	0
131*733Speter #define	ERRS	1
132*733Speter #define	NOSTART	2
133*733Speter #define	DIED	3
134*733Speter 
135*733Speter bool	Recovery;
136*733Speter 
137*733Speter #define	eholdnl()	Eholdnl = 1
138*733Speter #define	nocascade()	Enocascade = 1
139*733Speter 
140*733Speter bool	Eholdnl, Enocascade;
141*733Speter 
142*733Speter 
143*733Speter /*
144*733Speter  * The flag eflg is set whenever we have a hard error.
145*733Speter  * The character in errpfx will precede the next error message.
146*733Speter  * When cgenflg is set code generation is suppressed.
147*733Speter  * This happens whenver we have an error (i.e. if eflg is set)
148*733Speter  * and when we are walking the tree to determine types only.
149*733Speter  */
150*733Speter bool	eflg;
151*733Speter char	errpfx;
152*733Speter 
153*733Speter #define	setpfx(x)	errpfx = x
154*733Speter 
155*733Speter #define	standard()	setpfx('s')
156*733Speter #define	warning()	setpfx('w')
157*733Speter #define	recovered()	setpfx('e')
158*733Speter 
159*733Speter bool	cgenflg;
160*733Speter 
161*733Speter 
162*733Speter /*
163*733Speter  * The flag syneflg is used to suppress the diagnostics of the form
164*733Speter  *	E 10 a, defined in someprocedure, is neither used nor set
165*733Speter  * when there were syntax errors in "someprocedure".
166*733Speter  * In this case, it is likely that these warinings would be spurious.
167*733Speter  */
168*733Speter bool	syneflg;
169*733Speter 
170*733Speter /*
171*733Speter  * The compiler keeps its error messages in a file.
172*733Speter  * The variable efil is the unit number on which
173*733Speter  * this file is open for reading of error message text.
174*733Speter  * Similarly, the file ofil is the unit of the file
175*733Speter  * "obj" where we write the interpreter code.
176*733Speter  */
177*733Speter short	efil;
178*733Speter short	ofil;
179*733Speter short	obuf[518];
180*733Speter 
181*733Speter #define	elineoff()	Enoline++
182*733Speter #define	elineon()	Enoline = 0
183*733Speter 
184*733Speter bool	Enoline;
185*733Speter 
186*733Speter /*
187*733Speter  * SYMBOL TABLE STRUCTURE DEFINITIONS
188*733Speter  *
189*733Speter  * The symbol table is henceforth referred to as the "namelist".
190*733Speter  * It consists of a number of structures of the form "nl" below.
191*733Speter  * These are contained in a number of segments of the symbol
192*733Speter  * table which are dynamically allocated as needed.
193*733Speter  * The major namelist manipulation routines are contained in the
194*733Speter  * file "nl.c".
195*733Speter  *
196*733Speter  * The major components of a namelist entry are the "symbol", giving
197*733Speter  * a pointer into the string table for the string associated with this
198*733Speter  * entry and the "class" which tells which of the (currently 19)
199*733Speter  * possible types of structure this is.
200*733Speter  *
201*733Speter  * Many of the classes use the "type" field for a pointer to the type
202*733Speter  * which the entry has.
203*733Speter  *
204*733Speter  * Other pieces of information in more than one class include the block
205*733Speter  * in which the symbol is defined, flags indicating whether the symbol
206*733Speter  * has been used and whether it has been assigned to, etc.
207*733Speter  *
208*733Speter  * A more complete discussion of the features of the namelist is impossible
209*733Speter  * here as it would be too voluminous.  Refer to the "PI 1.0 Implementation
210*733Speter  * Notes" for more details.
211*733Speter  */
212*733Speter 
213*733Speter /*
214*733Speter  * The basic namelist structure.
215*733Speter  * There are also two other variants, defining the real
216*733Speter  * field as longs or integers given below.
217*733Speter  *
218*733Speter  * The array disptab defines the hash header for the symbol table.
219*733Speter  * Symbols are hashed based on the low 6 bits of their pointer into
220*733Speter  * the string table; see the routines in the file "lookup.c" and also "fdec.c"
221*733Speter  * especially "funcend".
222*733Speter  */
223*733Speter #ifdef PTREE
224*733Speter #   include	"pTree.h"
225*733Speter #endif PTREE
226*733Speter struct	nl {
227*733Speter 	char	*symbol;
228*733Speter 	char	class, nl_flags;
229*733Speter #ifdef PC
230*733Speter 	char	ext_flags;	/* an extra flag is used for externals */
231*733Speter #endif PC
232*733Speter 	struct	nl *type;
233*733Speter 	struct	nl *chain, *nl_next;
234*733Speter 	int	*ptr[4];
235*733Speter #ifdef PI
236*733Speter 	int	entloc;
237*733Speter #endif PI
238*733Speter #	ifdef PTREE
239*733Speter 	    pPointer	inTree;
240*733Speter #	endif PTREE
241*733Speter } *nlp, *disptab[077+1];
242*733Speter 
243*733Speter extern struct nl nl[INL];
244*733Speter 
245*733Speter struct {
246*733Speter 	char	*symbol;
247*733Speter 	char	class, nl_flags;
248*733Speter #ifdef PC
249*733Speter 	char	ext_flags;
250*733Speter #endif
251*733Speter 	struct	nl *type;
252*733Speter 	struct	nl *chain, *nl_next;
253*733Speter 	double	real;
254*733Speter };
255*733Speter 
256*733Speter struct {
257*733Speter 	char	*symbol;
258*733Speter 	char	class, nl_block;
259*733Speter #ifdef PC
260*733Speter 	char	ext_flags;
261*733Speter #endif
262*733Speter 	struct	nl *type;
263*733Speter 	struct	nl *chain, *nl_next;
264*733Speter 	long	range[2];
265*733Speter };
266*733Speter 
267*733Speter struct {
268*733Speter 	char	*symbol;
269*733Speter 	char	class, nl_flags;
270*733Speter #ifdef PC
271*733Speter 	char	ext_flags;
272*733Speter #endif
273*733Speter 	struct	nl *type;
274*733Speter 	struct	nl *chain, *nl_next;
275*733Speter 	long	value[4];
276*733Speter };
277*733Speter 
278*733Speter /*
279*733Speter  * NL FLAGS BITS
280*733Speter  *
281*733Speter  * Definitions of the usage of the bits in
282*733Speter  * the nl_flags byte. Note that the low 5 bits of the
283*733Speter  * byte are the "nl_block" and that some classes make use
284*733Speter  * of this byte as a "width".
285*733Speter  *
286*733Speter  * The only non-obvious bit definition here is "NFILES"
287*733Speter  * which records whether a structure contains any files.
288*733Speter  * Such structures are not allowed to be dynamically allocated.
289*733Speter  */
290*733Speter #define	NUSED	0100
291*733Speter #define	NMOD	0040
292*733Speter #define	NFORWD	0200
293*733Speter #define	NFILES	0200
294*733Speter 
295*733Speter #ifdef PC
296*733Speter #define NEXTERN 0001	/* flag used to mark external funcs and procs */
297*733Speter #endif
298*733Speter 
299*733Speter /*
300*733Speter  * Definition of the commonly used "value" fields.
301*733Speter  * The most important one is NL_OFFS which gives
302*733Speter  * the offset of a variable in its stack mark.
303*733Speter  */
304*733Speter #define NL_OFFS	0
305*733Speter 
306*733Speter #define	NL_CNTR	1
307*733Speter #define	NL_FVAR	3
308*733Speter 
309*733Speter #define NL_GOLEV 2
310*733Speter #define NL_GOLINE 3
311*733Speter #define NL_FORV 1
312*733Speter 
313*733Speter #define	NL_FLDSZ 1
314*733Speter #define	NL_VARNT 2
315*733Speter #define	NL_VTOREC 2
316*733Speter #define	NL_TAG	3
317*733Speter 
318*733Speter #define	NL_ELABEL	3
319*733Speter 
320*733Speter /*
321*733Speter  * For BADUSE nl structures, NL_KINDS is a bit vector
322*733Speter  * indicating the kinds of illegal usages complained about
323*733Speter  * so far.  For kind of bad use "kind", "1 << kind" is set.
324*733Speter  * The low bit is reserved as ISUNDEF to indicate whether
325*733Speter  * this identifier is totally undefined.
326*733Speter  */
327*733Speter #define	NL_KINDS	0
328*733Speter 
329*733Speter #define	ISUNDEF		1
330*733Speter 
331*733Speter /*
332*733Speter  * NAMELIST CLASSES
333*733Speter  *
334*733Speter  * The following are the namelist classes.
335*733Speter  * Different classes make use of the value fields
336*733Speter  * of the namelist in different ways.
337*733Speter  *
338*733Speter  * The namelist should be redesigned by providing
339*733Speter  * a number of structure definitions with one corresponding
340*733Speter  * to each namelist class, ala a variant record in Pascal.
341*733Speter  */
342*733Speter #define	BADUSE	0
343*733Speter #define	CONST	1
344*733Speter #define	TYPE	2
345*733Speter #define	VAR	3
346*733Speter #define	ARRAY	4
347*733Speter #define	PTRFILE	5
348*733Speter #define	RECORD	6
349*733Speter #define	FIELD	7
350*733Speter #define	PROC	8
351*733Speter #define	FUNC	9
352*733Speter #define	FVAR	10
353*733Speter #define	REF	11
354*733Speter #define	PTR	12
355*733Speter #define	FILET	13
356*733Speter #define	SET	14
357*733Speter #define	RANGE	15
358*733Speter #define	LABEL	16
359*733Speter #define	WITHPTR 17
360*733Speter #define	SCAL	18
361*733Speter #define	STR	19
362*733Speter #define	PROG	20
363*733Speter #define	IMPROPER 21
364*733Speter #define	VARNT	22
365*733Speter 
366*733Speter /*
367*733Speter  * Clnames points to an array of names for the
368*733Speter  * namelist classes.
369*733Speter  */
370*733Speter char	**clnames;
371*733Speter 
372*733Speter /*
373*733Speter  * PRE-DEFINED NAMELIST OFFSETS
374*733Speter  *
375*733Speter  * The following are the namelist offsets for the
376*733Speter  * primitive types. The ones which are negative
377*733Speter  * don't actually exist, but are generated and tested
378*733Speter  * internally. These definitions are sensitive to the
379*733Speter  * initializations in nl.c.
380*733Speter  */
381*733Speter #define	TFIRST -7
382*733Speter #define	TFILE  -7
383*733Speter #define	TREC   -6
384*733Speter #define	TARY   -5
385*733Speter #define	TSCAL  -4
386*733Speter #define	TPTR   -3
387*733Speter #define	TSET   -2
388*733Speter #define	TSTR   -1
389*733Speter #define	NIL	0
390*733Speter #define	TBOOL	1
391*733Speter #define	TCHAR	2
392*733Speter #define	TINT	3
393*733Speter #define	TDOUBLE	4
394*733Speter #define	TNIL	5
395*733Speter #define	T1INT	6
396*733Speter #define	T2INT	7
397*733Speter #define	T4INT	8
398*733Speter #define	T1CHAR	9
399*733Speter #define	T1BOOL	10
400*733Speter #define	T8REAL	11
401*733Speter #define TLAST	11
402*733Speter 
403*733Speter /*
404*733Speter  * SEMANTIC DEFINITIONS
405*733Speter  */
406*733Speter 
407*733Speter /*
408*733Speter  * NOCON and SAWCON are flags in the tree telling whether
409*733Speter  * a constant set is part of an expression.
410*733Speter  */
411*733Speter #define NOCON	0
412*733Speter #define SAWCON	1
413*733Speter 
414*733Speter /*
415*733Speter  * The variable cbn gives the current block number,
416*733Speter  * the variable bn is set as a side effect of a call to
417*733Speter  * lookup, and is the block number of the variable which
418*733Speter  * was found.
419*733Speter  */
420*733Speter short	bn, cbn;
421*733Speter 
422*733Speter /*
423*733Speter  * The variable line is the current semantic
424*733Speter  * line and is set in stat.c from the numbers
425*733Speter  * embedded in statement type tree nodes.
426*733Speter  */
427*733Speter short	line;
428*733Speter 
429*733Speter /*
430*733Speter  * The size of the display
431*733Speter  * which defines the maximum nesting
432*733Speter  * of procedures and functions allowed.
433*733Speter  * Because of the flags in the current namelist
434*733Speter  * this must be no greater than 32.
435*733Speter  */
436*733Speter #define	DSPLYSZ 20
437*733Speter 
438*733Speter /*
439*733Speter  * The following structure is used
440*733Speter  * to keep track of the amount of variable
441*733Speter  * storage required by each block.
442*733Speter  * "Max" is the high water mark, "off"
443*733Speter  * the current need. Temporaries for "for"
444*733Speter  * loops and "with" statements are allocated
445*733Speter  * in the local variable area and these
446*733Speter  * numbers are thereby changed if necessary.
447*733Speter  */
448*733Speter struct om {
449*733Speter 	long	om_off;
450*733Speter 	long	om_max;
451*733Speter } sizes[DSPLYSZ];
452*733Speter 
453*733Speter     /*
454*733Speter      *	the following structure records whether a level declares
455*733Speter      *	any variables which are (or contain) files.
456*733Speter      *	this so that the runtime routines for file cleanup can be invoked.
457*733Speter      */
458*733Speter bool	dfiles[ DSPLYSZ ];
459*733Speter 
460*733Speter /*
461*733Speter  * Structure recording information about a constant
462*733Speter  * declaration.  It is actually the return value from
463*733Speter  * the routine "gconst", but since C doesn't support
464*733Speter  * record valued functions, this is more convenient.
465*733Speter  */
466*733Speter struct {
467*733Speter 	struct nl	*ctype;
468*733Speter 	short		cival;
469*733Speter 	double		crval;
470*733Speter 	int		*cpval;
471*733Speter } con;
472*733Speter 
473*733Speter /*
474*733Speter  * The set structure records the lower bound
475*733Speter  * and upper bound with the lower bound normalized
476*733Speter  * to zero when working with a set. It is set by
477*733Speter  * the routine setran in var.c.
478*733Speter  */
479*733Speter struct {
480*733Speter 	short	lwrb, uprbp;
481*733Speter } set;
482*733Speter 
483*733Speter     /*
484*733Speter      *	structures of this kind are filled in by precset and used by postcset
485*733Speter      *	to indicate things about constant sets.
486*733Speter      */
487*733Speter struct csetstr {
488*733Speter     struct nl	*csettype;
489*733Speter     long	paircnt;
490*733Speter     long	singcnt;
491*733Speter     bool	comptime;
492*733Speter };
493*733Speter /*
494*733Speter  * The following flags are passed on calls to lvalue
495*733Speter  * to indicate how the reference is to affect the usage
496*733Speter  * information for the variable being referenced.
497*733Speter  * MOD is used to set the NMOD flag in the namelist
498*733Speter  * entry for the variable, ASGN permits diagnostics
499*733Speter  * to be formed when a for variable is assigned to in
500*733Speter  * the range of the loop.
501*733Speter  */
502*733Speter #define	NOFLAGS	0
503*733Speter #define	MOD	01
504*733Speter #define	ASGN	02
505*733Speter #define	NOUSE	04
506*733Speter 
507*733Speter     /*
508*733Speter      *	the following flags are passed to lvalue and rvalue
509*733Speter      *	to tell them whether an lvalue or rvalue is required.
510*733Speter      *	the semantics checking is done according to the function called,
511*733Speter      *	but for pc, lvalue may put out an rvalue by indirecting afterwards,
512*733Speter      *	and rvalue may stop short of putting out the indirection.
513*733Speter      */
514*733Speter #define	LREQ	01
515*733Speter #define	RREQ	02
516*733Speter 
517*733Speter double	MAXINT;
518*733Speter double	MININT;
519*733Speter 
520*733Speter /*
521*733Speter  * Variables for generation of profile information.
522*733Speter  * Monflg is set when we want to generate a profile.
523*733Speter  * Gocnt record the total number of goto's and
524*733Speter  * cnts records the current counter for generating
525*733Speter  * COUNT operators.
526*733Speter  */
527*733Speter short	gocnt;
528*733Speter short	cnts;
529*733Speter 
530*733Speter /*
531*733Speter  * Most routines call "incompat" rather than asking "!compat"
532*733Speter  * for historical reasons.
533*733Speter  */
534*733Speter #define incompat 	!compat
535*733Speter 
536*733Speter /*
537*733Speter  * Parts records which declaration parts have been seen.
538*733Speter  * The grammar allows the "const" "type" and "var"
539*733Speter  * parts to be repeated and to be in any order, so that
540*733Speter  * they can be detected semantically to give better
541*733Speter  * error diagnostics.
542*733Speter  */
543*733Speter short	parts;
544*733Speter 
545*733Speter #define	LPRT	01
546*733Speter #define	CPRT	02
547*733Speter #define	TPRT	04
548*733Speter #define	VPRT	08
549*733Speter 
550*733Speter /*
551*733Speter  * Flags for the "you used / instead of div" diagnostic
552*733Speter  */
553*733Speter bool	divchk;
554*733Speter bool	divflg;
555*733Speter 
556*733Speter short	errcnt[DSPLYSZ];
557*733Speter 
558*733Speter /*
559*733Speter  * Forechain links those types which are
560*733Speter  *	^ sometype
561*733Speter  * so that they can be evaluated later, permitting
562*733Speter  * circular, recursive list structures to be defined.
563*733Speter  */
564*733Speter struct	nl *forechain;
565*733Speter 
566*733Speter /*
567*733Speter  * Withlist links all the records which are currently
568*733Speter  * opened scopes because of with statements.
569*733Speter  */
570*733Speter struct	nl *withlist;
571*733Speter 
572*733Speter struct	nl *intset;
573*733Speter struct	nl *input, *output;
574*733Speter struct	nl *program;
575*733Speter 
576*733Speter /* progseen flag used by PC to determine if
577*733Speter  * a routine segment is being compiled (and
578*733Speter  * therefore no program statement seen)
579*733Speter  */
580*733Speter bool	progseen;
581*733Speter 
582*733Speter 
583*733Speter /*
584*733Speter  * STRUCTURED STATEMENT GOTO CHECKING
585*733Speter  *
586*733Speter  * The variable level keeps track of the current
587*733Speter  * "structured statement level" when processing the statement
588*733Speter  * body of blocks.  This is used in the detection of goto's into
589*733Speter  * structured statements in a block.
590*733Speter  *
591*733Speter  * Each label's namelist entry contains two pieces of information
592*733Speter  * related to this check. The first `NL_GOLEV' either contains
593*733Speter  * the level at which the label was declared, `NOTYET' if the label
594*733Speter  * has not yet been declared, or `DEAD' if the label is dead, i.e.
595*733Speter  * if we have exited the level in which the label was defined.
596*733Speter  *
597*733Speter  * When we discover a "goto" statement, if the label has not
598*733Speter  * been defined yet, then we record the current level and the current line
599*733Speter  * for a later error check.  If the label has been already become "DEAD"
600*733Speter  * then a reference to it is an error.  Now the compiler maintains,
601*733Speter  * for each block, a linked list of the labels headed by "gotos[bn]".
602*733Speter  * When we exit a structured level, we perform the routine
603*733Speter  * ungoto in stat.c. It notices labels whose definition levels have been
604*733Speter  * exited and makes them be dead. For labels which have not yet been
605*733Speter  * defined, ungoto will maintain NL_GOLEV as the minimum structured level
606*733Speter  * since the first usage of the label. It is not hard to see that the label
607*733Speter  * must eventually be declared at this level or an outer level to this
608*733Speter  * one or a goto into a structured statement will exist.
609*733Speter  */
610*733Speter short	level;
611*733Speter struct	nl *gotos[DSPLYSZ];
612*733Speter 
613*733Speter #define	NOTYET	10000
614*733Speter #define	DEAD	10000
615*733Speter 
616*733Speter /*
617*733Speter  * Noreach is true when the next statement will
618*733Speter  * be unreachable unless something happens along
619*733Speter  * (like exiting a looping construct) to save
620*733Speter  * the day.
621*733Speter  */
622*733Speter bool	noreach;
623*733Speter 
624*733Speter /*
625*733Speter  * UNDEFINED VARIABLE REFERENCE STRUCTURES
626*733Speter  */
627*733Speter struct	udinfo {
628*733Speter 	int	ud_line;
629*733Speter 	struct	udinfo *ud_next;
630*733Speter 	char	nullch;
631*733Speter };
632*733Speter 
633*733Speter /*
634*733Speter  * CODE GENERATION DEFINITIONS
635*733Speter  */
636*733Speter 
637*733Speter /*
638*733Speter  * NSTAND is or'ed onto the abstract machine opcode
639*733Speter  * for non-standard built-in procedures and functions.
640*733Speter  */
641*733Speter #define	NSTAND	0400
642*733Speter 
643*733Speter #define	codeon()	cgenflg++
644*733Speter #define	codeoff()	--cgenflg
645*733Speter 
646*733Speter /*
647*733Speter  * Codeline is the last lino output in the code generator.
648*733Speter  * It used to be used to suppress LINO operators but no
649*733Speter  * more since we now count statements.
650*733Speter  * Lc is the intepreter code location counter.
651*733Speter  *
652*733Speter short	codeline;
653*733Speter  */
654*733Speter char	*lc;
655*733Speter 
656*733Speter 
657*733Speter /*
658*733Speter  * Routines which need types
659*733Speter  * other than "integer" to be
660*733Speter  * assumed by the compiler.
661*733Speter  */
662*733Speter double		atof();
663*733Speter long		lwidth();
664*733Speter long		aryconst();
665*733Speter long		a8tol();
666*733Speter struct nl 	*lookup();
667*733Speter double		atof();
668*733Speter int		*tree();
669*733Speter int		*hash();
670*733Speter char		*alloc();
671*733Speter int		*calloc();
672*733Speter char		*savestr();
673*733Speter struct nl	*lookup1();
674*733Speter struct nl	*hdefnl();
675*733Speter struct nl	*defnl();
676*733Speter struct nl	*enter();
677*733Speter struct nl	*nlcopy();
678*733Speter struct nl	*tyrecl();
679*733Speter struct nl	*tyary();
680*733Speter struct nl	*fields();
681*733Speter struct nl	*variants();
682*733Speter struct nl	*deffld();
683*733Speter struct nl	*defvnt();
684*733Speter struct nl	*tyrec1();
685*733Speter struct nl	*reclook();
686*733Speter struct nl	*asgnop1();
687*733Speter struct nl	*gtype();
688*733Speter struct nl	*call();
689*733Speter struct nl	*lvalue();
690*733Speter struct nl	*rvalue();
691*733Speter struct nl	*cset();
692*733Speter 
693*733Speter /*
694*733Speter  * type cast NIL to keep lint happy (which is not so bad)
695*733Speter  */
696*733Speter #define		NLNIL	( (struct nl *) NIL )
697*733Speter 
698*733Speter /*
699*733Speter  * Funny structures to use
700*733Speter  * pointers in wild and wooly ways
701*733Speter  */
702*733Speter struct {
703*733Speter 	char	pchar;
704*733Speter };
705*733Speter struct {
706*733Speter 	short	pint;
707*733Speter 	short	pint2;
708*733Speter };
709*733Speter struct {
710*733Speter 	long	plong;
711*733Speter };
712*733Speter struct {
713*733Speter 	double	pdouble;
714*733Speter };
715*733Speter 
716*733Speter #define	OCT	1
717*733Speter #define	HEX	2
718*733Speter 
719*733Speter /*
720*733Speter  * MAIN PROGRAM VARIABLES, MISCELLANY
721*733Speter  */
722*733Speter 
723*733Speter /*
724*733Speter  * Variables forming a data base referencing
725*733Speter  * the command line arguments with the "i" option, e.g.
726*733Speter  * in "pi -i scanner.i compiler.p".
727*733Speter  */
728*733Speter char	**pflist;
729*733Speter short	pflstc;
730*733Speter short	pfcnt;
731*733Speter 
732*733Speter char	*filename;		/* current source file name */
733*733Speter long	tvec;
734*733Speter extern char	*snark;		/* SNARK */
735*733Speter extern char	*classes[ ];	/* maps namelist classes to string names */
736*733Speter 
737*733Speter #define	derror error
738*733Speter 
739*733Speter #ifdef	PC
740*733Speter 
741*733Speter     /*
742*733Speter      *	the current function number, for [ lines
743*733Speter      */
744*733Speter     int	ftnno;
745*733Speter 
746*733Speter     /*
747*733Speter      *	the pc output stream
748*733Speter      */
749*733Speter     FILE *pcstream;
750*733Speter 
751*733Speter #endif PC
752