xref: /csrg-svn/usr.bin/pascal/src/0.h (revision 1194)
1733Speter /* Copyright (c) 1979 Regents of the University of California */
2733Speter 
3*1194Speter /* static	char sccsid[] = "@(#)0.h 1.3 10/03/80"; */
4733Speter 
5733Speter #define DEBUG
6733Speter #define	CHAR
7733Speter #define	STATIC
8733Speter #define hp21mx 0
9733Speter 
10733Speter #include	<stdio.h>
11733Speter #include	<sys/types.h>
12733Speter 
13733Speter #define		bool	short
14733Speter #define		TRUE	1
15733Speter #define		FALSE	0
16733Speter 
17733Speter /*
18733Speter  * Option flags
19733Speter  *
20733Speter  * The following options are recognized in the text of the program
21733Speter  * and also on the command line:
22733Speter  *
23733Speter  *	b	block buffer the file output
24733Speter  *
25733Speter  *	i	make a listing of the procedures and functions in
26733Speter  *		the following include files
27733Speter  *
28733Speter  *	l	make a listing of the program
29733Speter  *
30733Speter  *	n	place each include file on a new page with a header
31733Speter  *
32733Speter  *	p	disable post mortem and statement limit counting
33733Speter  *
34733Speter  *	t	disable run-time tests
35733Speter  *
36733Speter  *	u	card image mode; only first 72 chars of input count
37733Speter  *
38733Speter  *	w	suppress special diagnostic warnings
39733Speter  *
40733Speter  *	z	generate counters for an execution profile
41733Speter  */
42733Speter #ifdef DEBUG
43733Speter bool	fulltrace, errtrace, testtrace, yyunique;
44733Speter #endif DEBUG
45733Speter 
46733Speter /*
47733Speter  * Each option has a stack of 17 option values, with opts giving
48733Speter  * the current, top value, and optstk the value beneath it.
49733Speter  * One refers to option `l' as, e.g., opt('l') in the text for clarity.
50733Speter  */
51733Speter char	opts[ 'z' - 'A' + 1];
52733Speter short	optstk[ 'z' - 'A' + 1];
53733Speter 
54733Speter #define opt(c) opts[c-'A']
55733Speter 
56733Speter /*
57733Speter  * Monflg is set when we are generating
58733Speter  * a pxp profile.  this is set by the -z command line option.
59733Speter  */
60733Speter bool	monflg;
61733Speter 
62733Speter     /*
63733Speter      *	profflag is set when we are generating a prof profile.
64733Speter      *	this is set by the -p command line option.
65733Speter      */
66733Speter bool	profflag;
67733Speter 
68733Speter 
69733Speter /*
70733Speter  * NOTES ON THE DYNAMIC NATURE OF THE DATA STRUCTURES
71733Speter  *
72733Speter  * Pi uses expandable tables for
73733Speter  * its namelist (symbol table), string table
74733Speter  * hash table, and parse tree space.  The following
75733Speter  * definitions specify the size of the increments
76733Speter  * for these items in fundamental units so that
77733Speter  * each uses approximately 1024 bytes.
78733Speter  */
79733Speter 
80733Speter #define	STRINC	1024		/* string space increment */
81733Speter #define	TRINC	512		/* tree space increment */
82733Speter #define	HASHINC	509		/* hash table size in words, each increment */
83733Speter #define	NLINC	56		/* namelist increment size in nl structs */
84733Speter 
85733Speter /*
86733Speter  * The initial sizes of the structures.
87733Speter  * These should be large enough to compile
88733Speter  * an "average" sized program so as to minimize
89733Speter  * storage requests.
90733Speter  * On a small system or and 11/34 or 11/40
91733Speter  * these numbers can be trimmed to make the
92733Speter  * compiler smaller.
93733Speter  */
94733Speter #define	ITREE	2000
95733Speter #define	INL	200
96733Speter #define	IHASH	509
97733Speter 
98733Speter /*
99733Speter  * The following limits on hash and tree tables currently
100733Speter  * allow approximately 1200 symbols and 20k words of tree
101733Speter  * space.  The fundamental limit of 64k total data space
102733Speter  * should be exceeded well before these are full.
103733Speter  */
104733Speter /*
105733Speter  * TABLE_MULTIPLIER is for uniformly increasing the sizes of the tables
106733Speter  */
107733Speter #define TABLE_MULTIPLIER	8
108733Speter #define	MAXHASH	(4 * TABLE_MULTIPLIER)
109733Speter #define	MAXNL	(12 * TABLE_MULTIPLIER)
110733Speter #define	MAXTREE	(30 * TABLE_MULTIPLIER)
111733Speter /*
112733Speter  * MAXDEPTH is the depth of the parse stack.
113733Speter  * STACK_MULTIPLIER is for increasing its size.
114733Speter  */
115733Speter #define	STACK_MULTIPLIER	8
116733Speter #define	MAXDEPTH ( 150 * STACK_MULTIPLIER )
117733Speter 
118733Speter /*
119733Speter  * ERROR RELATED DEFINITIONS
120733Speter  */
121733Speter 
122733Speter /*
123733Speter  * Exit statuses to pexit
124733Speter  *
125733Speter  * AOK
126733Speter  * ERRS		Compilation errors inhibit obj productin
127733Speter  * NOSTART	Errors before we ever got started
128733Speter  * DIED		We ran out of memory or some such
129733Speter  */
130733Speter #define	AOK	0
131733Speter #define	ERRS	1
132733Speter #define	NOSTART	2
133733Speter #define	DIED	3
134733Speter 
135733Speter bool	Recovery;
136733Speter 
137733Speter #define	eholdnl()	Eholdnl = 1
138733Speter #define	nocascade()	Enocascade = 1
139733Speter 
140733Speter bool	Eholdnl, Enocascade;
141733Speter 
142733Speter 
143733Speter /*
144733Speter  * The flag eflg is set whenever we have a hard error.
145733Speter  * The character in errpfx will precede the next error message.
146733Speter  * When cgenflg is set code generation is suppressed.
147733Speter  * This happens whenver we have an error (i.e. if eflg is set)
148733Speter  * and when we are walking the tree to determine types only.
149733Speter  */
150733Speter bool	eflg;
151733Speter char	errpfx;
152733Speter 
153733Speter #define	setpfx(x)	errpfx = x
154733Speter 
155733Speter #define	standard()	setpfx('s')
156733Speter #define	warning()	setpfx('w')
157733Speter #define	recovered()	setpfx('e')
158733Speter 
159733Speter bool	cgenflg;
160733Speter 
161733Speter 
162733Speter /*
163733Speter  * The flag syneflg is used to suppress the diagnostics of the form
164733Speter  *	E 10 a, defined in someprocedure, is neither used nor set
165733Speter  * when there were syntax errors in "someprocedure".
166733Speter  * In this case, it is likely that these warinings would be spurious.
167733Speter  */
168733Speter bool	syneflg;
169733Speter 
170733Speter /*
171733Speter  * The compiler keeps its error messages in a file.
172733Speter  * The variable efil is the unit number on which
173733Speter  * this file is open for reading of error message text.
174733Speter  * Similarly, the file ofil is the unit of the file
175733Speter  * "obj" where we write the interpreter code.
176733Speter  */
177733Speter short	efil;
178733Speter short	ofil;
179733Speter short	obuf[518];
180733Speter 
181733Speter #define	elineoff()	Enoline++
182733Speter #define	elineon()	Enoline = 0
183733Speter 
184733Speter bool	Enoline;
185733Speter 
186733Speter /*
187733Speter  * SYMBOL TABLE STRUCTURE DEFINITIONS
188733Speter  *
189733Speter  * The symbol table is henceforth referred to as the "namelist".
190733Speter  * It consists of a number of structures of the form "nl" below.
191733Speter  * These are contained in a number of segments of the symbol
192733Speter  * table which are dynamically allocated as needed.
193733Speter  * The major namelist manipulation routines are contained in the
194733Speter  * file "nl.c".
195733Speter  *
196733Speter  * The major components of a namelist entry are the "symbol", giving
197733Speter  * a pointer into the string table for the string associated with this
198733Speter  * entry and the "class" which tells which of the (currently 19)
199733Speter  * possible types of structure this is.
200733Speter  *
201733Speter  * Many of the classes use the "type" field for a pointer to the type
202733Speter  * which the entry has.
203733Speter  *
204733Speter  * Other pieces of information in more than one class include the block
205733Speter  * in which the symbol is defined, flags indicating whether the symbol
206733Speter  * has been used and whether it has been assigned to, etc.
207733Speter  *
208733Speter  * A more complete discussion of the features of the namelist is impossible
209733Speter  * here as it would be too voluminous.  Refer to the "PI 1.0 Implementation
210733Speter  * Notes" for more details.
211733Speter  */
212733Speter 
213733Speter /*
214733Speter  * The basic namelist structure.
215733Speter  * There are also two other variants, defining the real
216733Speter  * field as longs or integers given below.
217733Speter  *
218733Speter  * The array disptab defines the hash header for the symbol table.
219733Speter  * Symbols are hashed based on the low 6 bits of their pointer into
220733Speter  * the string table; see the routines in the file "lookup.c" and also "fdec.c"
221733Speter  * especially "funcend".
222733Speter  */
223733Speter #ifdef PTREE
224733Speter #   include	"pTree.h"
225733Speter #endif PTREE
226733Speter struct	nl {
227733Speter 	char	*symbol;
228733Speter 	char	class, nl_flags;
229733Speter #ifdef PC
230733Speter 	char	ext_flags;	/* an extra flag is used for externals */
231733Speter #endif PC
232733Speter 	struct	nl *type;
233733Speter 	struct	nl *chain, *nl_next;
234733Speter 	int	*ptr[4];
235733Speter #ifdef PI
236733Speter 	int	entloc;
237733Speter #endif PI
238733Speter #	ifdef PTREE
239733Speter 	    pPointer	inTree;
240733Speter #	endif PTREE
241733Speter } *nlp, *disptab[077+1];
242733Speter 
243733Speter extern struct nl nl[INL];
244733Speter 
245733Speter struct {
246733Speter 	char	*symbol;
247733Speter 	char	class, nl_flags;
248733Speter #ifdef PC
249733Speter 	char	ext_flags;
250733Speter #endif
251733Speter 	struct	nl *type;
252733Speter 	struct	nl *chain, *nl_next;
253733Speter 	double	real;
254733Speter };
255733Speter 
256733Speter struct {
257733Speter 	char	*symbol;
258733Speter 	char	class, nl_block;
259733Speter #ifdef PC
260733Speter 	char	ext_flags;
261733Speter #endif
262733Speter 	struct	nl *type;
263733Speter 	struct	nl *chain, *nl_next;
264733Speter 	long	range[2];
265733Speter };
266733Speter 
267733Speter struct {
268733Speter 	char	*symbol;
269733Speter 	char	class, nl_flags;
270733Speter #ifdef PC
271733Speter 	char	ext_flags;
272733Speter #endif
273733Speter 	struct	nl *type;
274733Speter 	struct	nl *chain, *nl_next;
275733Speter 	long	value[4];
276733Speter };
277733Speter 
278733Speter /*
279733Speter  * NL FLAGS BITS
280733Speter  *
281733Speter  * Definitions of the usage of the bits in
282733Speter  * the nl_flags byte. Note that the low 5 bits of the
283733Speter  * byte are the "nl_block" and that some classes make use
284733Speter  * of this byte as a "width".
285733Speter  *
286733Speter  * The only non-obvious bit definition here is "NFILES"
287733Speter  * which records whether a structure contains any files.
288733Speter  * Such structures are not allowed to be dynamically allocated.
289733Speter  */
290733Speter #define	NUSED	0100
291733Speter #define	NMOD	0040
292733Speter #define	NFORWD	0200
293733Speter #define	NFILES	0200
294733Speter 
295733Speter #ifdef PC
296733Speter #define NEXTERN 0001	/* flag used to mark external funcs and procs */
297733Speter #endif
298733Speter 
299733Speter /*
300733Speter  * Definition of the commonly used "value" fields.
301733Speter  * The most important one is NL_OFFS which gives
302733Speter  * the offset of a variable in its stack mark.
303733Speter  */
304733Speter #define NL_OFFS	0
305733Speter 
306733Speter #define	NL_CNTR	1
307733Speter #define	NL_FVAR	3
308733Speter 
309733Speter #define NL_GOLEV 2
310733Speter #define NL_GOLINE 3
311733Speter #define NL_FORV 1
312733Speter 
313733Speter #define	NL_FLDSZ 1
314733Speter #define	NL_VARNT 2
315733Speter #define	NL_VTOREC 2
316733Speter #define	NL_TAG	3
317733Speter 
318733Speter #define	NL_ELABEL	3
319733Speter 
320733Speter /*
321733Speter  * For BADUSE nl structures, NL_KINDS is a bit vector
322733Speter  * indicating the kinds of illegal usages complained about
323733Speter  * so far.  For kind of bad use "kind", "1 << kind" is set.
324733Speter  * The low bit is reserved as ISUNDEF to indicate whether
325733Speter  * this identifier is totally undefined.
326733Speter  */
327733Speter #define	NL_KINDS	0
328733Speter 
329733Speter #define	ISUNDEF		1
330733Speter 
331733Speter /*
332733Speter  * NAMELIST CLASSES
333733Speter  *
334733Speter  * The following are the namelist classes.
335733Speter  * Different classes make use of the value fields
336733Speter  * of the namelist in different ways.
337733Speter  *
338733Speter  * The namelist should be redesigned by providing
339733Speter  * a number of structure definitions with one corresponding
340733Speter  * to each namelist class, ala a variant record in Pascal.
341733Speter  */
342733Speter #define	BADUSE	0
343733Speter #define	CONST	1
344733Speter #define	TYPE	2
345733Speter #define	VAR	3
346733Speter #define	ARRAY	4
347733Speter #define	PTRFILE	5
348733Speter #define	RECORD	6
349733Speter #define	FIELD	7
350733Speter #define	PROC	8
351733Speter #define	FUNC	9
352733Speter #define	FVAR	10
353733Speter #define	REF	11
354733Speter #define	PTR	12
355733Speter #define	FILET	13
356733Speter #define	SET	14
357733Speter #define	RANGE	15
358733Speter #define	LABEL	16
359733Speter #define	WITHPTR 17
360733Speter #define	SCAL	18
361733Speter #define	STR	19
362733Speter #define	PROG	20
363733Speter #define	IMPROPER 21
364733Speter #define	VARNT	22
365*1194Speter #define	FPROC	23
366*1194Speter #define	FFUNC	24
367733Speter 
368733Speter /*
369733Speter  * Clnames points to an array of names for the
370733Speter  * namelist classes.
371733Speter  */
372733Speter char	**clnames;
373733Speter 
374733Speter /*
375733Speter  * PRE-DEFINED NAMELIST OFFSETS
376733Speter  *
377733Speter  * The following are the namelist offsets for the
378733Speter  * primitive types. The ones which are negative
379733Speter  * don't actually exist, but are generated and tested
380733Speter  * internally. These definitions are sensitive to the
381733Speter  * initializations in nl.c.
382733Speter  */
383733Speter #define	TFIRST -7
384733Speter #define	TFILE  -7
385733Speter #define	TREC   -6
386733Speter #define	TARY   -5
387733Speter #define	TSCAL  -4
388733Speter #define	TPTR   -3
389733Speter #define	TSET   -2
390733Speter #define	TSTR   -1
391733Speter #define	NIL	0
392733Speter #define	TBOOL	1
393733Speter #define	TCHAR	2
394733Speter #define	TINT	3
395733Speter #define	TDOUBLE	4
396733Speter #define	TNIL	5
397733Speter #define	T1INT	6
398733Speter #define	T2INT	7
399733Speter #define	T4INT	8
400733Speter #define	T1CHAR	9
401733Speter #define	T1BOOL	10
402733Speter #define	T8REAL	11
403733Speter #define TLAST	11
404733Speter 
405733Speter /*
406733Speter  * SEMANTIC DEFINITIONS
407733Speter  */
408733Speter 
409733Speter /*
410733Speter  * NOCON and SAWCON are flags in the tree telling whether
411733Speter  * a constant set is part of an expression.
412733Speter  */
413733Speter #define NOCON	0
414733Speter #define SAWCON	1
415733Speter 
416733Speter /*
417733Speter  * The variable cbn gives the current block number,
418733Speter  * the variable bn is set as a side effect of a call to
419733Speter  * lookup, and is the block number of the variable which
420733Speter  * was found.
421733Speter  */
422733Speter short	bn, cbn;
423733Speter 
424733Speter /*
425733Speter  * The variable line is the current semantic
426733Speter  * line and is set in stat.c from the numbers
427733Speter  * embedded in statement type tree nodes.
428733Speter  */
429733Speter short	line;
430733Speter 
431733Speter /*
432733Speter  * The size of the display
433733Speter  * which defines the maximum nesting
434733Speter  * of procedures and functions allowed.
435733Speter  * Because of the flags in the current namelist
436733Speter  * this must be no greater than 32.
437733Speter  */
438733Speter #define	DSPLYSZ 20
439733Speter 
440733Speter /*
441733Speter  * The following structure is used
442733Speter  * to keep track of the amount of variable
443733Speter  * storage required by each block.
444733Speter  * "Max" is the high water mark, "off"
445733Speter  * the current need. Temporaries for "for"
446733Speter  * loops and "with" statements are allocated
447733Speter  * in the local variable area and these
448733Speter  * numbers are thereby changed if necessary.
449733Speter  */
450733Speter struct om {
451733Speter 	long	om_off;
452733Speter 	long	om_max;
453733Speter } sizes[DSPLYSZ];
454733Speter 
455733Speter     /*
456733Speter      *	the following structure records whether a level declares
457733Speter      *	any variables which are (or contain) files.
458733Speter      *	this so that the runtime routines for file cleanup can be invoked.
459733Speter      */
460733Speter bool	dfiles[ DSPLYSZ ];
461733Speter 
462733Speter /*
463733Speter  * Structure recording information about a constant
464733Speter  * declaration.  It is actually the return value from
465733Speter  * the routine "gconst", but since C doesn't support
466733Speter  * record valued functions, this is more convenient.
467733Speter  */
468733Speter struct {
469733Speter 	struct nl	*ctype;
470733Speter 	short		cival;
471733Speter 	double		crval;
472733Speter 	int		*cpval;
473733Speter } con;
474733Speter 
475733Speter /*
476733Speter  * The set structure records the lower bound
477733Speter  * and upper bound with the lower bound normalized
478733Speter  * to zero when working with a set. It is set by
479733Speter  * the routine setran in var.c.
480733Speter  */
481733Speter struct {
482733Speter 	short	lwrb, uprbp;
483733Speter } set;
484733Speter 
485733Speter     /*
486733Speter      *	structures of this kind are filled in by precset and used by postcset
487733Speter      *	to indicate things about constant sets.
488733Speter      */
489733Speter struct csetstr {
490733Speter     struct nl	*csettype;
491733Speter     long	paircnt;
492733Speter     long	singcnt;
493733Speter     bool	comptime;
494733Speter };
495733Speter /*
496733Speter  * The following flags are passed on calls to lvalue
497733Speter  * to indicate how the reference is to affect the usage
498733Speter  * information for the variable being referenced.
499733Speter  * MOD is used to set the NMOD flag in the namelist
500733Speter  * entry for the variable, ASGN permits diagnostics
501733Speter  * to be formed when a for variable is assigned to in
502733Speter  * the range of the loop.
503733Speter  */
504733Speter #define	NOFLAGS	0
505733Speter #define	MOD	01
506733Speter #define	ASGN	02
507733Speter #define	NOUSE	04
508733Speter 
509733Speter     /*
510733Speter      *	the following flags are passed to lvalue and rvalue
511733Speter      *	to tell them whether an lvalue or rvalue is required.
512733Speter      *	the semantics checking is done according to the function called,
513733Speter      *	but for pc, lvalue may put out an rvalue by indirecting afterwards,
514733Speter      *	and rvalue may stop short of putting out the indirection.
515733Speter      */
516733Speter #define	LREQ	01
517733Speter #define	RREQ	02
518733Speter 
519733Speter double	MAXINT;
520733Speter double	MININT;
521733Speter 
522733Speter /*
523733Speter  * Variables for generation of profile information.
524733Speter  * Monflg is set when we want to generate a profile.
525733Speter  * Gocnt record the total number of goto's and
526733Speter  * cnts records the current counter for generating
527733Speter  * COUNT operators.
528733Speter  */
529733Speter short	gocnt;
530733Speter short	cnts;
531733Speter 
532733Speter /*
533733Speter  * Most routines call "incompat" rather than asking "!compat"
534733Speter  * for historical reasons.
535733Speter  */
536733Speter #define incompat 	!compat
537733Speter 
538733Speter /*
539733Speter  * Parts records which declaration parts have been seen.
540833Speter  * The grammar allows the "label" "const" "type" "var" and routine
541733Speter  * parts to be repeated and to be in any order, so that
542733Speter  * they can be detected semantically to give better
543733Speter  * error diagnostics.
544733Speter  */
545833Speter int	parts[ DSPLYSZ ];
546733Speter 
547833Speter #define	LPRT	1
548833Speter #define	CPRT	2
549833Speter #define	TPRT	4
550833Speter #define	VPRT	8
551833Speter #define	RPRT	16
552733Speter 
553733Speter /*
554733Speter  * Flags for the "you used / instead of div" diagnostic
555733Speter  */
556733Speter bool	divchk;
557733Speter bool	divflg;
558733Speter 
559733Speter short	errcnt[DSPLYSZ];
560733Speter 
561733Speter /*
562733Speter  * Forechain links those types which are
563733Speter  *	^ sometype
564733Speter  * so that they can be evaluated later, permitting
565733Speter  * circular, recursive list structures to be defined.
566733Speter  */
567733Speter struct	nl *forechain;
568733Speter 
569733Speter /*
570733Speter  * Withlist links all the records which are currently
571733Speter  * opened scopes because of with statements.
572733Speter  */
573733Speter struct	nl *withlist;
574733Speter 
575733Speter struct	nl *intset;
576733Speter struct	nl *input, *output;
577733Speter struct	nl *program;
578733Speter 
579733Speter /* progseen flag used by PC to determine if
580733Speter  * a routine segment is being compiled (and
581733Speter  * therefore no program statement seen)
582733Speter  */
583733Speter bool	progseen;
584733Speter 
585733Speter 
586733Speter /*
587733Speter  * STRUCTURED STATEMENT GOTO CHECKING
588733Speter  *
589733Speter  * The variable level keeps track of the current
590733Speter  * "structured statement level" when processing the statement
591733Speter  * body of blocks.  This is used in the detection of goto's into
592733Speter  * structured statements in a block.
593733Speter  *
594733Speter  * Each label's namelist entry contains two pieces of information
595733Speter  * related to this check. The first `NL_GOLEV' either contains
596733Speter  * the level at which the label was declared, `NOTYET' if the label
597733Speter  * has not yet been declared, or `DEAD' if the label is dead, i.e.
598733Speter  * if we have exited the level in which the label was defined.
599733Speter  *
600733Speter  * When we discover a "goto" statement, if the label has not
601733Speter  * been defined yet, then we record the current level and the current line
602733Speter  * for a later error check.  If the label has been already become "DEAD"
603733Speter  * then a reference to it is an error.  Now the compiler maintains,
604733Speter  * for each block, a linked list of the labels headed by "gotos[bn]".
605733Speter  * When we exit a structured level, we perform the routine
606733Speter  * ungoto in stat.c. It notices labels whose definition levels have been
607733Speter  * exited and makes them be dead. For labels which have not yet been
608733Speter  * defined, ungoto will maintain NL_GOLEV as the minimum structured level
609733Speter  * since the first usage of the label. It is not hard to see that the label
610733Speter  * must eventually be declared at this level or an outer level to this
611733Speter  * one or a goto into a structured statement will exist.
612733Speter  */
613733Speter short	level;
614733Speter struct	nl *gotos[DSPLYSZ];
615733Speter 
616733Speter #define	NOTYET	10000
617733Speter #define	DEAD	10000
618733Speter 
619733Speter /*
620733Speter  * Noreach is true when the next statement will
621733Speter  * be unreachable unless something happens along
622733Speter  * (like exiting a looping construct) to save
623733Speter  * the day.
624733Speter  */
625733Speter bool	noreach;
626733Speter 
627733Speter /*
628733Speter  * UNDEFINED VARIABLE REFERENCE STRUCTURES
629733Speter  */
630733Speter struct	udinfo {
631733Speter 	int	ud_line;
632733Speter 	struct	udinfo *ud_next;
633733Speter 	char	nullch;
634733Speter };
635733Speter 
636733Speter /*
637733Speter  * CODE GENERATION DEFINITIONS
638733Speter  */
639733Speter 
640733Speter /*
641733Speter  * NSTAND is or'ed onto the abstract machine opcode
642733Speter  * for non-standard built-in procedures and functions.
643733Speter  */
644733Speter #define	NSTAND	0400
645733Speter 
646733Speter #define	codeon()	cgenflg++
647733Speter #define	codeoff()	--cgenflg
648733Speter 
649733Speter /*
650733Speter  * Codeline is the last lino output in the code generator.
651733Speter  * It used to be used to suppress LINO operators but no
652733Speter  * more since we now count statements.
653733Speter  * Lc is the intepreter code location counter.
654733Speter  *
655733Speter short	codeline;
656733Speter  */
657733Speter char	*lc;
658733Speter 
659733Speter 
660733Speter /*
661733Speter  * Routines which need types
662733Speter  * other than "integer" to be
663733Speter  * assumed by the compiler.
664733Speter  */
665733Speter double		atof();
666733Speter long		lwidth();
667733Speter long		aryconst();
668733Speter long		a8tol();
669733Speter struct nl 	*lookup();
670733Speter double		atof();
671733Speter int		*tree();
672733Speter int		*hash();
673733Speter char		*alloc();
674733Speter int		*calloc();
675733Speter char		*savestr();
676733Speter struct nl	*lookup1();
677733Speter struct nl	*hdefnl();
678733Speter struct nl	*defnl();
679733Speter struct nl	*enter();
680733Speter struct nl	*nlcopy();
681733Speter struct nl	*tyrecl();
682733Speter struct nl	*tyary();
683733Speter struct nl	*fields();
684733Speter struct nl	*variants();
685733Speter struct nl	*deffld();
686733Speter struct nl	*defvnt();
687733Speter struct nl	*tyrec1();
688733Speter struct nl	*reclook();
689733Speter struct nl	*asgnop1();
690733Speter struct nl	*gtype();
691733Speter struct nl	*call();
692733Speter struct nl	*lvalue();
693733Speter struct nl	*rvalue();
694733Speter struct nl	*cset();
695733Speter 
696733Speter /*
697733Speter  * type cast NIL to keep lint happy (which is not so bad)
698733Speter  */
699733Speter #define		NLNIL	( (struct nl *) NIL )
700733Speter 
701733Speter /*
702733Speter  * Funny structures to use
703733Speter  * pointers in wild and wooly ways
704733Speter  */
705733Speter struct {
706733Speter 	char	pchar;
707733Speter };
708733Speter struct {
709733Speter 	short	pint;
710733Speter 	short	pint2;
711733Speter };
712733Speter struct {
713733Speter 	long	plong;
714733Speter };
715733Speter struct {
716733Speter 	double	pdouble;
717733Speter };
718733Speter 
719733Speter #define	OCT	1
720733Speter #define	HEX	2
721733Speter 
722733Speter /*
723733Speter  * MAIN PROGRAM VARIABLES, MISCELLANY
724733Speter  */
725733Speter 
726733Speter /*
727733Speter  * Variables forming a data base referencing
728733Speter  * the command line arguments with the "i" option, e.g.
729733Speter  * in "pi -i scanner.i compiler.p".
730733Speter  */
731733Speter char	**pflist;
732733Speter short	pflstc;
733733Speter short	pfcnt;
734733Speter 
735733Speter char	*filename;		/* current source file name */
736733Speter long	tvec;
737733Speter extern char	*snark;		/* SNARK */
738733Speter extern char	*classes[ ];	/* maps namelist classes to string names */
739733Speter 
740733Speter #define	derror error
741733Speter 
742733Speter #ifdef	PC
743733Speter 
744733Speter     /*
745733Speter      *	the current function number, for [ lines
746733Speter      */
747733Speter     int	ftnno;
748733Speter 
749733Speter     /*
750733Speter      *	the pc output stream
751733Speter      */
752733Speter     FILE *pcstream;
753733Speter 
754733Speter #endif PC
755