xref: /csrg-svn/usr.bin/pascal/src/0.h (revision 3071)
1733Speter /* Copyright (c) 1979 Regents of the University of California */
2733Speter 
3*3071Smckusic /* static char sccsid[] = "@(#)0.h 1.4 03/08/81"; */
4733Speter 
5733Speter #define DEBUG
6*3071Smckusic #define CONSETS
7733Speter #define	CHAR
8733Speter #define	STATIC
9733Speter #define hp21mx 0
10733Speter 
11733Speter #include	<stdio.h>
12733Speter #include	<sys/types.h>
13733Speter 
14*3071Smckusic 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  */
106*3071Smckusic #ifdef VAX
107733Speter #define TABLE_MULTIPLIER	8
108*3071Smckusic #else
109*3071Smckusic #define TABLE_MULTIPLIER	1
110*3071Smckusic #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  */
118*3071Smckusic #ifdef VAX
119733Speter #define	STACK_MULTIPLIER	8
120*3071Smckusic #else
121*3071Smckusic #define	STACK_MULTIPLIER	1
122*3071Smckusic #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')
165733Speter 
166*3071Smckusic int	cgenflg;
167733Speter 
168733Speter 
169733Speter /*
170733Speter  * The flag syneflg is used to suppress the diagnostics of the form
171733Speter  *	E 10 a, defined in someprocedure, is neither used nor set
172733Speter  * when there were syntax errors in "someprocedure".
173733Speter  * In this case, it is likely that these warinings would be spurious.
174733Speter  */
175733Speter bool	syneflg;
176733Speter 
177733Speter /*
178733Speter  * The compiler keeps its error messages in a file.
179733Speter  * The variable efil is the unit number on which
180733Speter  * this file is open for reading of error message text.
181733Speter  * Similarly, the file ofil is the unit of the file
182733Speter  * "obj" where we write the interpreter code.
183733Speter  */
184733Speter short	efil;
185733Speter short	ofil;
186733Speter short	obuf[518];
187733Speter 
188*3071Smckusic bool	Enoline;
189*3071Smckusic #define	elineoff()	Enoline = TRUE
190*3071Smckusic #define	elineon()	Enoline = FALSE
191733Speter 
192733Speter 
193733Speter /*
194733Speter  * SYMBOL TABLE STRUCTURE DEFINITIONS
195733Speter  *
196733Speter  * The symbol table is henceforth referred to as the "namelist".
197733Speter  * It consists of a number of structures of the form "nl" below.
198733Speter  * These are contained in a number of segments of the symbol
199733Speter  * table which are dynamically allocated as needed.
200733Speter  * The major namelist manipulation routines are contained in the
201733Speter  * file "nl.c".
202733Speter  *
203733Speter  * The major components of a namelist entry are the "symbol", giving
204733Speter  * a pointer into the string table for the string associated with this
205733Speter  * entry and the "class" which tells which of the (currently 19)
206733Speter  * possible types of structure this is.
207733Speter  *
208733Speter  * Many of the classes use the "type" field for a pointer to the type
209733Speter  * which the entry has.
210733Speter  *
211733Speter  * Other pieces of information in more than one class include the block
212733Speter  * in which the symbol is defined, flags indicating whether the symbol
213733Speter  * has been used and whether it has been assigned to, etc.
214733Speter  *
215733Speter  * A more complete discussion of the features of the namelist is impossible
216733Speter  * here as it would be too voluminous.  Refer to the "PI 1.0 Implementation
217733Speter  * Notes" for more details.
218733Speter  */
219733Speter 
220733Speter /*
221733Speter  * The basic namelist structure.
222733Speter  * There are also two other variants, defining the real
223733Speter  * field as longs or integers given below.
224733Speter  *
225733Speter  * The array disptab defines the hash header for the symbol table.
226733Speter  * Symbols are hashed based on the low 6 bits of their pointer into
227733Speter  * the string table; see the routines in the file "lookup.c" and also "fdec.c"
228733Speter  * especially "funcend".
229733Speter  */
230733Speter #ifdef PTREE
231733Speter #   include	"pTree.h"
232733Speter #endif PTREE
233733Speter struct	nl {
234733Speter 	char	*symbol;
235733Speter 	char	class, nl_flags;
236733Speter #ifdef PC
237733Speter 	char	ext_flags;	/* an extra flag is used for externals */
238733Speter #endif PC
239733Speter 	struct	nl *type;
240733Speter 	struct	nl *chain, *nl_next;
241733Speter 	int	*ptr[4];
242733Speter #ifdef PI
243733Speter 	int	entloc;
244733Speter #endif PI
245733Speter #	ifdef PTREE
246733Speter 	    pPointer	inTree;
247733Speter #	endif PTREE
248733Speter } *nlp, *disptab[077+1];
249733Speter 
250733Speter extern struct nl nl[INL];
251733Speter 
252733Speter struct {
253733Speter 	char	*symbol;
254733Speter 	char	class, nl_flags;
255733Speter #ifdef PC
256733Speter 	char	ext_flags;
257733Speter #endif
258733Speter 	struct	nl *type;
259733Speter 	struct	nl *chain, *nl_next;
260733Speter 	double	real;
261733Speter };
262733Speter 
263733Speter struct {
264733Speter 	char	*symbol;
265733Speter 	char	class, nl_block;
266733Speter #ifdef PC
267733Speter 	char	ext_flags;
268733Speter #endif
269733Speter 	struct	nl *type;
270733Speter 	struct	nl *chain, *nl_next;
271733Speter 	long	range[2];
272733Speter };
273733Speter 
274733Speter struct {
275733Speter 	char	*symbol;
276733Speter 	char	class, nl_flags;
277733Speter #ifdef PC
278733Speter 	char	ext_flags;
279733Speter #endif
280733Speter 	struct	nl *type;
281733Speter 	struct	nl *chain, *nl_next;
282*3071Smckusic 	int	value[5];
283733Speter };
284733Speter 
285733Speter /*
286733Speter  * NL FLAGS BITS
287733Speter  *
288733Speter  * Definitions of the usage of the bits in
289733Speter  * the nl_flags byte. Note that the low 5 bits of the
290733Speter  * byte are the "nl_block" and that some classes make use
291733Speter  * of this byte as a "width".
292733Speter  *
293733Speter  * The only non-obvious bit definition here is "NFILES"
294733Speter  * which records whether a structure contains any files.
295733Speter  * Such structures are not allowed to be dynamically allocated.
296733Speter  */
297733Speter #define	NUSED	0100
298733Speter #define	NMOD	0040
299733Speter #define	NFORWD	0200
300733Speter #define	NFILES	0200
301733Speter 
302733Speter #ifdef PC
303733Speter #define NEXTERN 0001	/* flag used to mark external funcs and procs */
304733Speter #endif
305733Speter 
306733Speter /*
307733Speter  * Definition of the commonly used "value" fields.
308733Speter  * The most important one is NL_OFFS which gives
309733Speter  * the offset of a variable in its stack mark.
310733Speter  */
311733Speter #define NL_OFFS	0
312733Speter 
313733Speter #define	NL_CNTR	1
314733Speter #define	NL_FVAR	3
315733Speter 
316733Speter #define NL_GOLEV 2
317733Speter #define NL_GOLINE 3
318733Speter #define NL_FORV 1
319733Speter 
320733Speter #define	NL_FLDSZ 1
321733Speter #define	NL_VARNT 2
322733Speter #define	NL_VTOREC 2
323733Speter #define	NL_TAG	3
324733Speter 
325*3071Smckusic #define	NL_ELABEL	4
326733Speter 
327733Speter /*
328733Speter  * For BADUSE nl structures, NL_KINDS is a bit vector
329733Speter  * indicating the kinds of illegal usages complained about
330733Speter  * so far.  For kind of bad use "kind", "1 << kind" is set.
331733Speter  * The low bit is reserved as ISUNDEF to indicate whether
332733Speter  * this identifier is totally undefined.
333733Speter  */
334733Speter #define	NL_KINDS	0
335733Speter 
336733Speter #define	ISUNDEF		1
337733Speter 
338733Speter /*
339733Speter  * NAMELIST CLASSES
340733Speter  *
341733Speter  * The following are the namelist classes.
342733Speter  * Different classes make use of the value fields
343733Speter  * of the namelist in different ways.
344733Speter  *
345733Speter  * The namelist should be redesigned by providing
346733Speter  * a number of structure definitions with one corresponding
347733Speter  * to each namelist class, ala a variant record in Pascal.
348733Speter  */
349733Speter #define	BADUSE	0
350733Speter #define	CONST	1
351733Speter #define	TYPE	2
352733Speter #define	VAR	3
353733Speter #define	ARRAY	4
354733Speter #define	PTRFILE	5
355733Speter #define	RECORD	6
356733Speter #define	FIELD	7
357733Speter #define	PROC	8
358733Speter #define	FUNC	9
359733Speter #define	FVAR	10
360733Speter #define	REF	11
361733Speter #define	PTR	12
362733Speter #define	FILET	13
363733Speter #define	SET	14
364733Speter #define	RANGE	15
365733Speter #define	LABEL	16
366733Speter #define	WITHPTR 17
367733Speter #define	SCAL	18
368733Speter #define	STR	19
369733Speter #define	PROG	20
370733Speter #define	IMPROPER 21
371733Speter #define	VARNT	22
3721194Speter #define	FPROC	23
3731194Speter #define	FFUNC	24
374733Speter 
375733Speter /*
376733Speter  * Clnames points to an array of names for the
377733Speter  * namelist classes.
378733Speter  */
379733Speter char	**clnames;
380733Speter 
381733Speter /*
382733Speter  * PRE-DEFINED NAMELIST OFFSETS
383733Speter  *
384733Speter  * The following are the namelist offsets for the
385733Speter  * primitive types. The ones which are negative
386733Speter  * don't actually exist, but are generated and tested
387733Speter  * internally. These definitions are sensitive to the
388733Speter  * initializations in nl.c.
389733Speter  */
390733Speter #define	TFIRST -7
391733Speter #define	TFILE  -7
392733Speter #define	TREC   -6
393733Speter #define	TARY   -5
394733Speter #define	TSCAL  -4
395733Speter #define	TPTR   -3
396733Speter #define	TSET   -2
397733Speter #define	TSTR   -1
398733Speter #define	NIL	0
399733Speter #define	TBOOL	1
400733Speter #define	TCHAR	2
401733Speter #define	TINT	3
402733Speter #define	TDOUBLE	4
403733Speter #define	TNIL	5
404733Speter #define	T1INT	6
405733Speter #define	T2INT	7
406733Speter #define	T4INT	8
407733Speter #define	T1CHAR	9
408733Speter #define	T1BOOL	10
409733Speter #define	T8REAL	11
410733Speter #define TLAST	11
411733Speter 
412733Speter /*
413733Speter  * SEMANTIC DEFINITIONS
414733Speter  */
415733Speter 
416733Speter /*
417733Speter  * NOCON and SAWCON are flags in the tree telling whether
418733Speter  * a constant set is part of an expression.
419733Speter  */
420733Speter #define NOCON	0
421733Speter #define SAWCON	1
422733Speter 
423733Speter /*
424733Speter  * The variable cbn gives the current block number,
425733Speter  * the variable bn is set as a side effect of a call to
426733Speter  * lookup, and is the block number of the variable which
427733Speter  * was found.
428733Speter  */
429733Speter short	bn, cbn;
430733Speter 
431733Speter /*
432733Speter  * The variable line is the current semantic
433733Speter  * line and is set in stat.c from the numbers
434733Speter  * embedded in statement type tree nodes.
435733Speter  */
436733Speter short	line;
437733Speter 
438733Speter /*
439733Speter  * The size of the display
440733Speter  * which defines the maximum nesting
441733Speter  * of procedures and functions allowed.
442733Speter  * Because of the flags in the current namelist
443733Speter  * this must be no greater than 32.
444733Speter  */
445733Speter #define	DSPLYSZ 20
446733Speter 
447733Speter /*
448733Speter  * The following structure is used
449733Speter  * to keep track of the amount of variable
450733Speter  * storage required by each block.
451733Speter  * "Max" is the high water mark, "off"
452733Speter  * the current need. Temporaries for "for"
453733Speter  * loops and "with" statements are allocated
454733Speter  * in the local variable area and these
455733Speter  * numbers are thereby changed if necessary.
456733Speter  */
457733Speter struct om {
458733Speter 	long	om_off;
459733Speter 	long	om_max;
460733Speter } sizes[DSPLYSZ];
461733Speter 
462733Speter     /*
463733Speter      *	the following structure records whether a level declares
464733Speter      *	any variables which are (or contain) files.
465733Speter      *	this so that the runtime routines for file cleanup can be invoked.
466733Speter      */
467733Speter bool	dfiles[ DSPLYSZ ];
468733Speter 
469733Speter /*
470733Speter  * Structure recording information about a constant
471733Speter  * declaration.  It is actually the return value from
472733Speter  * the routine "gconst", but since C doesn't support
473733Speter  * record valued functions, this is more convenient.
474733Speter  */
475733Speter struct {
476733Speter 	struct nl	*ctype;
477733Speter 	short		cival;
478733Speter 	double		crval;
479733Speter 	int		*cpval;
480733Speter } con;
481733Speter 
482733Speter /*
483733Speter  * The set structure records the lower bound
484733Speter  * and upper bound with the lower bound normalized
485733Speter  * to zero when working with a set. It is set by
486733Speter  * the routine setran in var.c.
487733Speter  */
488733Speter struct {
489733Speter 	short	lwrb, uprbp;
490733Speter } set;
491733Speter 
492733Speter     /*
493733Speter      *	structures of this kind are filled in by precset and used by postcset
494733Speter      *	to indicate things about constant sets.
495733Speter      */
496733Speter struct csetstr {
497733Speter     struct nl	*csettype;
498733Speter     long	paircnt;
499733Speter     long	singcnt;
500733Speter     bool	comptime;
501733Speter };
502733Speter /*
503733Speter  * The following flags are passed on calls to lvalue
504733Speter  * to indicate how the reference is to affect the usage
505733Speter  * information for the variable being referenced.
506733Speter  * MOD is used to set the NMOD flag in the namelist
507733Speter  * entry for the variable, ASGN permits diagnostics
508733Speter  * to be formed when a for variable is assigned to in
509733Speter  * the range of the loop.
510733Speter  */
511733Speter #define	NOFLAGS	0
512733Speter #define	MOD	01
513733Speter #define	ASGN	02
514733Speter #define	NOUSE	04
515733Speter 
516733Speter     /*
517733Speter      *	the following flags are passed to lvalue and rvalue
518733Speter      *	to tell them whether an lvalue or rvalue is required.
519733Speter      *	the semantics checking is done according to the function called,
520733Speter      *	but for pc, lvalue may put out an rvalue by indirecting afterwards,
521733Speter      *	and rvalue may stop short of putting out the indirection.
522733Speter      */
523733Speter #define	LREQ	01
524733Speter #define	RREQ	02
525733Speter 
526733Speter double	MAXINT;
527733Speter double	MININT;
528733Speter 
529733Speter /*
530733Speter  * Variables for generation of profile information.
531733Speter  * Monflg is set when we want to generate a profile.
532733Speter  * Gocnt record the total number of goto's and
533733Speter  * cnts records the current counter for generating
534733Speter  * COUNT operators.
535733Speter  */
536733Speter short	gocnt;
537733Speter short	cnts;
538733Speter 
539733Speter /*
540733Speter  * Most routines call "incompat" rather than asking "!compat"
541733Speter  * for historical reasons.
542733Speter  */
543733Speter #define incompat 	!compat
544733Speter 
545733Speter /*
546733Speter  * Parts records which declaration parts have been seen.
547833Speter  * The grammar allows the "label" "const" "type" "var" and routine
548733Speter  * parts to be repeated and to be in any order, so that
549733Speter  * they can be detected semantically to give better
550733Speter  * error diagnostics.
551733Speter  */
552833Speter int	parts[ DSPLYSZ ];
553733Speter 
554833Speter #define	LPRT	1
555833Speter #define	CPRT	2
556833Speter #define	TPRT	4
557833Speter #define	VPRT	8
558833Speter #define	RPRT	16
559733Speter 
560733Speter /*
561733Speter  * Flags for the "you used / instead of div" diagnostic
562733Speter  */
563733Speter bool	divchk;
564733Speter bool	divflg;
565733Speter 
566*3071Smckusic bool	errcnt[DSPLYSZ];
567733Speter 
568733Speter /*
569733Speter  * Forechain links those types which are
570733Speter  *	^ sometype
571733Speter  * so that they can be evaluated later, permitting
572733Speter  * circular, recursive list structures to be defined.
573733Speter  */
574733Speter struct	nl *forechain;
575733Speter 
576733Speter /*
577733Speter  * Withlist links all the records which are currently
578733Speter  * opened scopes because of with statements.
579733Speter  */
580733Speter struct	nl *withlist;
581733Speter 
582733Speter struct	nl *intset;
583733Speter struct	nl *input, *output;
584733Speter struct	nl *program;
585733Speter 
586733Speter /* progseen flag used by PC to determine if
587733Speter  * a routine segment is being compiled (and
588733Speter  * therefore no program statement seen)
589733Speter  */
590733Speter bool	progseen;
591733Speter 
592733Speter 
593733Speter /*
594733Speter  * STRUCTURED STATEMENT GOTO CHECKING
595733Speter  *
596733Speter  * The variable level keeps track of the current
597733Speter  * "structured statement level" when processing the statement
598733Speter  * body of blocks.  This is used in the detection of goto's into
599733Speter  * structured statements in a block.
600733Speter  *
601733Speter  * Each label's namelist entry contains two pieces of information
602733Speter  * related to this check. The first `NL_GOLEV' either contains
603733Speter  * the level at which the label was declared, `NOTYET' if the label
604733Speter  * has not yet been declared, or `DEAD' if the label is dead, i.e.
605733Speter  * if we have exited the level in which the label was defined.
606733Speter  *
607733Speter  * When we discover a "goto" statement, if the label has not
608733Speter  * been defined yet, then we record the current level and the current line
609733Speter  * for a later error check.  If the label has been already become "DEAD"
610733Speter  * then a reference to it is an error.  Now the compiler maintains,
611733Speter  * for each block, a linked list of the labels headed by "gotos[bn]".
612733Speter  * When we exit a structured level, we perform the routine
613733Speter  * ungoto in stat.c. It notices labels whose definition levels have been
614733Speter  * exited and makes them be dead. For labels which have not yet been
615733Speter  * defined, ungoto will maintain NL_GOLEV as the minimum structured level
616733Speter  * since the first usage of the label. It is not hard to see that the label
617733Speter  * must eventually be declared at this level or an outer level to this
618733Speter  * one or a goto into a structured statement will exist.
619733Speter  */
620733Speter short	level;
621733Speter struct	nl *gotos[DSPLYSZ];
622733Speter 
623733Speter #define	NOTYET	10000
624733Speter #define	DEAD	10000
625733Speter 
626733Speter /*
627733Speter  * Noreach is true when the next statement will
628733Speter  * be unreachable unless something happens along
629733Speter  * (like exiting a looping construct) to save
630733Speter  * the day.
631733Speter  */
632733Speter bool	noreach;
633733Speter 
634733Speter /*
635733Speter  * UNDEFINED VARIABLE REFERENCE STRUCTURES
636733Speter  */
637733Speter struct	udinfo {
638733Speter 	int	ud_line;
639733Speter 	struct	udinfo *ud_next;
640733Speter 	char	nullch;
641733Speter };
642733Speter 
643733Speter /*
644733Speter  * CODE GENERATION DEFINITIONS
645733Speter  */
646733Speter 
647733Speter /*
648733Speter  * NSTAND is or'ed onto the abstract machine opcode
649733Speter  * for non-standard built-in procedures and functions.
650733Speter  */
651733Speter #define	NSTAND	0400
652733Speter 
653733Speter #define	codeon()	cgenflg++
654733Speter #define	codeoff()	--cgenflg
655733Speter 
656733Speter /*
657733Speter  * Codeline is the last lino output in the code generator.
658733Speter  * It used to be used to suppress LINO operators but no
659733Speter  * more since we now count statements.
660733Speter  * Lc is the intepreter code location counter.
661733Speter  *
662733Speter short	codeline;
663733Speter  */
664733Speter char	*lc;
665733Speter 
666733Speter 
667733Speter /*
668733Speter  * Routines which need types
669733Speter  * other than "integer" to be
670733Speter  * assumed by the compiler.
671733Speter  */
672733Speter double		atof();
673733Speter long		lwidth();
674*3071Smckusic long		leven();
675733Speter long		aryconst();
676733Speter long		a8tol();
677*3071Smckusic long		roundup();
678733Speter struct nl 	*lookup();
679733Speter double		atof();
680733Speter int		*tree();
681733Speter int		*hash();
682733Speter char		*alloc();
683733Speter int		*calloc();
684733Speter char		*savestr();
685733Speter struct nl	*lookup1();
686733Speter struct nl	*hdefnl();
687733Speter struct nl	*defnl();
688733Speter struct nl	*enter();
689733Speter struct nl	*nlcopy();
690733Speter struct nl	*tyrecl();
691733Speter struct nl	*tyary();
692733Speter struct nl	*fields();
693733Speter struct nl	*variants();
694733Speter struct nl	*deffld();
695733Speter struct nl	*defvnt();
696733Speter struct nl	*tyrec1();
697733Speter struct nl	*reclook();
698733Speter struct nl	*asgnop1();
699733Speter struct nl	*gtype();
700733Speter struct nl	*call();
701733Speter struct nl	*lvalue();
702733Speter struct nl	*rvalue();
703733Speter struct nl	*cset();
704733Speter 
705733Speter /*
706733Speter  * type cast NIL to keep lint happy (which is not so bad)
707733Speter  */
708733Speter #define		NLNIL	( (struct nl *) NIL )
709733Speter 
710733Speter /*
711733Speter  * Funny structures to use
712733Speter  * pointers in wild and wooly ways
713733Speter  */
714733Speter struct {
715733Speter 	char	pchar;
716733Speter };
717733Speter struct {
718733Speter 	short	pint;
719733Speter 	short	pint2;
720733Speter };
721733Speter struct {
722733Speter 	long	plong;
723733Speter };
724733Speter struct {
725733Speter 	double	pdouble;
726733Speter };
727733Speter 
728733Speter #define	OCT	1
729733Speter #define	HEX	2
730733Speter 
731733Speter /*
732733Speter  * MAIN PROGRAM VARIABLES, MISCELLANY
733733Speter  */
734733Speter 
735733Speter /*
736733Speter  * Variables forming a data base referencing
737733Speter  * the command line arguments with the "i" option, e.g.
738733Speter  * in "pi -i scanner.i compiler.p".
739733Speter  */
740733Speter char	**pflist;
741733Speter short	pflstc;
742733Speter short	pfcnt;
743733Speter 
744733Speter char	*filename;		/* current source file name */
745733Speter long	tvec;
746733Speter extern char	*snark;		/* SNARK */
747733Speter extern char	*classes[ ];	/* maps namelist classes to string names */
748733Speter 
749733Speter #define	derror error
750733Speter 
751733Speter #ifdef	PC
752733Speter 
753733Speter     /*
754733Speter      *	the current function number, for [ lines
755733Speter      */
756733Speter     int	ftnno;
757733Speter 
758733Speter     /*
759733Speter      *	the pc output stream
760733Speter      */
761733Speter     FILE *pcstream;
762733Speter 
763733Speter #endif PC
764