xref: /csrg-svn/usr.bin/pascal/src/0.h (revision 8680)
1733Speter /* Copyright (c) 1979 Regents of the University of California */
2733Speter 
3*8680Speter /* static char sccsid[] = "@(#)0.h 1.16 10/19/82"; */
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      */
65733Speter bool	profflag;
66733Speter 
67733Speter 
68733Speter /*
69733Speter  * NOTES ON THE DYNAMIC NATURE OF THE DATA STRUCTURES
70733Speter  *
71733Speter  * Pi uses expandable tables for
72733Speter  * its namelist (symbol table), string table
73733Speter  * hash table, and parse tree space.  The following
74733Speter  * definitions specify the size of the increments
75733Speter  * for these items in fundamental units so that
76733Speter  * each uses approximately 1024 bytes.
77733Speter  */
78733Speter 
79733Speter #define	STRINC	1024		/* string space increment */
80733Speter #define	TRINC	512		/* tree space increment */
81733Speter #define	HASHINC	509		/* hash table size in words, each increment */
82733Speter #define	NLINC	56		/* namelist increment size in nl structs */
83733Speter 
84733Speter /*
85733Speter  * The initial sizes of the structures.
86733Speter  * These should be large enough to compile
87733Speter  * an "average" sized program so as to minimize
88733Speter  * storage requests.
89733Speter  * On a small system or and 11/34 or 11/40
90733Speter  * these numbers can be trimmed to make the
91733Speter  * compiler smaller.
92733Speter  */
93733Speter #define	ITREE	2000
94733Speter #define	INL	200
95733Speter #define	IHASH	509
96733Speter 
97733Speter /*
98733Speter  * The following limits on hash and tree tables currently
99733Speter  * allow approximately 1200 symbols and 20k words of tree
100733Speter  * space.  The fundamental limit of 64k total data space
101733Speter  * should be exceeded well before these are full.
102733Speter  */
103733Speter /*
104733Speter  * TABLE_MULTIPLIER is for uniformly increasing the sizes of the tables
105733Speter  */
1063071Smckusic #ifdef VAX
107733Speter #define TABLE_MULTIPLIER	8
1083071Smckusic #else
1093071Smckusic #define TABLE_MULTIPLIER	1
1103071Smckusic #endif VAX
111733Speter #define	MAXHASH	(4 * TABLE_MULTIPLIER)
112733Speter #define	MAXNL	(12 * TABLE_MULTIPLIER)
113733Speter #define	MAXTREE	(30 * TABLE_MULTIPLIER)
114733Speter /*
115733Speter  * MAXDEPTH is the depth of the parse stack.
116733Speter  * STACK_MULTIPLIER is for increasing its size.
117733Speter  */
1183071Smckusic #ifdef VAX
119733Speter #define	STACK_MULTIPLIER	8
1203071Smckusic #else
1213071Smckusic #define	STACK_MULTIPLIER	1
1223071Smckusic #endif VAX
123733Speter #define	MAXDEPTH ( 150 * STACK_MULTIPLIER )
124733Speter 
125733Speter /*
126733Speter  * ERROR RELATED DEFINITIONS
127733Speter  */
128733Speter 
129733Speter /*
130733Speter  * Exit statuses to pexit
131733Speter  *
132733Speter  * AOK
133733Speter  * ERRS		Compilation errors inhibit obj productin
134733Speter  * NOSTART	Errors before we ever got started
135733Speter  * DIED		We ran out of memory or some such
136733Speter  */
137733Speter #define	AOK	0
138733Speter #define	ERRS	1
139733Speter #define	NOSTART	2
140733Speter #define	DIED	3
141733Speter 
142733Speter bool	Recovery;
143733Speter 
144733Speter #define	eholdnl()	Eholdnl = 1
145733Speter #define	nocascade()	Enocascade = 1
146733Speter 
147733Speter bool	Eholdnl, Enocascade;
148733Speter 
149733Speter 
150733Speter /*
151733Speter  * The flag eflg is set whenever we have a hard error.
152733Speter  * The character in errpfx will precede the next error message.
153733Speter  * When cgenflg is set code generation is suppressed.
154733Speter  * This happens whenver we have an error (i.e. if eflg is set)
155733Speter  * and when we are walking the tree to determine types only.
156733Speter  */
157733Speter bool	eflg;
158733Speter char	errpfx;
159733Speter 
160733Speter #define	setpfx(x)	errpfx = x
161733Speter 
162733Speter #define	standard()	setpfx('s')
163733Speter #define	warning()	setpfx('w')
164733Speter #define	recovered()	setpfx('e')
1656358Speter #define	continuation()	setpfx(' ')
166733Speter 
1673071Smckusic int	cgenflg;
168733Speter 
169733Speter 
170733Speter /*
171733Speter  * The flag syneflg is used to suppress the diagnostics of the form
172733Speter  *	E 10 a, defined in someprocedure, is neither used nor set
173733Speter  * when there were syntax errors in "someprocedure".
174733Speter  * In this case, it is likely that these warinings would be spurious.
175733Speter  */
176733Speter bool	syneflg;
177733Speter 
178733Speter /*
179733Speter  * The compiler keeps its error messages in a file.
180733Speter  * The variable efil is the unit number on which
181733Speter  * this file is open for reading of error message text.
182733Speter  * Similarly, the file ofil is the unit of the file
183733Speter  * "obj" where we write the interpreter code.
184733Speter  */
185733Speter short	efil;
186733Speter short	ofil;
187733Speter short	obuf[518];
188733Speter 
1893071Smckusic bool	Enoline;
1903071Smckusic #define	elineoff()	Enoline = TRUE
1913071Smckusic #define	elineon()	Enoline = FALSE
192733Speter 
193733Speter 
194733Speter /*
195733Speter  * SYMBOL TABLE STRUCTURE DEFINITIONS
196733Speter  *
197733Speter  * The symbol table is henceforth referred to as the "namelist".
198733Speter  * It consists of a number of structures of the form "nl" below.
199733Speter  * These are contained in a number of segments of the symbol
200733Speter  * table which are dynamically allocated as needed.
201733Speter  * The major namelist manipulation routines are contained in the
202733Speter  * file "nl.c".
203733Speter  *
204733Speter  * The major components of a namelist entry are the "symbol", giving
205733Speter  * a pointer into the string table for the string associated with this
206733Speter  * entry and the "class" which tells which of the (currently 19)
207733Speter  * possible types of structure this is.
208733Speter  *
209733Speter  * Many of the classes use the "type" field for a pointer to the type
210733Speter  * which the entry has.
211733Speter  *
212733Speter  * Other pieces of information in more than one class include the block
213733Speter  * in which the symbol is defined, flags indicating whether the symbol
214733Speter  * has been used and whether it has been assigned to, etc.
215733Speter  *
216733Speter  * A more complete discussion of the features of the namelist is impossible
217733Speter  * here as it would be too voluminous.  Refer to the "PI 1.0 Implementation
218733Speter  * Notes" for more details.
219733Speter  */
220733Speter 
221733Speter /*
222733Speter  * The basic namelist structure.
2237915Smckusick  * There is a union of data types defining the stored information
2247915Smckusick  * as pointers, integers, longs, or a double.
225733Speter  *
226733Speter  * The array disptab defines the hash header for the symbol table.
227733Speter  * Symbols are hashed based on the low 6 bits of their pointer into
228733Speter  * the string table; see the routines in the file "lookup.c" and also "fdec.c"
229733Speter  * especially "funcend".
230733Speter  */
2313220Smckusic extern int	pnumcnt;
2323220Smckusic 
233733Speter #ifdef PTREE
234733Speter #   include	"pTree.h"
235733Speter #endif PTREE
236733Speter struct	nl {
237733Speter 	char	*symbol;
2387915Smckusick 	char	info[4];
239733Speter 	struct	nl *type;
240733Speter 	struct	nl *chain, *nl_next;
2417915Smckusick 	union {
2427915Smckusick 		int	*un_ptr[5];
2437915Smckusick 		int	un_value[5];
2447915Smckusick 		long	un_range[2];
2457915Smckusick 		double	un_real;
2467915Smckusick 	} nl_un;
247733Speter #	ifdef PTREE
248733Speter 	    pPointer	inTree;
249733Speter #	endif PTREE
2507915Smckusick };
251733Speter 
252*8680Speter #define class		info[0]
253*8680Speter #define nl_flags	info[1]
254*8680Speter #define nl_block	info[1]
255*8680Speter #define extra_flags	info[2]
256*8680Speter #define align_info	info[3]
257733Speter 
258*8680Speter #define range	nl_un.un_range
259*8680Speter #define value	nl_un.un_value
260*8680Speter #define ptr	nl_un.un_ptr
261*8680Speter #define real	nl_un.un_real
262733Speter 
2637915Smckusick extern struct nl *nlp, *disptab[077+1], *Fp;
2647915Smckusick extern struct nl nl[INL];
265733Speter 
2663370Speter 
267733Speter /*
268733Speter  * NL FLAGS BITS
269733Speter  *
270733Speter  * Definitions of the usage of the bits in
271733Speter  * the nl_flags byte. Note that the low 5 bits of the
272733Speter  * byte are the "nl_block" and that some classes make use
273733Speter  * of this byte as a "width".
274733Speter  *
275733Speter  * The only non-obvious bit definition here is "NFILES"
276733Speter  * which records whether a structure contains any files.
277733Speter  * Such structures are not allowed to be dynamically allocated.
278733Speter  */
2793370Speter 
2803370Speter #define	BLOCKNO( flag )	( flag & 037 )
2813370Speter #define NLFLAGS( flag ) ( flag &~ 037 )
2823370Speter 
283733Speter #define	NUSED	0100
284733Speter #define	NMOD	0040
285733Speter #define	NFORWD	0200
286733Speter #define	NFILES	0200
287733Speter #ifdef PC
288733Speter #define NEXTERN 0001	/* flag used to mark external funcs and procs */
2893823Speter #define	NLOCAL	0002	/* variable is a local */
2903823Speter #define	NPARAM	0004	/* variable is a parameter */
2913823Speter #define	NGLOBAL	0010	/* variable is a global */
2923823Speter #define	NREGVAR	0020	/* or'ed in if variable is in a register */
2933823Speter #endif PC
2943370Speter 
2953540Speter /*
2963540Speter  * used to mark value[ NL_FORV ] for loop variables
2973540Speter  */
2983540Speter #define	FORVAR		1
299733Speter 
300733Speter /*
301733Speter  * Definition of the commonly used "value" fields.
302733Speter  * The most important one is NL_OFFS which gives
303733Speter  * the offset of a variable in its stack mark.
304733Speter  */
305733Speter #define NL_OFFS	0
306733Speter 
307733Speter #define	NL_CNTR	1
3083296Smckusic #define NL_NLSTRT 2
3093296Smckusic #define	NL_LINENO 3
310733Speter #define	NL_FVAR	3
3117915Smckusick #define	NL_ENTLOC 4	/* FUNC, PROC - entry point */
3127915Smckusick #define	NL_FCHAIN 4	/* FFUNC, FPROC - ptr to formals */
313733Speter 
314733Speter #define NL_GOLEV 2
315733Speter #define NL_GOLINE 3
316733Speter #define NL_FORV 1
317733Speter 
318*8680Speter     /*
319*8680Speter      *	nlp -> nl_un.un_ptr[] subscripts for records
320*8680Speter      *	NL_FIELDLIST	the chain of fixed fields of a record, in order.
321*8680Speter      *			the fields are also chained through ptr[NL_FIELDLIST].
322*8680Speter      *			this does not include the tag, or fields of variants.
323*8680Speter      *	NL_VARNT	pointer to the variants of a record,
324*8680Speter      *			these are then chained through the .chain field.
325*8680Speter      *	NL_VTOREC	pointer from a VARNT to the RECORD that is the variant.
326*8680Speter      *	NL_TAG		pointer from a RECORD to the tagfield
327*8680Speter      *			if there are any variants.
328*8680Speter      *	align_info	the alignment of a RECORD is in info[3].
329*8680Speter      */
330*8680Speter #define	NL_FIELDLIST	1
331*8680Speter #define	NL_VARNT	2
332*8680Speter #define	NL_VTOREC	2
333*8680Speter #define	NL_TAG		3
334*8680Speter /* and align_info is info[3].  #defined above */
335733Speter 
3367915Smckusick #define	NL_ELABEL 4	/* SCAL - ptr to definition of enums */
337733Speter 
338733Speter /*
339733Speter  * For BADUSE nl structures, NL_KINDS is a bit vector
340733Speter  * indicating the kinds of illegal usages complained about
341733Speter  * so far.  For kind of bad use "kind", "1 << kind" is set.
342733Speter  * The low bit is reserved as ISUNDEF to indicate whether
343733Speter  * this identifier is totally undefined.
344733Speter  */
345733Speter #define	NL_KINDS	0
346733Speter 
347733Speter #define	ISUNDEF		1
3483275Smckusic 
3493823Speter     /*
3503823Speter      *	variables come in three flavors: globals, parameters, locals;
3513823Speter      *	they can also hide in registers, but that's a different flag
3523823Speter      */
3533275Smckusic #define PARAMVAR	1
3543275Smckusic #define LOCALVAR	2
3553823Speter #define	GLOBALVAR	3
356733Speter 
357733Speter /*
358733Speter  * NAMELIST CLASSES
359733Speter  *
360733Speter  * The following are the namelist classes.
361733Speter  * Different classes make use of the value fields
362733Speter  * of the namelist in different ways.
363733Speter  *
364733Speter  * The namelist should be redesigned by providing
365733Speter  * a number of structure definitions with one corresponding
366733Speter  * to each namelist class, ala a variant record in Pascal.
367733Speter  */
368733Speter #define	BADUSE	0
369733Speter #define	CONST	1
370733Speter #define	TYPE	2
371733Speter #define	VAR	3
372733Speter #define	ARRAY	4
373733Speter #define	PTRFILE	5
374733Speter #define	RECORD	6
375733Speter #define	FIELD	7
376733Speter #define	PROC	8
377733Speter #define	FUNC	9
378733Speter #define	FVAR	10
379733Speter #define	REF	11
380733Speter #define	PTR	12
381733Speter #define	FILET	13
382733Speter #define	SET	14
383733Speter #define	RANGE	15
384733Speter #define	LABEL	16
385733Speter #define	WITHPTR 17
386733Speter #define	SCAL	18
387733Speter #define	STR	19
388733Speter #define	PROG	20
389733Speter #define	IMPROPER 21
390733Speter #define	VARNT	22
3911194Speter #define	FPROC	23
3921194Speter #define	FFUNC	24
393733Speter 
394733Speter /*
395733Speter  * Clnames points to an array of names for the
396733Speter  * namelist classes.
397733Speter  */
398733Speter char	**clnames;
399733Speter 
400733Speter /*
401733Speter  * PRE-DEFINED NAMELIST OFFSETS
402733Speter  *
403733Speter  * The following are the namelist offsets for the
404733Speter  * primitive types. The ones which are negative
405733Speter  * don't actually exist, but are generated and tested
406733Speter  * internally. These definitions are sensitive to the
407733Speter  * initializations in nl.c.
408733Speter  */
409733Speter #define	TFIRST -7
410733Speter #define	TFILE  -7
411733Speter #define	TREC   -6
412733Speter #define	TARY   -5
413733Speter #define	TSCAL  -4
414733Speter #define	TPTR   -3
415733Speter #define	TSET   -2
416733Speter #define	TSTR   -1
417733Speter #define	NIL	0
418733Speter #define	TBOOL	1
419733Speter #define	TCHAR	2
420733Speter #define	TINT	3
421733Speter #define	TDOUBLE	4
422733Speter #define	TNIL	5
423733Speter #define	T1INT	6
424733Speter #define	T2INT	7
425733Speter #define	T4INT	8
426733Speter #define	T1CHAR	9
427733Speter #define	T1BOOL	10
428733Speter #define	T8REAL	11
429733Speter #define TLAST	11
430733Speter 
431733Speter /*
432733Speter  * SEMANTIC DEFINITIONS
433733Speter  */
434733Speter 
435733Speter /*
436733Speter  * NOCON and SAWCON are flags in the tree telling whether
437733Speter  * a constant set is part of an expression.
4383314Speter  *	these are no longer used,
4393314Speter  *	since we now do constant sets at compile time.
440733Speter  */
441733Speter #define NOCON	0
442733Speter #define SAWCON	1
443733Speter 
444733Speter /*
445733Speter  * The variable cbn gives the current block number,
446733Speter  * the variable bn is set as a side effect of a call to
447733Speter  * lookup, and is the block number of the variable which
448733Speter  * was found.
449733Speter  */
450733Speter short	bn, cbn;
451733Speter 
452733Speter /*
453733Speter  * The variable line is the current semantic
454733Speter  * line and is set in stat.c from the numbers
455733Speter  * embedded in statement type tree nodes.
456733Speter  */
457733Speter short	line;
458733Speter 
459733Speter /*
460733Speter  * The size of the display
461733Speter  * which defines the maximum nesting
462733Speter  * of procedures and functions allowed.
463733Speter  * Because of the flags in the current namelist
464733Speter  * this must be no greater than 32.
465733Speter  */
466733Speter #define	DSPLYSZ 20
467733Speter 
4683425Speter     /*
4693425Speter      *	the display is made up of saved AP's and FP's.
4703425Speter      *	FP's are used to find locals, and AP's are used to find parameters.
4713425Speter      *	FP and AP are untyped pointers, but are used throughout as (char *).
4723425Speter      *	the display is used by adding AP_OFFSET or FP_OFFSET to the
4733425Speter      *	address of the approriate display entry.
4743425Speter      */
4753425Speter struct dispsave {
4763425Speter     char	*savedAP;
4773425Speter     char	*savedFP;
4783425Speter } display[ DSPLYSZ ];
4793425Speter 
4803425Speter #define	AP_OFFSET	( 0 )
4813425Speter #define FP_OFFSET	( sizeof(char *) )
4823425Speter 
4833425Speter     /*
4843425Speter      *	formal routine structure:
4853425Speter      */
4863425Speter struct formalrtn {
4873425Speter 	long		(*fentryaddr)();	/* formal entry point */
4883425Speter 	long		fbn;			/* block number of function */
4893425Speter 	struct dispsave	fdisp[ DSPLYSZ ];	/* saved at first passing */
4903425Speter } frtn;
4913425Speter 
4923425Speter #define	FENTRYOFFSET	0
4933425Speter #define FBNOFFSET	( FENTRYOFFSET + sizeof frtn.fentryaddr )
4943425Speter #define	FDISPOFFSET	( FBNOFFSET + sizeof frtn.fbn )
4953425Speter 
496733Speter /*
497733Speter  * The following structure is used
498733Speter  * to keep track of the amount of variable
499733Speter  * storage required by each block.
500733Speter  * "Max" is the high water mark, "off"
501733Speter  * the current need. Temporaries for "for"
502733Speter  * loops and "with" statements are allocated
503733Speter  * in the local variable area and these
504733Speter  * numbers are thereby changed if necessary.
505733Speter  */
506733Speter struct om {
507733Speter 	long	om_max;
5083220Smckusic 	long	reg_max;
5093220Smckusic 	struct tmps {
5103220Smckusic 		long	om_off;
5113220Smckusic 		long	reg_off;
5123220Smckusic 	} curtmps;
513733Speter } sizes[DSPLYSZ];
5143220Smckusic #define NOREG 0
5153220Smckusic #define REGOK 1
516733Speter 
517733Speter     /*
518733Speter      *	the following structure records whether a level declares
519733Speter      *	any variables which are (or contain) files.
520733Speter      *	this so that the runtime routines for file cleanup can be invoked.
521733Speter      */
522733Speter bool	dfiles[ DSPLYSZ ];
523733Speter 
524733Speter /*
525733Speter  * Structure recording information about a constant
526733Speter  * declaration.  It is actually the return value from
527733Speter  * the routine "gconst", but since C doesn't support
528733Speter  * record valued functions, this is more convenient.
529733Speter  */
530733Speter struct {
531733Speter 	struct nl	*ctype;
532733Speter 	short		cival;
533733Speter 	double		crval;
534733Speter 	int		*cpval;
535733Speter } con;
536733Speter 
537733Speter /*
538733Speter  * The set structure records the lower bound
539733Speter  * and upper bound with the lower bound normalized
540733Speter  * to zero when working with a set. It is set by
541733Speter  * the routine setran in var.c.
542733Speter  */
543733Speter struct {
544733Speter 	short	lwrb, uprbp;
545733Speter } set;
546733Speter 
547733Speter     /*
548733Speter      *	structures of this kind are filled in by precset and used by postcset
549733Speter      *	to indicate things about constant sets.
550733Speter      */
551733Speter struct csetstr {
552733Speter     struct nl	*csettype;
553733Speter     long	paircnt;
554733Speter     long	singcnt;
555733Speter     bool	comptime;
556733Speter };
557733Speter /*
558733Speter  * The following flags are passed on calls to lvalue
559733Speter  * to indicate how the reference is to affect the usage
560733Speter  * information for the variable being referenced.
561733Speter  * MOD is used to set the NMOD flag in the namelist
562733Speter  * entry for the variable, ASGN permits diagnostics
563733Speter  * to be formed when a for variable is assigned to in
564733Speter  * the range of the loop.
565733Speter  */
566733Speter #define	NOFLAGS	0
567733Speter #define	MOD	01
568733Speter #define	ASGN	02
569733Speter #define	NOUSE	04
570733Speter 
571733Speter     /*
572733Speter      *	the following flags are passed to lvalue and rvalue
573733Speter      *	to tell them whether an lvalue or rvalue is required.
574733Speter      *	the semantics checking is done according to the function called,
575733Speter      *	but for pc, lvalue may put out an rvalue by indirecting afterwards,
576733Speter      *	and rvalue may stop short of putting out the indirection.
577733Speter      */
578733Speter #define	LREQ	01
579733Speter #define	RREQ	02
580733Speter 
581733Speter double	MAXINT;
582733Speter double	MININT;
583733Speter 
584733Speter /*
585733Speter  * Variables for generation of profile information.
586733Speter  * Monflg is set when we want to generate a profile.
587733Speter  * Gocnt record the total number of goto's and
588733Speter  * cnts records the current counter for generating
589733Speter  * COUNT operators.
590733Speter  */
591733Speter short	gocnt;
592733Speter short	cnts;
593733Speter 
594733Speter /*
595733Speter  * Most routines call "incompat" rather than asking "!compat"
596733Speter  * for historical reasons.
597733Speter  */
598733Speter #define incompat 	!compat
599733Speter 
600733Speter /*
601733Speter  * Parts records which declaration parts have been seen.
602833Speter  * The grammar allows the "label" "const" "type" "var" and routine
603733Speter  * parts to be repeated and to be in any order, so that
604733Speter  * they can be detected semantically to give better
605733Speter  * error diagnostics.
606733Speter  */
607833Speter int	parts[ DSPLYSZ ];
608733Speter 
609833Speter #define	LPRT	1
610833Speter #define	CPRT	2
611833Speter #define	TPRT	4
612833Speter #define	VPRT	8
613833Speter #define	RPRT	16
614733Speter 
615733Speter /*
616733Speter  * Flags for the "you used / instead of div" diagnostic
617733Speter  */
618733Speter bool	divchk;
619733Speter bool	divflg;
620733Speter 
6213071Smckusic bool	errcnt[DSPLYSZ];
622733Speter 
623733Speter /*
624733Speter  * Forechain links those types which are
625733Speter  *	^ sometype
626733Speter  * so that they can be evaluated later, permitting
627733Speter  * circular, recursive list structures to be defined.
628733Speter  */
629733Speter struct	nl *forechain;
630733Speter 
631733Speter /*
632733Speter  * Withlist links all the records which are currently
633733Speter  * opened scopes because of with statements.
634733Speter  */
635733Speter struct	nl *withlist;
636733Speter 
637733Speter struct	nl *intset;
638733Speter struct	nl *input, *output;
639733Speter struct	nl *program;
640733Speter 
641733Speter /* progseen flag used by PC to determine if
642733Speter  * a routine segment is being compiled (and
643733Speter  * therefore no program statement seen)
644733Speter  */
645733Speter bool	progseen;
646733Speter 
647733Speter 
648733Speter /*
649733Speter  * STRUCTURED STATEMENT GOTO CHECKING
650733Speter  *
651733Speter  * The variable level keeps track of the current
652733Speter  * "structured statement level" when processing the statement
653733Speter  * body of blocks.  This is used in the detection of goto's into
654733Speter  * structured statements in a block.
655733Speter  *
656733Speter  * Each label's namelist entry contains two pieces of information
657733Speter  * related to this check. The first `NL_GOLEV' either contains
658733Speter  * the level at which the label was declared, `NOTYET' if the label
659733Speter  * has not yet been declared, or `DEAD' if the label is dead, i.e.
660733Speter  * if we have exited the level in which the label was defined.
661733Speter  *
662733Speter  * When we discover a "goto" statement, if the label has not
663733Speter  * been defined yet, then we record the current level and the current line
664733Speter  * for a later error check.  If the label has been already become "DEAD"
665733Speter  * then a reference to it is an error.  Now the compiler maintains,
666733Speter  * for each block, a linked list of the labels headed by "gotos[bn]".
667733Speter  * When we exit a structured level, we perform the routine
668733Speter  * ungoto in stat.c. It notices labels whose definition levels have been
669733Speter  * exited and makes them be dead. For labels which have not yet been
670733Speter  * defined, ungoto will maintain NL_GOLEV as the minimum structured level
671733Speter  * since the first usage of the label. It is not hard to see that the label
672733Speter  * must eventually be declared at this level or an outer level to this
673733Speter  * one or a goto into a structured statement will exist.
674733Speter  */
675733Speter short	level;
676733Speter struct	nl *gotos[DSPLYSZ];
677733Speter 
678733Speter #define	NOTYET	10000
679733Speter #define	DEAD	10000
680733Speter 
681733Speter /*
682733Speter  * Noreach is true when the next statement will
683733Speter  * be unreachable unless something happens along
684733Speter  * (like exiting a looping construct) to save
685733Speter  * the day.
686733Speter  */
687733Speter bool	noreach;
688733Speter 
689733Speter /*
690733Speter  * UNDEFINED VARIABLE REFERENCE STRUCTURES
691733Speter  */
692733Speter struct	udinfo {
693733Speter 	int	ud_line;
694733Speter 	struct	udinfo *ud_next;
695733Speter 	char	nullch;
696733Speter };
697733Speter 
698733Speter /*
699733Speter  * CODE GENERATION DEFINITIONS
700733Speter  */
701733Speter 
702733Speter /*
703733Speter  * NSTAND is or'ed onto the abstract machine opcode
704733Speter  * for non-standard built-in procedures and functions.
705733Speter  */
706733Speter #define	NSTAND	0400
707733Speter 
708733Speter #define	codeon()	cgenflg++
709733Speter #define	codeoff()	--cgenflg
7103314Speter #define	CGENNING	( cgenflg >= 0 )
711733Speter 
712733Speter /*
713733Speter  * Codeline is the last lino output in the code generator.
714733Speter  * It used to be used to suppress LINO operators but no
715733Speter  * more since we now count statements.
716733Speter  * Lc is the intepreter code location counter.
717733Speter  *
718733Speter short	codeline;
719733Speter  */
720733Speter char	*lc;
721733Speter 
722733Speter 
723733Speter /*
724733Speter  * Routines which need types
725733Speter  * other than "integer" to be
726733Speter  * assumed by the compiler.
727733Speter  */
728733Speter double		atof();
729733Speter long		lwidth();
7303071Smckusic long		leven();
731733Speter long		aryconst();
732733Speter long		a8tol();
7333071Smckusic long		roundup();
7343823Speter struct nl 	*tmpalloc();
735733Speter struct nl 	*lookup();
736733Speter double		atof();
737733Speter int		*tree();
738733Speter int		*hash();
739733Speter char		*alloc();
740733Speter int		*calloc();
741733Speter char		*savestr();
7423283Smckusic char		*parnam();
7433283Smckusic bool		fcompat();
744733Speter struct nl	*lookup1();
745733Speter struct nl	*hdefnl();
746733Speter struct nl	*defnl();
747733Speter struct nl	*enter();
748733Speter struct nl	*nlcopy();
749*8680Speter struct nl	*tyrec();
750733Speter struct nl	*tyary();
751733Speter struct nl	*deffld();
752733Speter struct nl	*defvnt();
753733Speter struct nl	*tyrec1();
754733Speter struct nl	*reclook();
755733Speter struct nl	*asgnop1();
756733Speter struct nl	*gtype();
757733Speter struct nl	*call();
758733Speter struct nl	*lvalue();
759733Speter struct nl	*rvalue();
760733Speter struct nl	*cset();
761733Speter 
762733Speter /*
763733Speter  * type cast NIL to keep lint happy (which is not so bad)
764733Speter  */
765733Speter #define		NLNIL	( (struct nl *) NIL )
766733Speter 
767733Speter /*
768733Speter  * Funny structures to use
769733Speter  * pointers in wild and wooly ways
770733Speter  */
771733Speter struct {
772733Speter 	char	pchar;
773733Speter };
774733Speter struct {
775733Speter 	short	pint;
776733Speter 	short	pint2;
777733Speter };
778733Speter struct {
779733Speter 	long	plong;
780733Speter };
781733Speter struct {
782733Speter 	double	pdouble;
783733Speter };
784733Speter 
785733Speter #define	OCT	1
786733Speter #define	HEX	2
787733Speter 
788733Speter /*
789733Speter  * MAIN PROGRAM VARIABLES, MISCELLANY
790733Speter  */
791733Speter 
792733Speter /*
793733Speter  * Variables forming a data base referencing
794733Speter  * the command line arguments with the "i" option, e.g.
795733Speter  * in "pi -i scanner.i compiler.p".
796733Speter  */
797733Speter char	**pflist;
798733Speter short	pflstc;
799733Speter short	pfcnt;
800733Speter 
801733Speter char	*filename;		/* current source file name */
802733Speter long	tvec;
803733Speter extern char	*snark;		/* SNARK */
804733Speter extern char	*classes[ ];	/* maps namelist classes to string names */
805733Speter 
806733Speter #define	derror error
807733Speter 
808733Speter #ifdef	PC
809733Speter 
810733Speter     /*
811733Speter      *	the current function number, for [ lines
812733Speter      */
813733Speter     int	ftnno;
814733Speter 
815733Speter     /*
816733Speter      *	the pc output stream
817733Speter      */
818733Speter     FILE *pcstream;
819733Speter 
820733Speter #endif PC
821