xref: /csrg-svn/usr.bin/pascal/src/nl.c (revision 62213)
148116Sbostic /*-
2*62213Sbostic  * Copyright (c) 1980, 1993
3*62213Sbostic  *	The Regents of the University of California.  All rights reserved.
448116Sbostic  *
548116Sbostic  * %sccs.include.redist.c%
622178Sdist  */
7760Speter 
814736Sthien #ifndef lint
9*62213Sbostic static char sccsid[] = "@(#)nl.c	8.1 (Berkeley) 06/06/93";
1048116Sbostic #endif /* not lint */
11760Speter 
12760Speter #include "whoami.h"
13760Speter #include "0.h"
1412854Speter #ifdef PI
15760Speter #include "opcode.h"
16760Speter #include "objfmt.h"
17760Speter 
18760Speter /*
19760Speter  * NAMELIST SEGMENT DEFINITIONS
20760Speter  */
21760Speter struct nls {
22760Speter 	struct nl *nls_low;
23760Speter 	struct nl *nls_high;
24760Speter } ntab[MAXNL], *nlact;
25760Speter 
26760Speter struct	nl nl[INL];
27760Speter struct	nl *nlp = nl;
28760Speter struct	nls *nlact = ntab;
29760Speter 
30760Speter     /*
31760Speter      *	all these strings must be places where people can find them
32760Speter      *	since lookup only looks at the string pointer, not the chars.
33760Speter      *	see, for example, pTreeInit.
34760Speter      */
35760Speter 
36760Speter     /*
37760Speter      *	built in constants
38760Speter      */
39760Speter char	*in_consts[] = {
40760Speter 	    "true" ,
41760Speter 	    "false" ,
42760Speter 	    "TRUE",
43760Speter 	    "FALSE",
44760Speter 	    "minint" ,
45760Speter 	    "maxint" ,
46760Speter 	    "minchar" ,
47760Speter 	    "maxchar" ,
48760Speter 	    "bell" ,
49760Speter 	    "tab" ,
50760Speter 	    0
51760Speter 	};
52760Speter 
53760Speter     /*
54760Speter      *	built in simple types
55760Speter      */
56760Speter char *in_types[] =
57760Speter     {
58760Speter 	"boolean",
59760Speter 	"char",
60760Speter 	"integer",
61760Speter 	"real",
62760Speter 	"_nil",		/* dummy name */
63760Speter 	0
64760Speter     };
65760Speter 
66760Speter int in_rclasses[] =
67760Speter     {
68760Speter 	TINT ,
69760Speter 	TINT ,
70760Speter 	TINT ,
71760Speter 	TCHAR ,
72760Speter 	TBOOL ,
73760Speter 	TDOUBLE ,
74760Speter 	0
75760Speter     };
76760Speter 
77760Speter long in_ranges[] =
78760Speter     {
7910648Speter 	-128L	 , 127L ,
80760Speter 	-32768L	 , 32767L ,
81760Speter 	-2147483648L , 2147483647L ,
82760Speter 	0L		 , 127L ,
83760Speter 	0L		 , 1L ,
84760Speter 	0L		 , 0L 		/* fake for reals */
85760Speter     };
86760Speter 
87760Speter     /*
88760Speter      *	built in constructed types
89760Speter      */
90760Speter char	*in_ctypes[] = {
91760Speter 	    "Boolean" ,
92760Speter 	    "intset" ,
93760Speter 	    "alfa" ,
94760Speter 	    "text" ,
95760Speter 	    0
96760Speter 	};
97760Speter 
98760Speter     /*
99760Speter      *	built in variables
100760Speter      */
101760Speter char	*in_vars[] = {
102760Speter 	    "input" ,
103760Speter 	    "output" ,
104760Speter 	    0
105760Speter 	};
106760Speter 
107760Speter     /*
108760Speter      *	built in functions
109760Speter      */
110760Speter char *in_funcs[] =
111760Speter     {
112760Speter 	"abs" ,
113760Speter 	"arctan" ,
114760Speter 	"card" ,
115760Speter 	"chr" ,
116760Speter 	"clock" ,
117760Speter 	"cos" ,
118760Speter 	"eof" ,
119760Speter 	"eoln" ,
120760Speter 	"eos" ,
121760Speter 	"exp" ,
122760Speter 	"expo" ,
123760Speter 	"ln" ,
124760Speter 	"odd" ,
125760Speter 	"ord" ,
126760Speter 	"pred" ,
127760Speter 	"round" ,
128760Speter 	"sin" ,
129760Speter 	"sqr" ,
130760Speter 	"sqrt" ,
131760Speter 	"succ" ,
132760Speter 	"trunc" ,
133760Speter 	"undefined" ,
134760Speter 	/*
135760Speter 	 * Extensions
136760Speter 	 */
137760Speter 	"argc" ,
138760Speter 	"random" ,
139760Speter 	"seed" ,
140760Speter 	"wallclock" ,
141760Speter 	"sysclock" ,
142760Speter 	0
143760Speter     };
144760Speter 
145760Speter 	/*
146760Speter 	 * Built-in procedures
147760Speter 	 */
148760Speter char *in_procs[] =
149760Speter     {
1507927Smckusick 	"assert",
151760Speter 	"date" ,
152760Speter 	"dispose" ,
153760Speter 	"flush" ,
154760Speter 	"get" ,
155760Speter 	"getseg" ,
156760Speter 	"halt" ,
157760Speter 	"linelimit" ,
158760Speter 	"message" ,
159760Speter 	"new" ,
160760Speter 	"pack" ,
161760Speter 	"page" ,
162760Speter 	"put" ,
163760Speter 	"putseg" ,
164760Speter 	"read" ,
165760Speter 	"readln" ,
166760Speter 	"remove" ,
167760Speter 	"reset" ,
168760Speter 	"rewrite" ,
169760Speter 	"time" ,
170760Speter 	"unpack" ,
171760Speter 	"write" ,
172760Speter 	"writeln" ,
173760Speter 	/*
174760Speter 	 * Extensions
175760Speter 	 */
176760Speter 	"argv" ,
177760Speter 	"null" ,
178760Speter 	"stlimit" ,
179760Speter 	0
180760Speter     };
181760Speter 
182760Speter #ifndef PI0
183760Speter     /*
184760Speter      *	and their opcodes
185760Speter      */
186760Speter int in_fops[] =
187760Speter     {
188760Speter 	O_ABS2,
189760Speter 	O_ATAN,
190760Speter 	O_CARD|NSTAND,
191760Speter 	O_CHR2,
192760Speter 	O_CLCK|NSTAND,
193760Speter 	O_COS,
194760Speter 	O_EOF,
195760Speter 	O_EOLN,
196760Speter 	0,
197760Speter 	O_EXP,
198760Speter 	O_EXPO|NSTAND,
199760Speter 	O_LN,
200760Speter 	O_ODD2,
201760Speter 	O_ORD2,
202760Speter 	O_PRED2,
203760Speter 	O_ROUND,
204760Speter 	O_SIN,
205760Speter 	O_SQR2,
206760Speter 	O_SQRT,
207760Speter 	O_SUCC2,
208760Speter 	O_TRUNC,
209760Speter 	O_UNDEF|NSTAND,
210760Speter 	/*
211760Speter 	 * Extensions
212760Speter 	 */
213760Speter 	O_ARGC|NSTAND,
214760Speter 	O_RANDOM|NSTAND,
215760Speter 	O_SEED|NSTAND,
216760Speter 	O_WCLCK|NSTAND,
217760Speter 	O_SCLCK|NSTAND
218760Speter     };
219760Speter 
220760Speter     /*
221760Speter      * Built-in procedures
222760Speter      */
223760Speter int in_pops[] =
224760Speter     {
2257927Smckusick 	O_ASRT|NSTAND,
226760Speter 	O_DATE|NSTAND,
2277914Smckusick 	O_DISPOSE,
228760Speter 	O_FLUSH|NSTAND,
229760Speter 	O_GET,
230760Speter 	0,
231760Speter 	O_HALT|NSTAND,
232760Speter 	O_LLIMIT|NSTAND,
233760Speter 	O_MESSAGE|NSTAND,
234760Speter 	O_NEW,
235760Speter 	O_PACK,
236760Speter 	O_PAGE,
237760Speter 	O_PUT,
238760Speter 	0,
239760Speter 	O_READ4,
240760Speter 	O_READLN,
241760Speter 	O_REMOVE|NSTAND,
242760Speter 	O_RESET,
243760Speter 	O_REWRITE,
244760Speter 	O_TIME|NSTAND,
245760Speter 	O_UNPACK,
246760Speter 	O_WRITEF,
247760Speter 	O_WRITLN,
248760Speter 	/*
249760Speter 	 * Extensions
250760Speter 	 */
251760Speter 	O_ARGV|NSTAND,
252760Speter 	O_ABORT|NSTAND,
253760Speter 	O_STLIM|NSTAND
254760Speter     };
255760Speter #endif
256760Speter 
257760Speter /*
258760Speter  * Initnl initializes the first namelist segment and then
259760Speter  * initializes the name list for block 0.
260760Speter  */
initnl()261760Speter initnl()
262760Speter     {
263760Speter 	register char		**cp;
264760Speter 	register struct nl	*np;
265760Speter 	struct nl		*fp;
266760Speter 	int			*ip;
267760Speter 	long			*lp;
268760Speter 
269760Speter #ifdef	DEBUG
270760Speter 	if ( hp21mx )
271760Speter 	    {
272760Speter 		MININT = -32768.;
273760Speter 		MAXINT = 32767.;
274760Speter #ifndef	PI0
2756356Speter #ifdef OBJ
276760Speter 		genmx();
2776356Speter #endif OBJ
278760Speter #endif
279760Speter 	    }
280760Speter #endif
281760Speter 	ntab[0].nls_low = nl;
282760Speter 	ntab[0].nls_high = &nl[INL];
28314736Sthien 	(void) defnl ( (char *) 0 , 0 , NLNIL , 0 );
284760Speter 
285760Speter 	/*
286760Speter 	 *	Types
287760Speter 	 */
288760Speter 	for ( cp = in_types ; *cp != 0 ; cp ++ )
28914736Sthien 	    (void) hdefnl ( *cp , TYPE , nlp , 0 );
290760Speter 
291760Speter 	/*
292760Speter 	 *	Ranges
293760Speter 	 */
294760Speter 	lp = in_ranges;
295760Speter 	for ( ip = in_rclasses ; *ip != 0 ; ip ++ )
296760Speter 	    {
29714736Sthien 		np = defnl ( (char *) 0 , RANGE , nl+(*ip) , 0 );
298760Speter 		nl[*ip].type = np;
299760Speter 		np -> range[0] = *lp ++ ;
300760Speter 		np -> range[1] = *lp ++ ;
301760Speter 
302760Speter 	    };
303760Speter 
304760Speter 	/*
305760Speter 	 *	built in constructed types
306760Speter 	 */
307760Speter 
308760Speter 	cp = in_ctypes;
309760Speter 	/*
310760Speter 	 *	Boolean = boolean;
311760Speter 	 */
31214736Sthien 	(void) hdefnl ( *cp++ , TYPE , (struct nl *) (nl+T1BOOL) , 0 );
313760Speter 
314760Speter 	/*
315760Speter 	 *	intset = set of 0 .. 127;
316760Speter 	 */
31714736Sthien 	intset = ((struct nl *) *cp++);
31814736Sthien 	(void) hdefnl( (char *) intset , TYPE , nlp+1 , 0 );
31914736Sthien 	(void) defnl ( (char *) 0 , SET , nlp+1 , 0 );
32014736Sthien 	np = defnl ( (char *) 0 , RANGE , nl+TINT , 0 );
321760Speter 	np -> range[0] = 0L;
322760Speter 	np -> range[1] = 127L;
323760Speter 
324760Speter 	/*
325760Speter 	 *	alfa = array [ 1 .. 10 ] of char;
326760Speter 	 */
32714736Sthien 	np = defnl ( (char *) 0 , RANGE , nl+TINT , 0 );
328760Speter 	np -> range[0] = 1L;
329760Speter 	np -> range[1] = 10L;
33014736Sthien 	defnl ( (char *) 0 , ARRAY , nl+T1CHAR , 1 ) -> chain = np;
33114736Sthien 	(void) hdefnl ( *cp++ , TYPE , nlp-1 , 0 );
332760Speter 
333760Speter 	/*
334760Speter 	 *	text = file of char;
335760Speter 	 */
33614736Sthien 	(void) hdefnl ( *cp++ , TYPE , nlp+1 , 0 );
33714736Sthien 	np = defnl ( (char *) 0 , FILET , nl+T1CHAR , 0 );
338760Speter 	np -> nl_flags |= NFILES;
339760Speter 
340760Speter 	/*
341760Speter 	 *	input,output : text;
342760Speter 	 */
343760Speter 	cp = in_vars;
344760Speter #	ifndef	PI0
345760Speter 		input = hdefnl ( *cp++ , VAR , np , INPUT_OFF );
346760Speter 		output = hdefnl (  *cp++ , VAR , np , OUTPUT_OFF );
347760Speter #	else
348760Speter 		input = hdefnl ( *cp++ , VAR , np , 0 );
349760Speter 		output = hdefnl ( *cp++ , VAR , np , 0 );
350760Speter #	endif
3513828Speter #	ifdef PC
3523828Speter 	    input -> extra_flags |= NGLOBAL;
3533828Speter 	    output -> extra_flags |= NGLOBAL;
3543828Speter #	endif PC
355760Speter 
356760Speter 	/*
357760Speter 	 *	built in constants
358760Speter 	 */
359760Speter 	cp = in_consts;
360760Speter 	np = hdefnl ( *cp++ , CONST , nl + TBOOL , 1 );
361760Speter 	fp = hdefnl ( *cp++ , CONST , nl + TBOOL , 0 );
362760Speter 	(nl + TBOOL)->chain = fp;
363760Speter 	fp->chain = np;
364760Speter 	np = hdefnl ( *cp++ , CONST , nl + TBOOL , 1 );
365760Speter 	fp = hdefnl ( *cp++ , CONST , nl + TBOOL , 0 );
366760Speter 	fp->chain = np;
367760Speter 	if (opt('s'))
368760Speter 		(nl + TBOOL)->chain = fp;
369760Speter 	hdefnl ( *cp++ , CONST , nl + T4INT , 0 ) -> range[0] = MININT;
370760Speter 	hdefnl ( *cp++ , CONST , nl + T4INT , 0 ) -> range[0] = MAXINT;
37114736Sthien 	(void) hdefnl ( *cp++ , CONST , nl + T1CHAR , 0 );
37214736Sthien 	(void) hdefnl ( *cp++ , CONST , nl + T1CHAR , 127 );
37314736Sthien 	(void) hdefnl ( *cp++ , CONST , nl + T1CHAR , '\007' );
37414736Sthien 	(void) hdefnl ( *cp++ , CONST , nl + T1CHAR , '\t' );
375760Speter 
376760Speter 	/*
377760Speter 	 * Built-in functions and procedures
378760Speter 	 */
379760Speter #ifndef PI0
380760Speter 	ip = in_fops;
381760Speter 	for ( cp = in_funcs ; *cp != 0 ; cp ++ )
38214736Sthien 	    (void) hdefnl ( *cp , FUNC , NLNIL , * ip ++ );
383760Speter 	ip = in_pops;
384760Speter 	for ( cp = in_procs ; *cp != 0 ; cp ++ )
38514736Sthien 	    (void) hdefnl ( *cp , PROC , NLNIL , * ip ++ );
386760Speter #else
387760Speter 	for ( cp = in_funcs ; *cp != 0 ; cp ++ )
38814736Sthien 	    (void) hdefnl ( *cp , FUNC , NLNIL , 0 );
389760Speter 	for ( cp = in_procs ; *cp != 0 , cp ++ )
39014736Sthien 	    (void) hdefnl ( *cp , PROC , NLNIL , 0 );
391760Speter #endif
392760Speter #	ifdef PTREE
393760Speter 	    pTreeInit();
394760Speter #	endif
395760Speter     }
396760Speter 
397760Speter struct nl *
hdefnl(sym,cls,typ,val)398760Speter hdefnl(sym, cls, typ, val)
39914736Sthien     char *sym;
40014736Sthien     int  cls;
40114736Sthien     struct nl *typ;
40214736Sthien     int val;
403760Speter {
404760Speter 	register struct nl *p;
405760Speter 
406760Speter #ifndef PI1
407760Speter 	if (sym)
40814736Sthien 		(void) hash(sym, 0);
409760Speter #endif
410760Speter 	p = defnl(sym, cls, typ, val);
411760Speter 	if (sym)
41214736Sthien 		(void) enter(p);
413760Speter 	return (p);
414760Speter }
415760Speter 
416760Speter /*
417760Speter  * Free up the name list segments
418760Speter  * at the end of a statement/proc/func
419760Speter  * All segments are freed down to the one in which
420760Speter  * p points.
421760Speter  */
422760Speter nlfree(p)
423760Speter 	struct nl *p;
424760Speter {
425760Speter 
426760Speter 	nlp = p;
427760Speter 	while (nlact->nls_low > nlp || nlact->nls_high < nlp) {
42814736Sthien 		free((char *) nlact->nls_low);
429760Speter 		nlact->nls_low = NIL;
430760Speter 		nlact->nls_high = NIL;
431760Speter 		--nlact;
432760Speter 		if (nlact < &ntab[0])
433760Speter 			panic("nlfree");
434760Speter 	}
435760Speter }
43612851Speter #endif PI
437760Speter 
438760Speter 
43914736Sthien #ifndef PC
44014736Sthien #ifndef OBJ
441760Speter char	*VARIABLE	= "variable";
44214736Sthien #endif PC
44314736Sthien #endif OBJ
444760Speter 
445760Speter char	*classes[ ] = {
446760Speter 	"undefined",
447760Speter 	"constant",
448760Speter 	"type",
449760Speter 	"variable",	/*	VARIABLE	*/
450760Speter 	"array",
451760Speter 	"pointer or file",
452760Speter 	"record",
453760Speter 	"field",
454760Speter 	"procedure",
455760Speter 	"function",
456760Speter 	"variable",	/*	VARIABLE	*/
457760Speter 	"variable",	/*	VARIABLE	*/
458760Speter 	"pointer",
459760Speter 	"file",
460760Speter 	"set",
461760Speter 	"subrange",
462760Speter 	"label",
463760Speter 	"withptr",
464760Speter 	"scalar",
465760Speter 	"string",
466760Speter 	"program",
4671197Speter 	"improper",
4681197Speter 	"variant",
4691197Speter 	"formal procedure",
4701197Speter 	"formal function"
471760Speter };
472760Speter 
47314736Sthien #ifndef PC
47414736Sthien #ifndef OBJ
475760Speter char	*snark	= "SNARK";
47614736Sthien #endif
47714736Sthien #endif
478760Speter 
479760Speter #ifdef PI
480760Speter #ifdef DEBUG
481760Speter char	*ctext[] =
482760Speter {
483760Speter 	"BADUSE",
484760Speter 	"CONST",
485760Speter 	"TYPE",
486760Speter 	"VAR",
487760Speter 	"ARRAY",
488760Speter 	"PTRFILE",
489760Speter 	"RECORD",
490760Speter 	"FIELD",
491760Speter 	"PROC",
492760Speter 	"FUNC",
493760Speter 	"FVAR",
494760Speter 	"REF",
495760Speter 	"PTR",
496760Speter 	"FILET",
497760Speter 	"SET",
498760Speter 	"RANGE",
499760Speter 	"LABEL",
500760Speter 	"WITHPTR",
501760Speter 	"SCAL",
502760Speter 	"STR",
503760Speter 	"PROG",
504760Speter 	"IMPROPER",
5051197Speter 	"VARNT",
5061197Speter 	"FPROC",
50715973Smckusick 	"FFUNC",
50815973Smckusick 	"CRANGE"
509760Speter };
510760Speter 
511760Speter char	*stars	= "\t***";
512760Speter 
513760Speter /*
514760Speter  * Dump the namelist from the
515760Speter  * current nlp down to 'to'.
516760Speter  * All the namelist is dumped if
517760Speter  * to is NIL.
518760Speter  */
51914736Sthien /*VARARGS*/
520760Speter dumpnl(to, rout)
521760Speter 	struct nl *to;
522760Speter {
523760Speter 	register struct nl *p;
524760Speter 	struct nls *nlsp;
52514736Sthien 	int v, head;
526760Speter 
527760Speter 	if (opt('y') == 0)
528760Speter 		return;
529760Speter 	if (to != NIL)
530760Speter 		printf("\n\"%s\" Block=%d\n", rout, cbn);
531760Speter 	nlsp = nlact;
532760Speter 	head = NIL;
533760Speter 	for (p = nlp; p != to;) {
534760Speter 		if (p == nlsp->nls_low) {
535760Speter 			if (nlsp == &ntab[0])
536760Speter 				break;
537760Speter 			nlsp--;
538760Speter 			p = nlsp->nls_high;
539760Speter 		}
540760Speter 		p--;
541760Speter 		if (head == NIL) {
542760Speter 			printf("\tName\tClass  Bn+Flags\tType\tVal\tChn\n");
543760Speter 			head++;
544760Speter 		}
545760Speter 		printf("%3d:", nloff(p));
546760Speter 		if (p->symbol)
547760Speter 			printf("\t%.7s", p->symbol);
548760Speter 		else
549760Speter 			printf(stars);
550760Speter 		if (p->class)
551760Speter 			printf("\t%s", ctext[p->class]);
552760Speter 		else
553760Speter 			printf(stars);
554760Speter 		if (p->nl_flags) {
555760Speter 			pchr('\t');
556760Speter 			if (p->nl_flags & 037)
557760Speter 				printf("%d ", p->nl_flags & 037);
558760Speter #ifndef PI0
559760Speter 			if (p->nl_flags & NMOD)
560760Speter 				pchr('M');
561760Speter 			if (p->nl_flags & NUSED)
562760Speter 				pchr('U');
563760Speter #endif
564760Speter 			if (p->nl_flags & NFILES)
565760Speter 				pchr('F');
566760Speter 		} else
567760Speter 			printf(stars);
568760Speter 		if (p->type)
569760Speter 			printf("\t[%d]", nloff(p->type));
570760Speter 		else
571760Speter 			printf(stars);
572760Speter 		v = p->value[0];
573760Speter 		switch (p->class) {
574760Speter 			case TYPE:
575760Speter 				break;
576760Speter 			case VARNT:
577760Speter 				goto con;
578760Speter 			case CONST:
579760Speter 				switch (nloff(p->type)) {
580760Speter 					default:
581760Speter 						printf("\t%d", v);
582760Speter 						break;
583760Speter 					case TDOUBLE:
584760Speter 						printf("\t%f", p->real);
585760Speter 						break;
586760Speter 					case TINT:
587760Speter 					case T4INT:
588760Speter con:
589760Speter 						printf("\t%ld", p->range[0]);
590760Speter 						break;
591760Speter 					case TSTR:
592760Speter 						printf("\t'%s'", p->ptr[0]);
593760Speter 						break;
594760Speter 					}
595760Speter 				break;
596760Speter 			case VAR:
597760Speter 			case REF:
598760Speter 			case WITHPTR:
5991197Speter 			case FFUNC:
6001197Speter 			case FPROC:
601760Speter 				printf("\t%d,%d", cbn, v);
602760Speter 				break;
603760Speter 			case SCAL:
604760Speter 			case RANGE:
605760Speter 				printf("\t%ld..%ld", p->range[0], p->range[1]);
606760Speter 				break;
60715973Smckusick 			case CRANGE:
60815973Smckusick 				printf("\t%s..%s", p->nptr[0]->symbol,
60915973Smckusick 					p->nptr[1]->symbol);
61015973Smckusick 				break;
611760Speter 			case RECORD:
6128681Speter 				printf("\t%d", v);
613760Speter 				break;
614760Speter 			case FIELD:
615760Speter 				printf("\t%d", v);
616760Speter 				break;
617760Speter 			case STR:
618760Speter 				printf("\t|%d|", p->value[0]);
619760Speter 				break;
620760Speter 			case FVAR:
621760Speter 			case FUNC:
622760Speter 			case PROC:
623760Speter 			case PROG:
624760Speter 				if (cbn == 0) {
625760Speter 					printf("\t<%o>", p->value[0] & 0377);
626760Speter #ifndef PI0
627760Speter 					if (p->value[0] & NSTAND)
628760Speter 						printf("\tNSTAND");
629760Speter #endif
630760Speter 					break;
631760Speter 				}
632760Speter 				v = p->value[1];
633760Speter 			default:
63414736Sthien 
635760Speter 				if (v)
636760Speter 					printf("\t<%d>", v);
637760Speter 				else
638760Speter 					printf(stars);
639760Speter 		}
640760Speter 		if (p->chain)
641760Speter 			printf("\t[%d]", nloff(p->chain));
642760Speter 		switch (p->class) {
643760Speter 			case RECORD:
6448681Speter 				printf("\tALIGN=%d", p->align_info);
6458681Speter 				if (p->ptr[NL_FIELDLIST]) {
6468681Speter 				    printf(" FLIST=[%d]",
6478681Speter 					nloff(p->ptr[NL_FIELDLIST]));
6488681Speter 				} else {
6498681Speter 				    printf(" FLIST=[]");
6508681Speter 				}
6518681Speter 				if (p->ptr[NL_TAG]) {
6528681Speter 				    printf(" TAG=[%d]",
6538681Speter 					nloff(p->ptr[NL_TAG]));
6548681Speter 				} else {
6558681Speter 				    printf(" TAG=[]");
6568681Speter 				}
6578681Speter 				if (p->ptr[NL_VARNT]) {
6588681Speter 				    printf(" VARNT=[%d]",
6598681Speter 					nloff(p->ptr[NL_VARNT]));
6608681Speter 				} else {
6618681Speter 				    printf(" VARNT=[]");
6628681Speter 				}
663760Speter 				break;
6648681Speter 			case FIELD:
6658681Speter 				if (p->ptr[NL_FIELDLIST]) {
6668681Speter 				    printf("\tFLIST=[%d]",
6678681Speter 					nloff(p->ptr[NL_FIELDLIST]));
6688681Speter 				} else {
6698681Speter 				    printf("\tFLIST=[]");
6708681Speter 				}
6718681Speter 				break;
672760Speter 			case VARNT:
6738681Speter 				printf("\tVTOREC=[%d]",
6748681Speter 				    nloff(p->ptr[NL_VTOREC]));
675760Speter 				break;
676760Speter 		}
6773828Speter #		ifdef PC
6783828Speter 		    if ( p -> extra_flags != 0 ) {
6793828Speter 			pchr( '\t' );
6803828Speter 			if ( p -> extra_flags & NEXTERN )
6813828Speter 			    printf( "NEXTERN " );
6823828Speter 			if ( p -> extra_flags & NLOCAL )
6833828Speter 			    printf( "NLOCAL " );
6843828Speter 			if ( p -> extra_flags & NPARAM )
6853828Speter 			    printf( "NPARAM " );
6863828Speter 			if ( p -> extra_flags & NGLOBAL )
6873828Speter 			    printf( "NGLOBAL " );
6883828Speter 			if ( p -> extra_flags & NREGVAR )
6893828Speter 			    printf( "NREGVAR " );
6903828Speter 		    }
6913828Speter #		endif PC
692760Speter #		ifdef PTREE
693760Speter 		    pchr( '\t' );
694760Speter 		    pPrintPointer( stdout , "%s" , p -> inTree );
695760Speter #		endif
696760Speter 		pchr('\n');
697760Speter 	}
698760Speter 	if (head == 0)
699760Speter 		printf("\tNo entries\n");
700760Speter }
701760Speter #endif
702760Speter 
703760Speter 
704760Speter /*
705760Speter  * Define a new name list entry
706760Speter  * with initial symbol, class, type
707760Speter  * and value[0] as given.  A new name
708760Speter  * list segment is allocated to hold
709760Speter  * the next name list slot if necessary.
710760Speter  */
711760Speter struct nl *
defnl(sym,cls,typ,val)712760Speter defnl(sym, cls, typ, val)
713760Speter 	char *sym;
714760Speter 	int cls;
715760Speter 	struct nl *typ;
716760Speter 	int val;
717760Speter {
718760Speter 	register struct nl *p;
719760Speter 	register int *q, i;
720760Speter 	char *cp;
721760Speter 
722760Speter 	p = nlp;
723760Speter 
724760Speter 	/*
725760Speter 	 * Zero out this entry
726760Speter 	 */
72714736Sthien 	q = ((int *) p);
728760Speter 	i = (sizeof *p)/(sizeof (int));
729760Speter 	do
730760Speter 		*q++ = 0;
731760Speter 	while (--i);
732760Speter 
733760Speter 	/*
734760Speter 	 * Insert the values
735760Speter 	 */
736760Speter 	p->symbol = sym;
737760Speter 	p->class = cls;
738760Speter 	p->type = typ;
739760Speter 	p->nl_block = cbn;
740760Speter 	p->value[0] = val;
741760Speter 
742760Speter 	/*
743760Speter 	 * Insure that the next namelist
744760Speter 	 * entry actually exists. This is
745760Speter 	 * really not needed here, it would
746760Speter 	 * suffice to do it at entry if we
747760Speter 	 * need the slot.  It is done this
748760Speter 	 * way because, historically, nlp
749760Speter 	 * always pointed at the next namelist
750760Speter 	 * slot.
751760Speter 	 */
752760Speter 	nlp++;
753760Speter 	if (nlp >= nlact->nls_high) {
754760Speter 		i = NLINC;
75514736Sthien 		cp = (char *) malloc(NLINC * sizeof *nlp);
7561834Speter 		if (cp == 0) {
757760Speter 			i = NLINC / 2;
75814736Sthien 			cp = (char *) malloc((NLINC / 2) * sizeof *nlp);
759760Speter 		}
7601834Speter 		if (cp == 0) {
761760Speter 			error("Ran out of memory (defnl)");
762760Speter 			pexit(DIED);
763760Speter 		}
764760Speter 		nlact++;
765760Speter 		if (nlact >= &ntab[MAXNL]) {
766760Speter 			error("Ran out of name list tables");
767760Speter 			pexit(DIED);
768760Speter 		}
76914736Sthien 		nlp = (struct nl *) cp;
770760Speter 		nlact->nls_low = nlp;
771760Speter 		nlact->nls_high = nlact->nls_low + i;
772760Speter 	}
773760Speter 	return (p);
774760Speter }
775760Speter 
776760Speter /*
777760Speter  * Make a duplicate of the argument
778760Speter  * namelist entry for, e.g., type
779760Speter  * declarations of the form 'type a = b'
780760Speter  * and array indicies.
781760Speter  */
782760Speter struct nl *
nlcopy(p)783760Speter nlcopy(p)
784760Speter 	struct nl *p;
785760Speter {
78614736Sthien 	register struct nl *p1, *p2;
787760Speter 
788760Speter 	p1 = p;
78916272Speter 	p2 = defnl((char *) 0, 0, NLNIL, 0);
79016272Speter 	*p2 = *p1;
79116272Speter 	p2->chain = NLNIL;
79216272Speter 	return (p2);
793760Speter }
794760Speter 
795760Speter /*
796760Speter  * Compute a namelist offset
797760Speter  */
798760Speter nloff(p)
799760Speter 	struct nl *p;
800760Speter {
801760Speter 
802760Speter 	return (p - nl);
803760Speter }
804760Speter 
805760Speter /*
806760Speter  * Enter a symbol into the block
807760Speter  * symbol table.  Symbols are hashed
808760Speter  * 64 ways based on low 6 bits of the
809760Speter  * character pointer into the string
810760Speter  * table.
811760Speter  */
812760Speter struct nl *
enter(np)813760Speter enter(np)
814760Speter 	struct nl *np;
815760Speter {
816760Speter 	register struct nl *rp, *hp;
817760Speter 	register struct nl *p;
818760Speter 	int i;
819760Speter 
820760Speter 	rp = np;
821760Speter 	if (rp == NIL)
822760Speter 		return (NIL);
823760Speter #ifndef PI1
824760Speter 	if (cbn > 0)
825760Speter 		if (rp->symbol == input->symbol || rp->symbol == output->symbol)
826760Speter 			error("Pre-defined files input and output must not be redefined");
827760Speter #endif
82814736Sthien 	i = (int) rp->symbol;
829760Speter 	i &= 077;
830760Speter 	hp = disptab[i];
831760Speter 	if (rp->class != BADUSE && rp->class != FIELD)
832760Speter 	for (p = hp; p != NIL && (p->nl_block & 037) == cbn; p = p->nl_next)
83315973Smckusick 		if (p->symbol == rp->symbol && p->symbol != NIL &&
83415973Smckusick 		    p->class != BADUSE && p->class != FIELD) {
835760Speter #ifndef PI1
836760Speter 			error("%s is already defined in this block", rp->symbol);
837760Speter #endif
838760Speter 			break;
839760Speter 
840760Speter 		}
841760Speter 	rp->nl_next = hp;
842760Speter 	disptab[i] = rp;
843760Speter 	return (rp);
844760Speter }
845760Speter #endif
846