xref: /csrg-svn/usr.bin/pascal/src/0.h (revision 15972)
1733Speter /* Copyright (c) 1979 Regents of the University of California */
2733Speter 
3*15972Smckusick /* static char sccsid[] = "@(#)0.h 1.23 02/08/84"; */
4733Speter 
5733Speter #define DEBUG
63071Smckusic #define CONSETS
7733Speter #define	CHAR
8733Speter #define	STATIC
9733Speter #define hp21mx 0
10733Speter 
11733Speter #include	<stdio.h>
12733Speter #include	<sys/types.h>
13733Speter 
143071Smckusic typedef enum {FALSE, TRUE} bool;
15733Speter 
16733Speter /*
17733Speter  * Option flags
18733Speter  *
19733Speter  * The following options are recognized in the text of the program
20733Speter  * and also on the command line:
21733Speter  *
22733Speter  *	b	block buffer the file output
23733Speter  *
24733Speter  *	i	make a listing of the procedures and functions in
25733Speter  *		the following include files
26733Speter  *
27733Speter  *	l	make a listing of the program
28733Speter  *
29733Speter  *	n	place each include file on a new page with a header
30733Speter  *
31733Speter  *	p	disable post mortem and statement limit counting
32733Speter  *
33733Speter  *	t	disable run-time tests
34733Speter  *
35733Speter  *	u	card image mode; only first 72 chars of input count
36733Speter  *
37733Speter  *	w	suppress special diagnostic warnings
38733Speter  *
39733Speter  *	z	generate counters for an execution profile
40733Speter  */
41733Speter #ifdef DEBUG
42733Speter bool	fulltrace, errtrace, testtrace, yyunique;
43733Speter #endif DEBUG
44733Speter 
45733Speter /*
46733Speter  * Each option has a stack of 17 option values, with opts giving
47733Speter  * the current, top value, and optstk the value beneath it.
48733Speter  * One refers to option `l' as, e.g., opt('l') in the text for clarity.
49733Speter  */
50733Speter char	opts[ 'z' - 'A' + 1];
51733Speter short	optstk[ 'z' - 'A' + 1];
52733Speter 
53733Speter #define opt(c) opts[c-'A']
54733Speter 
55733Speter /*
56733Speter  * Monflg is set when we are generating
57733Speter  * a pxp profile.  this is set by the -z command line option.
58733Speter  */
59733Speter bool	monflg;
60733Speter 
61733Speter     /*
62733Speter      *	profflag is set when we are generating a prof profile.
63733Speter      *	this is set by the -p command line option.
64733Speter      */
6514750Sthien #ifdef PC
66733Speter bool	profflag;
6714750Sthien #endif
68733Speter 
69733Speter 
70733Speter /*
71733Speter  * NOTES ON THE DYNAMIC NATURE OF THE DATA STRUCTURES
72733Speter  *
73733Speter  * Pi uses expandable tables for
74733Speter  * its namelist (symbol table), string table
75733Speter  * hash table, and parse tree space.  The following
76733Speter  * definitions specify the size of the increments
77733Speter  * for these items in fundamental units so that
78733Speter  * each uses approximately 1024 bytes.
79733Speter  */
80733Speter 
81733Speter #define	STRINC	1024		/* string space increment */
82733Speter #define	TRINC	512		/* tree space increment */
83733Speter #define	HASHINC	509		/* hash table size in words, each increment */
84733Speter #define	NLINC	56		/* namelist increment size in nl structs */
85733Speter 
86733Speter /*
87733Speter  * The initial sizes of the structures.
88733Speter  * These should be large enough to compile
89733Speter  * an "average" sized program so as to minimize
90733Speter  * storage requests.
91733Speter  * On a small system or and 11/34 or 11/40
92733Speter  * these numbers can be trimmed to make the
93733Speter  * compiler smaller.
94733Speter  */
95733Speter #define	ITREE	2000
96733Speter #define	INL	200
97733Speter #define	IHASH	509
98733Speter 
99733Speter /*
100733Speter  * The following limits on hash and tree tables currently
101733Speter  * allow approximately 1200 symbols and 20k words of tree
102733Speter  * space.  The fundamental limit of 64k total data space
103733Speter  * should be exceeded well before these are full.
104733Speter  */
105733Speter /*
106733Speter  * TABLE_MULTIPLIER is for uniformly increasing the sizes of the tables
107733Speter  */
10810658Speter #ifdef ADDR32
109733Speter #define TABLE_MULTIPLIER	8
11010658Speter #endif ADDR32
11110658Speter #ifdef ADDR16
1123071Smckusic #define TABLE_MULTIPLIER	1
11310658Speter #endif ADDR16
114733Speter #define	MAXHASH	(4 * TABLE_MULTIPLIER)
115733Speter #define	MAXNL	(12 * TABLE_MULTIPLIER)
116733Speter #define	MAXTREE	(30 * TABLE_MULTIPLIER)
117733Speter /*
118733Speter  * MAXDEPTH is the depth of the parse stack.
119733Speter  * STACK_MULTIPLIER is for increasing its size.
120733Speter  */
12110658Speter #ifdef ADDR32
122733Speter #define	STACK_MULTIPLIER	8
12310658Speter #endif ADDR32
12410658Speter #ifdef ADDR16
1253071Smckusic #define	STACK_MULTIPLIER	1
12610658Speter #endif ADDR16
127733Speter #define	MAXDEPTH ( 150 * STACK_MULTIPLIER )
128733Speter 
129733Speter /*
130733Speter  * ERROR RELATED DEFINITIONS
131733Speter  */
132733Speter 
133733Speter /*
134733Speter  * Exit statuses to pexit
135733Speter  *
136733Speter  * AOK
137733Speter  * ERRS		Compilation errors inhibit obj productin
138733Speter  * NOSTART	Errors before we ever got started
139733Speter  * DIED		We ran out of memory or some such
140733Speter  */
141733Speter #define	AOK	0
142733Speter #define	ERRS	1
143733Speter #define	NOSTART	2
144733Speter #define	DIED	3
145733Speter 
146733Speter bool	Recovery;
147733Speter 
14814750Sthien #define	eholdnl()	Eholdnl = TRUE
14914750Sthien #define	nocascade()	Enocascade = TRUE
150733Speter 
151733Speter bool	Eholdnl, Enocascade;
152733Speter 
153733Speter 
154733Speter /*
155733Speter  * The flag eflg is set whenever we have a hard error.
156733Speter  * The character in errpfx will precede the next error message.
157733Speter  * When cgenflg is set code generation is suppressed.
158733Speter  * This happens whenver we have an error (i.e. if eflg is set)
159733Speter  * and when we are walking the tree to determine types only.
160733Speter  */
161733Speter bool	eflg;
162733Speter char	errpfx;
163733Speter 
164733Speter #define	setpfx(x)	errpfx = x
165733Speter 
166733Speter #define	standard()	setpfx('s')
167733Speter #define	warning()	setpfx('w')
168733Speter #define	recovered()	setpfx('e')
1696358Speter #define	continuation()	setpfx(' ')
170733Speter 
1713071Smckusic int	cgenflg;
172733Speter 
173733Speter 
174733Speter /*
175733Speter  * The flag syneflg is used to suppress the diagnostics of the form
176733Speter  *	E 10 a, defined in someprocedure, is neither used nor set
177733Speter  * when there were syntax errors in "someprocedure".
178733Speter  * In this case, it is likely that these warinings would be spurious.
179733Speter  */
180733Speter bool	syneflg;
181733Speter 
182733Speter /*
183733Speter  * The compiler keeps its error messages in a file.
184733Speter  * The variable efil is the unit number on which
185733Speter  * this file is open for reading of error message text.
186733Speter  * Similarly, the file ofil is the unit of the file
187733Speter  * "obj" where we write the interpreter code.
188733Speter  */
189733Speter short	efil;
19014750Sthien 
19114750Sthien #ifdef OBJ
192733Speter short	ofil;
19314750Sthien 
194733Speter short	obuf[518];
19514750Sthien #endif
196733Speter 
1973071Smckusic bool	Enoline;
1983071Smckusic #define	elineoff()	Enoline = TRUE
1993071Smckusic #define	elineon()	Enoline = FALSE
200733Speter 
201733Speter 
202733Speter /*
203733Speter  * SYMBOL TABLE STRUCTURE DEFINITIONS
204733Speter  *
205733Speter  * The symbol table is henceforth referred to as the "namelist".
206733Speter  * It consists of a number of structures of the form "nl" below.
207733Speter  * These are contained in a number of segments of the symbol
208733Speter  * table which are dynamically allocated as needed.
209733Speter  * The major namelist manipulation routines are contained in the
210733Speter  * file "nl.c".
211733Speter  *
212733Speter  * The major components of a namelist entry are the "symbol", giving
213733Speter  * a pointer into the string table for the string associated with this
214733Speter  * entry and the "class" which tells which of the (currently 19)
215733Speter  * possible types of structure this is.
216733Speter  *
217733Speter  * Many of the classes use the "type" field for a pointer to the type
218733Speter  * which the entry has.
219733Speter  *
220733Speter  * Other pieces of information in more than one class include the block
221733Speter  * in which the symbol is defined, flags indicating whether the symbol
222733Speter  * has been used and whether it has been assigned to, etc.
223733Speter  *
224733Speter  * A more complete discussion of the features of the namelist is impossible
225733Speter  * here as it would be too voluminous.  Refer to the "PI 1.0 Implementation
226733Speter  * Notes" for more details.
227733Speter  */
228733Speter 
229733Speter /*
230733Speter  * The basic namelist structure.
2317915Smckusick  * There is a union of data types defining the stored information
2327915Smckusick  * as pointers, integers, longs, or a double.
233733Speter  *
234733Speter  * The array disptab defines the hash header for the symbol table.
235733Speter  * Symbols are hashed based on the low 6 bits of their pointer into
236733Speter  * the string table; see the routines in the file "lookup.c" and also "fdec.c"
237733Speter  * especially "funcend".
238733Speter  */
2393220Smckusic extern int	pnumcnt;
2403220Smckusic 
241733Speter struct	nl {
242733Speter 	char	*symbol;
2437915Smckusick 	char	info[4];
244733Speter 	struct	nl *type;
245733Speter 	struct	nl *chain, *nl_next;
2467915Smckusick 	union {
24714750Sthien 		struct nl *un_ptr[5];
24814750Sthien 		int	   un_value[5];
24914750Sthien 		long	   un_range[2];
25014750Sthien 		double	   un_real;
251*15972Smckusick 		struct nl  *un_nptr[5];	/* Points to conformant array bounds */
2527915Smckusick 	} nl_un;
253733Speter #	ifdef PTREE
254733Speter 	    pPointer	inTree;
255733Speter #	endif PTREE
2567915Smckusick };
257733Speter 
2588680Speter #define class		info[0]
2598680Speter #define nl_flags	info[1]
2608680Speter #define nl_block	info[1]
2618680Speter #define extra_flags	info[2]
2628680Speter #define align_info	info[3]
263733Speter 
2648680Speter #define range	nl_un.un_range
2658680Speter #define value	nl_un.un_value
2668680Speter #define ptr	nl_un.un_ptr
2678680Speter #define real	nl_un.un_real
268*15972Smckusick #define nptr	nl_un.un_nptr
269733Speter 
2707915Smckusick extern struct nl *nlp, *disptab[077+1], *Fp;
2717915Smckusick extern struct nl nl[INL];
272733Speter 
2733370Speter 
274733Speter /*
275733Speter  * NL FLAGS BITS
276733Speter  *
277733Speter  * Definitions of the usage of the bits in
278733Speter  * the nl_flags byte. Note that the low 5 bits of the
279733Speter  * byte are the "nl_block" and that some classes make use
280733Speter  * of this byte as a "width".
281733Speter  *
282733Speter  * The only non-obvious bit definition here is "NFILES"
283733Speter  * which records whether a structure contains any files.
284733Speter  * Such structures are not allowed to be dynamically allocated.
285733Speter  */
2863370Speter 
2873370Speter #define	BLOCKNO( flag )	( flag & 037 )
2883370Speter #define NLFLAGS( flag ) ( flag &~ 037 )
2893370Speter 
290733Speter #define	NUSED	0100
291733Speter #define	NMOD	0040
292733Speter #define	NFORWD	0200
293733Speter #define	NFILES	0200
294733Speter #ifdef PC
295733Speter #define NEXTERN 0001	/* flag used to mark external funcs and procs */
2963823Speter #define	NLOCAL	0002	/* variable is a local */
2973823Speter #define	NPARAM	0004	/* variable is a parameter */
2983823Speter #define	NGLOBAL	0010	/* variable is a global */
2993823Speter #define	NREGVAR	0020	/* or'ed in if variable is in a register */
3009126Smckusick #define NNLOCAL 0040	/* named local variable, not used in symbol table */
3013823Speter #endif PC
3023370Speter 
3033540Speter /*
3043540Speter  * used to mark value[ NL_FORV ] for loop variables
3053540Speter  */
3063540Speter #define	FORVAR		1
307733Speter 
308733Speter /*
309733Speter  * Definition of the commonly used "value" fields.
310733Speter  * The most important one is NL_OFFS which gives
311733Speter  * the offset of a variable in its stack mark.
312733Speter  */
313733Speter #define NL_OFFS	0
314733Speter 
315733Speter #define	NL_CNTR	1
3163296Smckusic #define NL_NLSTRT 2
3173296Smckusic #define	NL_LINENO 3
318733Speter #define	NL_FVAR	3
3197915Smckusick #define	NL_ENTLOC 4	/* FUNC, PROC - entry point */
3207915Smckusick #define	NL_FCHAIN 4	/* FFUNC, FPROC - ptr to formals */
321733Speter 
322733Speter #define NL_GOLEV 2
323733Speter #define NL_GOLINE 3
324733Speter #define NL_FORV 1
325733Speter 
3268680Speter     /*
3278680Speter      *	nlp -> nl_un.un_ptr[] subscripts for records
3288680Speter      *	NL_FIELDLIST	the chain of fixed fields of a record, in order.
3298680Speter      *			the fields are also chained through ptr[NL_FIELDLIST].
3308680Speter      *			this does not include the tag, or fields of variants.
3318680Speter      *	NL_VARNT	pointer to the variants of a record,
3328680Speter      *			these are then chained through the .chain field.
3338680Speter      *	NL_VTOREC	pointer from a VARNT to the RECORD that is the variant.
3348680Speter      *	NL_TAG		pointer from a RECORD to the tagfield
3358680Speter      *			if there are any variants.
3368680Speter      *	align_info	the alignment of a RECORD is in info[3].
3378680Speter      */
3388680Speter #define	NL_FIELDLIST	1
3398680Speter #define	NL_VARNT	2
3408680Speter #define	NL_VTOREC	2
3418680Speter #define	NL_TAG		3
3428680Speter /* and align_info is info[3].  #defined above */
343733Speter 
3447915Smckusick #define	NL_ELABEL 4	/* SCAL - ptr to definition of enums */
345733Speter 
346733Speter /*
347733Speter  * For BADUSE nl structures, NL_KINDS is a bit vector
348733Speter  * indicating the kinds of illegal usages complained about
349733Speter  * so far.  For kind of bad use "kind", "1 << kind" is set.
350733Speter  * The low bit is reserved as ISUNDEF to indicate whether
351733Speter  * this identifier is totally undefined.
352733Speter  */
353733Speter #define	NL_KINDS	0
354733Speter 
355733Speter #define	ISUNDEF		1
3563275Smckusic 
3573823Speter     /*
3583823Speter      *	variables come in three flavors: globals, parameters, locals;
3593823Speter      *	they can also hide in registers, but that's a different flag
3603823Speter      */
3613275Smckusic #define PARAMVAR	1
3623275Smckusic #define LOCALVAR	2
3633823Speter #define	GLOBALVAR	3
3649126Smckusick #define	NAMEDLOCALVAR	4
365733Speter 
366733Speter /*
367733Speter  * NAMELIST CLASSES
368733Speter  *
369733Speter  * The following are the namelist classes.
370733Speter  * Different classes make use of the value fields
371733Speter  * of the namelist in different ways.
372733Speter  *
373733Speter  * The namelist should be redesigned by providing
374733Speter  * a number of structure definitions with one corresponding
375733Speter  * to each namelist class, ala a variant record in Pascal.
376733Speter  */
377733Speter #define	BADUSE	0
378733Speter #define	CONST	1
379733Speter #define	TYPE	2
380733Speter #define	VAR	3
381733Speter #define	ARRAY	4
382733Speter #define	PTRFILE	5
383733Speter #define	RECORD	6
384733Speter #define	FIELD	7
385733Speter #define	PROC	8
386733Speter #define	FUNC	9
387733Speter #define	FVAR	10
388733Speter #define	REF	11
389733Speter #define	PTR	12
390733Speter #define	FILET	13
391733Speter #define	SET	14
392733Speter #define	RANGE	15
393733Speter #define	LABEL	16
394733Speter #define	WITHPTR 17
395733Speter #define	SCAL	18
396733Speter #define	STR	19
397733Speter #define	PROG	20
398733Speter #define	IMPROPER 21
399733Speter #define	VARNT	22
4001194Speter #define	FPROC	23
4011194Speter #define	FFUNC	24
402*15972Smckusick #define CRANGE	25
403733Speter 
404733Speter /*
405733Speter  * Clnames points to an array of names for the
406733Speter  * namelist classes.
407733Speter  */
408733Speter char	**clnames;
409733Speter 
410733Speter /*
411733Speter  * PRE-DEFINED NAMELIST OFFSETS
412733Speter  *
413733Speter  * The following are the namelist offsets for the
414733Speter  * primitive types. The ones which are negative
415733Speter  * don't actually exist, but are generated and tested
416733Speter  * internally. These definitions are sensitive to the
417733Speter  * initializations in nl.c.
418733Speter  */
419733Speter #define	TFIRST -7
420733Speter #define	TFILE  -7
421733Speter #define	TREC   -6
422733Speter #define	TARY   -5
423733Speter #define	TSCAL  -4
424733Speter #define	TPTR   -3
425733Speter #define	TSET   -2
426733Speter #define	TSTR   -1
427733Speter #define	NIL	0
428733Speter #define	TBOOL	1
429733Speter #define	TCHAR	2
430733Speter #define	TINT	3
431733Speter #define	TDOUBLE	4
432733Speter #define	TNIL	5
433733Speter #define	T1INT	6
434733Speter #define	T2INT	7
435733Speter #define	T4INT	8
436733Speter #define	T1CHAR	9
437733Speter #define	T1BOOL	10
438733Speter #define	T8REAL	11
439733Speter #define TLAST	11
440733Speter 
441733Speter /*
442733Speter  * SEMANTIC DEFINITIONS
443733Speter  */
444733Speter 
445733Speter /*
446733Speter  * NOCON and SAWCON are flags in the tree telling whether
447733Speter  * a constant set is part of an expression.
4483314Speter  *	these are no longer used,
4493314Speter  *	since we now do constant sets at compile time.
450733Speter  */
451733Speter #define NOCON	0
452733Speter #define SAWCON	1
453733Speter 
454733Speter /*
455733Speter  * The variable cbn gives the current block number,
456733Speter  * the variable bn is set as a side effect of a call to
457733Speter  * lookup, and is the block number of the variable which
458733Speter  * was found.
459733Speter  */
460733Speter short	bn, cbn;
461733Speter 
462733Speter /*
463733Speter  * The variable line is the current semantic
464733Speter  * line and is set in stat.c from the numbers
465733Speter  * embedded in statement type tree nodes.
466733Speter  */
467733Speter short	line;
468733Speter 
469733Speter /*
470733Speter  * The size of the display
471733Speter  * which defines the maximum nesting
472733Speter  * of procedures and functions allowed.
473733Speter  * Because of the flags in the current namelist
474733Speter  * this must be no greater than 32.
475733Speter  */
476733Speter #define	DSPLYSZ 20
477733Speter 
478733Speter     /*
479733Speter      *	the following structure records whether a level declares
480733Speter      *	any variables which are (or contain) files.
481733Speter      *	this so that the runtime routines for file cleanup can be invoked.
482733Speter      */
483733Speter bool	dfiles[ DSPLYSZ ];
484733Speter 
485733Speter /*
486733Speter  * Structure recording information about a constant
487733Speter  * declaration.  It is actually the return value from
488733Speter  * the routine "gconst", but since C doesn't support
489733Speter  * record valued functions, this is more convenient.
490733Speter  */
491733Speter struct {
492733Speter 	struct nl	*ctype;
493733Speter 	short		cival;
494733Speter 	double		crval;
49514750Sthien 	char		*cpval;	/* note used to be int * */
496733Speter } con;
497733Speter 
498733Speter /*
499733Speter  * The set structure records the lower bound
500733Speter  * and upper bound with the lower bound normalized
501733Speter  * to zero when working with a set. It is set by
502733Speter  * the routine setran in var.c.
503733Speter  */
504733Speter struct {
505733Speter 	short	lwrb, uprbp;
506733Speter } set;
507733Speter 
508733Speter     /*
509733Speter      *	structures of this kind are filled in by precset and used by postcset
510733Speter      *	to indicate things about constant sets.
511733Speter      */
512733Speter struct csetstr {
513733Speter     struct nl	*csettype;
514733Speter     long	paircnt;
515733Speter     long	singcnt;
516733Speter     bool	comptime;
517733Speter };
518733Speter /*
519733Speter  * The following flags are passed on calls to lvalue
520733Speter  * to indicate how the reference is to affect the usage
521733Speter  * information for the variable being referenced.
522733Speter  * MOD is used to set the NMOD flag in the namelist
523733Speter  * entry for the variable, ASGN permits diagnostics
524733Speter  * to be formed when a for variable is assigned to in
525733Speter  * the range of the loop.
526733Speter  */
527733Speter #define	NOFLAGS	0
528733Speter #define	MOD	01
529733Speter #define	ASGN	02
530733Speter #define	NOUSE	04
531733Speter 
532733Speter     /*
533733Speter      *	the following flags are passed to lvalue and rvalue
534733Speter      *	to tell them whether an lvalue or rvalue is required.
535733Speter      *	the semantics checking is done according to the function called,
536733Speter      *	but for pc, lvalue may put out an rvalue by indirecting afterwards,
537733Speter      *	and rvalue may stop short of putting out the indirection.
538733Speter      */
539733Speter #define	LREQ	01
540733Speter #define	RREQ	02
541733Speter 
542733Speter double	MAXINT;
543733Speter double	MININT;
544733Speter 
545733Speter /*
546733Speter  * Variables for generation of profile information.
547733Speter  * Monflg is set when we want to generate a profile.
548733Speter  * Gocnt record the total number of goto's and
549733Speter  * cnts records the current counter for generating
550733Speter  * COUNT operators.
551733Speter  */
552733Speter short	gocnt;
553733Speter short	cnts;
554733Speter 
555733Speter /*
556733Speter  * Most routines call "incompat" rather than asking "!compat"
557733Speter  * for historical reasons.
558733Speter  */
559733Speter #define incompat 	!compat
560733Speter 
561733Speter /*
562733Speter  * Parts records which declaration parts have been seen.
563833Speter  * The grammar allows the "label" "const" "type" "var" and routine
564733Speter  * parts to be repeated and to be in any order, so that
565733Speter  * they can be detected semantically to give better
566733Speter  * error diagnostics.
5679126Smckusick  *
5689126Smckusick  * The flag NONLOCALVAR indicates that a non-local var has actually
5699126Smckusick  * been used hence the display must be saved; NONLOCALGOTO indicates
5709126Smckusick  * that a non-local goto has been done hence that a setjmp must be done.
571733Speter  */
572833Speter int	parts[ DSPLYSZ ];
573733Speter 
5749126Smckusick #define	LPRT		0x0001
5759126Smckusick #define	CPRT		0x0002
5769126Smckusick #define	TPRT		0x0004
5779126Smckusick #define	VPRT		0x0008
5789126Smckusick #define	RPRT		0x0010
579733Speter 
5809126Smckusick #define	NONLOCALVAR	0x0020
5819126Smckusick #define	NONLOCALGOTO	0x0040
5829126Smckusick 
583733Speter /*
584733Speter  * Flags for the "you used / instead of div" diagnostic
585733Speter  */
586733Speter bool	divchk;
587733Speter bool	divflg;
588733Speter 
5893071Smckusic bool	errcnt[DSPLYSZ];
590733Speter 
591733Speter /*
592733Speter  * Forechain links those types which are
593733Speter  *	^ sometype
594733Speter  * so that they can be evaluated later, permitting
595733Speter  * circular, recursive list structures to be defined.
596733Speter  */
597733Speter struct	nl *forechain;
598733Speter 
599733Speter /*
600733Speter  * Withlist links all the records which are currently
601733Speter  * opened scopes because of with statements.
602733Speter  */
603733Speter struct	nl *withlist;
604733Speter 
605733Speter struct	nl *intset;
606733Speter struct	nl *input, *output;
607733Speter struct	nl *program;
608733Speter 
609733Speter /* progseen flag used by PC to determine if
610733Speter  * a routine segment is being compiled (and
611733Speter  * therefore no program statement seen)
612733Speter  */
613733Speter bool	progseen;
614733Speter 
615733Speter 
616733Speter /*
617733Speter  * STRUCTURED STATEMENT GOTO CHECKING
618733Speter  *
619733Speter  * The variable level keeps track of the current
620733Speter  * "structured statement level" when processing the statement
621733Speter  * body of blocks.  This is used in the detection of goto's into
622733Speter  * structured statements in a block.
623733Speter  *
624733Speter  * Each label's namelist entry contains two pieces of information
625733Speter  * related to this check. The first `NL_GOLEV' either contains
626733Speter  * the level at which the label was declared, `NOTYET' if the label
627733Speter  * has not yet been declared, or `DEAD' if the label is dead, i.e.
628733Speter  * if we have exited the level in which the label was defined.
629733Speter  *
630733Speter  * When we discover a "goto" statement, if the label has not
631733Speter  * been defined yet, then we record the current level and the current line
632733Speter  * for a later error check.  If the label has been already become "DEAD"
633733Speter  * then a reference to it is an error.  Now the compiler maintains,
634733Speter  * for each block, a linked list of the labels headed by "gotos[bn]".
635733Speter  * When we exit a structured level, we perform the routine
636733Speter  * ungoto in stat.c. It notices labels whose definition levels have been
637733Speter  * exited and makes them be dead. For labels which have not yet been
638733Speter  * defined, ungoto will maintain NL_GOLEV as the minimum structured level
639733Speter  * since the first usage of the label. It is not hard to see that the label
640733Speter  * must eventually be declared at this level or an outer level to this
641733Speter  * one or a goto into a structured statement will exist.
642733Speter  */
643733Speter short	level;
644733Speter struct	nl *gotos[DSPLYSZ];
645733Speter 
646733Speter #define	NOTYET	10000
647733Speter #define	DEAD	10000
648733Speter 
649733Speter /*
650733Speter  * Noreach is true when the next statement will
651733Speter  * be unreachable unless something happens along
652733Speter  * (like exiting a looping construct) to save
653733Speter  * the day.
654733Speter  */
655733Speter bool	noreach;
656733Speter 
657733Speter /*
658733Speter  * UNDEFINED VARIABLE REFERENCE STRUCTURES
659733Speter  */
660733Speter struct	udinfo {
661733Speter 	int	ud_line;
662733Speter 	struct	udinfo *ud_next;
663733Speter 	char	nullch;
664733Speter };
665733Speter 
666733Speter /*
667733Speter  * CODE GENERATION DEFINITIONS
668733Speter  */
669733Speter 
670733Speter /*
671733Speter  * NSTAND is or'ed onto the abstract machine opcode
672733Speter  * for non-standard built-in procedures and functions.
673733Speter  */
674733Speter #define	NSTAND	0400
675733Speter 
676733Speter #define	codeon()	cgenflg++
677733Speter #define	codeoff()	--cgenflg
6783314Speter #define	CGENNING	( cgenflg >= 0 )
679733Speter 
680733Speter /*
681733Speter  * Codeline is the last lino output in the code generator.
682733Speter  * It used to be used to suppress LINO operators but no
683733Speter  * more since we now count statements.
684733Speter  * Lc is the intepreter code location counter.
685733Speter  *
686733Speter short	codeline;
687733Speter  */
68814750Sthien #ifdef OBJ
689733Speter char	*lc;
69014750Sthien #endif
691733Speter 
692733Speter 
693733Speter /*
694733Speter  * Routines which need types
695733Speter  * other than "integer" to be
696733Speter  * assumed by the compiler.
697733Speter  */
698733Speter double		atof();
699733Speter long		lwidth();
7003071Smckusic long		leven();
701733Speter long		aryconst();
702733Speter long		a8tol();
7033071Smckusic long		roundup();
7043823Speter struct nl 	*tmpalloc();
705733Speter struct nl 	*lookup();
706733Speter double		atof();
707733Speter int		*hash();
708733Speter char		*alloc();
70914750Sthien int		*pcalloc();
710733Speter char		*savestr();
71114750Sthien char 		*esavestr();
7123283Smckusic char		*parnam();
71314750Sthien char		*malloc();
71414750Sthien char		*getlab();
71514750Sthien char		*getnext();
71614750Sthien char		*skipbl();
71714750Sthien char		*nameof();
71814750Sthien char 		*pstrcpy();
71914750Sthien char		*myctime();
72014750Sthien char		*putlab();
7213283Smckusic bool		fcompat();
72214750Sthien bool 		constval();
72314750Sthien bool		precset();
72414750Sthien bool		nilfnil();
72514750Sthien struct nl	*funccod();
72614750Sthien struct nl	*pcfunccod();
727733Speter struct nl	*lookup1();
728733Speter struct nl	*hdefnl();
729733Speter struct nl	*defnl();
73014750Sthien struct nl	*flvalue();
73114750Sthien struct nl	*plist();
732733Speter struct nl	*enter();
733733Speter struct nl	*nlcopy();
7348680Speter struct nl	*tyrec();
735733Speter struct nl	*tyary();
73614750Sthien struct nl	*tyrang();
73714750Sthien struct nl	*tyscal();
738733Speter struct nl	*deffld();
73914750Sthien struct nl	*stklval();
74014750Sthien struct nl	*scalar();
74114750Sthien struct nl	*gen();
74214750Sthien struct nl	*stkrval();
74314750Sthien struct nl	*funcext();
74414750Sthien struct nl	*funchdr();
74514750Sthien struct nl	*funcbody();
74614750Sthien struct nl 	*yybaduse();
74714750Sthien struct nl	*stackRV();
748733Speter struct nl	*defvnt();
749733Speter struct nl	*tyrec1();
750733Speter struct nl	*reclook();
751733Speter struct nl	*asgnop1();
752733Speter struct nl	*gtype();
753733Speter struct nl	*call();
754733Speter struct nl	*lvalue();
75514750Sthien struct nl	*pclvalue();
756733Speter struct nl	*rvalue();
757733Speter struct nl	*cset();
75814750Sthien struct tnode	*newlist();
75914750Sthien struct tnode	*addlist();
76014750Sthien struct tnode	*fixlist();
76114750Sthien struct tnode	*setupvar();
76214750Sthien struct tnode	*setuptyrec();
76314750Sthien struct tnode	*setupfield();
76414750Sthien struct tnode	*tree();
76514750Sthien struct tnode	*tree1();
76614750Sthien struct tnode	*tree2();
76714750Sthien struct tnode	*tree3();
76814750Sthien struct tnode	*tree4();
76914750Sthien struct tnode	*tree5();
770733Speter 
771733Speter /*
772733Speter  * type cast NIL to keep lint happy (which is not so bad)
773733Speter  */
774733Speter #define		NLNIL	( (struct nl *) NIL )
77514750Sthien #define		TR_NIL	( (struct tnode *) NIL)
776733Speter 
777733Speter /*
778733Speter  * Funny structures to use
779733Speter  * pointers in wild and wooly ways
780733Speter  */
78114750Sthien struct cstruct{
782733Speter 	char	pchar;
783733Speter };
784733Speter struct {
785733Speter 	short	pint;
786733Speter 	short	pint2;
787733Speter };
78814750Sthien struct lstruct {
789733Speter 	long	plong;
790733Speter };
791733Speter struct {
792733Speter 	double	pdouble;
793733Speter };
794733Speter 
795733Speter #define	OCT	1
796733Speter #define	HEX	2
797733Speter 
798733Speter /*
799733Speter  * MAIN PROGRAM VARIABLES, MISCELLANY
800733Speter  */
801733Speter 
802733Speter /*
803733Speter  * Variables forming a data base referencing
804733Speter  * the command line arguments with the "i" option, e.g.
805733Speter  * in "pi -i scanner.i compiler.p".
806733Speter  */
807733Speter char	**pflist;
808733Speter short	pflstc;
809733Speter short	pfcnt;
810733Speter 
811733Speter char	*filename;		/* current source file name */
812733Speter long	tvec;
813733Speter extern char	*snark;		/* SNARK */
814733Speter extern char	*classes[ ];	/* maps namelist classes to string names */
815733Speter 
816733Speter #define	derror error
817733Speter 
818733Speter #ifdef	PC
819733Speter 
820733Speter     /*
821733Speter      *	the current function number, for [ lines
822733Speter      */
823733Speter     int	ftnno;
824733Speter 
825733Speter     /*
826733Speter      *	the pc output stream
827733Speter      */
828733Speter     FILE *pcstream;
829733Speter 
830733Speter #endif PC
831