xref: /csrg-svn/usr.bin/pascal/src/nl.c (revision 14736)
1760Speter /* Copyright (c) 1979 Regents of the University of California */
2760Speter 
3*14736Sthien #ifndef lint
4*14736Sthien static	char sccsid[] = "@(#)nl.c 1.13 08/19/83";
5*14736Sthien #endif
6760Speter 
7760Speter #include "whoami.h"
8760Speter #include "0.h"
912854Speter #ifdef PI
10760Speter #include "opcode.h"
11760Speter #include "objfmt.h"
12760Speter 
13760Speter /*
14760Speter  * NAMELIST SEGMENT DEFINITIONS
15760Speter  */
16760Speter struct nls {
17760Speter 	struct nl *nls_low;
18760Speter 	struct nl *nls_high;
19760Speter } ntab[MAXNL], *nlact;
20760Speter 
21760Speter struct	nl nl[INL];
22760Speter struct	nl *nlp = nl;
23760Speter struct	nls *nlact = ntab;
24760Speter 
25760Speter     /*
26760Speter      *	all these strings must be places where people can find them
27760Speter      *	since lookup only looks at the string pointer, not the chars.
28760Speter      *	see, for example, pTreeInit.
29760Speter      */
30760Speter 
31760Speter     /*
32760Speter      *	built in constants
33760Speter      */
34760Speter char	*in_consts[] = {
35760Speter 	    "true" ,
36760Speter 	    "false" ,
37760Speter 	    "TRUE",
38760Speter 	    "FALSE",
39760Speter 	    "minint" ,
40760Speter 	    "maxint" ,
41760Speter 	    "minchar" ,
42760Speter 	    "maxchar" ,
43760Speter 	    "bell" ,
44760Speter 	    "tab" ,
45760Speter 	    0
46760Speter 	};
47760Speter 
48760Speter     /*
49760Speter      *	built in simple types
50760Speter      */
51760Speter char *in_types[] =
52760Speter     {
53760Speter 	"boolean",
54760Speter 	"char",
55760Speter 	"integer",
56760Speter 	"real",
57760Speter 	"_nil",		/* dummy name */
58760Speter 	0
59760Speter     };
60760Speter 
61760Speter int in_rclasses[] =
62760Speter     {
63760Speter 	TINT ,
64760Speter 	TINT ,
65760Speter 	TINT ,
66760Speter 	TCHAR ,
67760Speter 	TBOOL ,
68760Speter 	TDOUBLE ,
69760Speter 	0
70760Speter     };
71760Speter 
72760Speter long in_ranges[] =
73760Speter     {
7410648Speter 	-128L	 , 127L ,
75760Speter 	-32768L	 , 32767L ,
76760Speter 	-2147483648L , 2147483647L ,
77760Speter 	0L		 , 127L ,
78760Speter 	0L		 , 1L ,
79760Speter 	0L		 , 0L 		/* fake for reals */
80760Speter     };
81760Speter 
82760Speter     /*
83760Speter      *	built in constructed types
84760Speter      */
85760Speter char	*in_ctypes[] = {
86760Speter 	    "Boolean" ,
87760Speter 	    "intset" ,
88760Speter 	    "alfa" ,
89760Speter 	    "text" ,
90760Speter 	    0
91760Speter 	};
92760Speter 
93760Speter     /*
94760Speter      *	built in variables
95760Speter      */
96760Speter char	*in_vars[] = {
97760Speter 	    "input" ,
98760Speter 	    "output" ,
99760Speter 	    0
100760Speter 	};
101760Speter 
102760Speter     /*
103760Speter      *	built in functions
104760Speter      */
105760Speter char *in_funcs[] =
106760Speter     {
107760Speter 	"abs" ,
108760Speter 	"arctan" ,
109760Speter 	"card" ,
110760Speter 	"chr" ,
111760Speter 	"clock" ,
112760Speter 	"cos" ,
113760Speter 	"eof" ,
114760Speter 	"eoln" ,
115760Speter 	"eos" ,
116760Speter 	"exp" ,
117760Speter 	"expo" ,
118760Speter 	"ln" ,
119760Speter 	"odd" ,
120760Speter 	"ord" ,
121760Speter 	"pred" ,
122760Speter 	"round" ,
123760Speter 	"sin" ,
124760Speter 	"sqr" ,
125760Speter 	"sqrt" ,
126760Speter 	"succ" ,
127760Speter 	"trunc" ,
128760Speter 	"undefined" ,
129760Speter 	/*
130760Speter 	 * Extensions
131760Speter 	 */
132760Speter 	"argc" ,
133760Speter 	"random" ,
134760Speter 	"seed" ,
135760Speter 	"wallclock" ,
136760Speter 	"sysclock" ,
137760Speter 	0
138760Speter     };
139760Speter 
140760Speter 	/*
141760Speter 	 * Built-in procedures
142760Speter 	 */
143760Speter char *in_procs[] =
144760Speter     {
1457927Smckusick 	"assert",
146760Speter 	"date" ,
147760Speter 	"dispose" ,
148760Speter 	"flush" ,
149760Speter 	"get" ,
150760Speter 	"getseg" ,
151760Speter 	"halt" ,
152760Speter 	"linelimit" ,
153760Speter 	"message" ,
154760Speter 	"new" ,
155760Speter 	"pack" ,
156760Speter 	"page" ,
157760Speter 	"put" ,
158760Speter 	"putseg" ,
159760Speter 	"read" ,
160760Speter 	"readln" ,
161760Speter 	"remove" ,
162760Speter 	"reset" ,
163760Speter 	"rewrite" ,
164760Speter 	"time" ,
165760Speter 	"unpack" ,
166760Speter 	"write" ,
167760Speter 	"writeln" ,
168760Speter 	/*
169760Speter 	 * Extensions
170760Speter 	 */
171760Speter 	"argv" ,
172760Speter 	"null" ,
173760Speter 	"stlimit" ,
174760Speter 	0
175760Speter     };
176760Speter 
177760Speter #ifndef PI0
178760Speter     /*
179760Speter      *	and their opcodes
180760Speter      */
181760Speter int in_fops[] =
182760Speter     {
183760Speter 	O_ABS2,
184760Speter 	O_ATAN,
185760Speter 	O_CARD|NSTAND,
186760Speter 	O_CHR2,
187760Speter 	O_CLCK|NSTAND,
188760Speter 	O_COS,
189760Speter 	O_EOF,
190760Speter 	O_EOLN,
191760Speter 	0,
192760Speter 	O_EXP,
193760Speter 	O_EXPO|NSTAND,
194760Speter 	O_LN,
195760Speter 	O_ODD2,
196760Speter 	O_ORD2,
197760Speter 	O_PRED2,
198760Speter 	O_ROUND,
199760Speter 	O_SIN,
200760Speter 	O_SQR2,
201760Speter 	O_SQRT,
202760Speter 	O_SUCC2,
203760Speter 	O_TRUNC,
204760Speter 	O_UNDEF|NSTAND,
205760Speter 	/*
206760Speter 	 * Extensions
207760Speter 	 */
208760Speter 	O_ARGC|NSTAND,
209760Speter 	O_RANDOM|NSTAND,
210760Speter 	O_SEED|NSTAND,
211760Speter 	O_WCLCK|NSTAND,
212760Speter 	O_SCLCK|NSTAND
213760Speter     };
214760Speter 
215760Speter     /*
216760Speter      * Built-in procedures
217760Speter      */
218760Speter int in_pops[] =
219760Speter     {
2207927Smckusick 	O_ASRT|NSTAND,
221760Speter 	O_DATE|NSTAND,
2227914Smckusick 	O_DISPOSE,
223760Speter 	O_FLUSH|NSTAND,
224760Speter 	O_GET,
225760Speter 	0,
226760Speter 	O_HALT|NSTAND,
227760Speter 	O_LLIMIT|NSTAND,
228760Speter 	O_MESSAGE|NSTAND,
229760Speter 	O_NEW,
230760Speter 	O_PACK,
231760Speter 	O_PAGE,
232760Speter 	O_PUT,
233760Speter 	0,
234760Speter 	O_READ4,
235760Speter 	O_READLN,
236760Speter 	O_REMOVE|NSTAND,
237760Speter 	O_RESET,
238760Speter 	O_REWRITE,
239760Speter 	O_TIME|NSTAND,
240760Speter 	O_UNPACK,
241760Speter 	O_WRITEF,
242760Speter 	O_WRITLN,
243760Speter 	/*
244760Speter 	 * Extensions
245760Speter 	 */
246760Speter 	O_ARGV|NSTAND,
247760Speter 	O_ABORT|NSTAND,
248760Speter 	O_STLIM|NSTAND
249760Speter     };
250760Speter #endif
251760Speter 
252760Speter /*
253760Speter  * Initnl initializes the first namelist segment and then
254760Speter  * initializes the name list for block 0.
255760Speter  */
256760Speter initnl()
257760Speter     {
258760Speter 	register char		**cp;
259760Speter 	register struct nl	*np;
260760Speter 	struct nl		*fp;
261760Speter 	int			*ip;
262760Speter 	long			*lp;
263760Speter 
264760Speter #ifdef	DEBUG
265760Speter 	if ( hp21mx )
266760Speter 	    {
267760Speter 		MININT = -32768.;
268760Speter 		MAXINT = 32767.;
269760Speter #ifndef	PI0
2706356Speter #ifdef OBJ
271760Speter 		genmx();
2726356Speter #endif OBJ
273760Speter #endif
274760Speter 	    }
275760Speter #endif
276760Speter 	ntab[0].nls_low = nl;
277760Speter 	ntab[0].nls_high = &nl[INL];
278*14736Sthien 	(void) defnl ( (char *) 0 , 0 , NLNIL , 0 );
279760Speter 
280760Speter 	/*
281760Speter 	 *	Types
282760Speter 	 */
283760Speter 	for ( cp = in_types ; *cp != 0 ; cp ++ )
284*14736Sthien 	    (void) hdefnl ( *cp , TYPE , nlp , 0 );
285760Speter 
286760Speter 	/*
287760Speter 	 *	Ranges
288760Speter 	 */
289760Speter 	lp = in_ranges;
290760Speter 	for ( ip = in_rclasses ; *ip != 0 ; ip ++ )
291760Speter 	    {
292*14736Sthien 		np = defnl ( (char *) 0 , RANGE , nl+(*ip) , 0 );
293760Speter 		nl[*ip].type = np;
294760Speter 		np -> range[0] = *lp ++ ;
295760Speter 		np -> range[1] = *lp ++ ;
296760Speter 
297760Speter 	    };
298760Speter 
299760Speter 	/*
300760Speter 	 *	built in constructed types
301760Speter 	 */
302760Speter 
303760Speter 	cp = in_ctypes;
304760Speter 	/*
305760Speter 	 *	Boolean = boolean;
306760Speter 	 */
307*14736Sthien 	(void) hdefnl ( *cp++ , TYPE , (struct nl *) (nl+T1BOOL) , 0 );
308760Speter 
309760Speter 	/*
310760Speter 	 *	intset = set of 0 .. 127;
311760Speter 	 */
312*14736Sthien 	intset = ((struct nl *) *cp++);
313*14736Sthien 	(void) hdefnl( (char *) intset , TYPE , nlp+1 , 0 );
314*14736Sthien 	(void) defnl ( (char *) 0 , SET , nlp+1 , 0 );
315*14736Sthien 	np = defnl ( (char *) 0 , RANGE , nl+TINT , 0 );
316760Speter 	np -> range[0] = 0L;
317760Speter 	np -> range[1] = 127L;
318760Speter 
319760Speter 	/*
320760Speter 	 *	alfa = array [ 1 .. 10 ] of char;
321760Speter 	 */
322*14736Sthien 	np = defnl ( (char *) 0 , RANGE , nl+TINT , 0 );
323760Speter 	np -> range[0] = 1L;
324760Speter 	np -> range[1] = 10L;
325*14736Sthien 	defnl ( (char *) 0 , ARRAY , nl+T1CHAR , 1 ) -> chain = np;
326*14736Sthien 	(void) hdefnl ( *cp++ , TYPE , nlp-1 , 0 );
327760Speter 
328760Speter 	/*
329760Speter 	 *	text = file of char;
330760Speter 	 */
331*14736Sthien 	(void) hdefnl ( *cp++ , TYPE , nlp+1 , 0 );
332*14736Sthien 	np = defnl ( (char *) 0 , FILET , nl+T1CHAR , 0 );
333760Speter 	np -> nl_flags |= NFILES;
334760Speter 
335760Speter 	/*
336760Speter 	 *	input,output : text;
337760Speter 	 */
338760Speter 	cp = in_vars;
339760Speter #	ifndef	PI0
340760Speter 		input = hdefnl ( *cp++ , VAR , np , INPUT_OFF );
341760Speter 		output = hdefnl (  *cp++ , VAR , np , OUTPUT_OFF );
342760Speter #	else
343760Speter 		input = hdefnl ( *cp++ , VAR , np , 0 );
344760Speter 		output = hdefnl ( *cp++ , VAR , np , 0 );
345760Speter #	endif
3463828Speter #	ifdef PC
3473828Speter 	    input -> extra_flags |= NGLOBAL;
3483828Speter 	    output -> extra_flags |= NGLOBAL;
3493828Speter #	endif PC
350760Speter 
351760Speter 	/*
352760Speter 	 *	built in constants
353760Speter 	 */
354760Speter 	cp = in_consts;
355760Speter 	np = hdefnl ( *cp++ , CONST , nl + TBOOL , 1 );
356760Speter 	fp = hdefnl ( *cp++ , CONST , nl + TBOOL , 0 );
357760Speter 	(nl + TBOOL)->chain = fp;
358760Speter 	fp->chain = np;
359760Speter 	np = hdefnl ( *cp++ , CONST , nl + TBOOL , 1 );
360760Speter 	fp = hdefnl ( *cp++ , CONST , nl + TBOOL , 0 );
361760Speter 	fp->chain = np;
362760Speter 	if (opt('s'))
363760Speter 		(nl + TBOOL)->chain = fp;
364760Speter 	hdefnl ( *cp++ , CONST , nl + T4INT , 0 ) -> range[0] = MININT;
365760Speter 	hdefnl ( *cp++ , CONST , nl + T4INT , 0 ) -> range[0] = MAXINT;
366*14736Sthien 	(void) hdefnl ( *cp++ , CONST , nl + T1CHAR , 0 );
367*14736Sthien 	(void) hdefnl ( *cp++ , CONST , nl + T1CHAR , 127 );
368*14736Sthien 	(void) hdefnl ( *cp++ , CONST , nl + T1CHAR , '\007' );
369*14736Sthien 	(void) hdefnl ( *cp++ , CONST , nl + T1CHAR , '\t' );
370760Speter 
371760Speter 	/*
372760Speter 	 * Built-in functions and procedures
373760Speter 	 */
374760Speter #ifndef PI0
375760Speter 	ip = in_fops;
376760Speter 	for ( cp = in_funcs ; *cp != 0 ; cp ++ )
377*14736Sthien 	    (void) hdefnl ( *cp , FUNC , NLNIL , * ip ++ );
378760Speter 	ip = in_pops;
379760Speter 	for ( cp = in_procs ; *cp != 0 ; cp ++ )
380*14736Sthien 	    (void) hdefnl ( *cp , PROC , NLNIL , * ip ++ );
381760Speter #else
382760Speter 	for ( cp = in_funcs ; *cp != 0 ; cp ++ )
383*14736Sthien 	    (void) hdefnl ( *cp , FUNC , NLNIL , 0 );
384760Speter 	for ( cp = in_procs ; *cp != 0 , cp ++ )
385*14736Sthien 	    (void) hdefnl ( *cp , PROC , NLNIL , 0 );
386760Speter #endif
387760Speter #	ifdef PTREE
388760Speter 	    pTreeInit();
389760Speter #	endif
390760Speter     }
391760Speter 
392760Speter struct nl *
393760Speter hdefnl(sym, cls, typ, val)
394*14736Sthien     char *sym;
395*14736Sthien     int  cls;
396*14736Sthien     struct nl *typ;
397*14736Sthien     int val;
398760Speter {
399760Speter 	register struct nl *p;
400760Speter 
401760Speter #ifndef PI1
402760Speter 	if (sym)
403*14736Sthien 		(void) hash(sym, 0);
404760Speter #endif
405760Speter 	p = defnl(sym, cls, typ, val);
406760Speter 	if (sym)
407*14736Sthien 		(void) enter(p);
408760Speter 	return (p);
409760Speter }
410760Speter 
411760Speter /*
412760Speter  * Free up the name list segments
413760Speter  * at the end of a statement/proc/func
414760Speter  * All segments are freed down to the one in which
415760Speter  * p points.
416760Speter  */
417760Speter nlfree(p)
418760Speter 	struct nl *p;
419760Speter {
420760Speter 
421760Speter 	nlp = p;
422760Speter 	while (nlact->nls_low > nlp || nlact->nls_high < nlp) {
423*14736Sthien 		free((char *) nlact->nls_low);
424760Speter 		nlact->nls_low = NIL;
425760Speter 		nlact->nls_high = NIL;
426760Speter 		--nlact;
427760Speter 		if (nlact < &ntab[0])
428760Speter 			panic("nlfree");
429760Speter 	}
430760Speter }
43112851Speter #endif PI
432760Speter 
433760Speter 
434*14736Sthien #ifndef PC
435*14736Sthien #ifndef OBJ
436760Speter char	*VARIABLE	= "variable";
437*14736Sthien #endif PC
438*14736Sthien #endif OBJ
439760Speter 
440760Speter char	*classes[ ] = {
441760Speter 	"undefined",
442760Speter 	"constant",
443760Speter 	"type",
444760Speter 	"variable",	/*	VARIABLE	*/
445760Speter 	"array",
446760Speter 	"pointer or file",
447760Speter 	"record",
448760Speter 	"field",
449760Speter 	"procedure",
450760Speter 	"function",
451760Speter 	"variable",	/*	VARIABLE	*/
452760Speter 	"variable",	/*	VARIABLE	*/
453760Speter 	"pointer",
454760Speter 	"file",
455760Speter 	"set",
456760Speter 	"subrange",
457760Speter 	"label",
458760Speter 	"withptr",
459760Speter 	"scalar",
460760Speter 	"string",
461760Speter 	"program",
4621197Speter 	"improper",
4631197Speter 	"variant",
4641197Speter 	"formal procedure",
4651197Speter 	"formal function"
466760Speter };
467760Speter 
468*14736Sthien #ifndef PC
469*14736Sthien #ifndef OBJ
470760Speter char	*snark	= "SNARK";
471*14736Sthien #endif
472*14736Sthien #endif
473760Speter 
474760Speter #ifdef PI
475760Speter #ifdef DEBUG
476760Speter char	*ctext[] =
477760Speter {
478760Speter 	"BADUSE",
479760Speter 	"CONST",
480760Speter 	"TYPE",
481760Speter 	"VAR",
482760Speter 	"ARRAY",
483760Speter 	"PTRFILE",
484760Speter 	"RECORD",
485760Speter 	"FIELD",
486760Speter 	"PROC",
487760Speter 	"FUNC",
488760Speter 	"FVAR",
489760Speter 	"REF",
490760Speter 	"PTR",
491760Speter 	"FILET",
492760Speter 	"SET",
493760Speter 	"RANGE",
494760Speter 	"LABEL",
495760Speter 	"WITHPTR",
496760Speter 	"SCAL",
497760Speter 	"STR",
498760Speter 	"PROG",
499760Speter 	"IMPROPER",
5001197Speter 	"VARNT",
5011197Speter 	"FPROC",
5021197Speter 	"FFUNC"
503760Speter };
504760Speter 
505760Speter char	*stars	= "\t***";
506760Speter 
507760Speter /*
508760Speter  * Dump the namelist from the
509760Speter  * current nlp down to 'to'.
510760Speter  * All the namelist is dumped if
511760Speter  * to is NIL.
512760Speter  */
513*14736Sthien /*VARARGS*/
514760Speter dumpnl(to, rout)
515760Speter 	struct nl *to;
516760Speter {
517760Speter 	register struct nl *p;
518760Speter 	struct nls *nlsp;
519*14736Sthien 	int v, head;
520760Speter 
521760Speter 	if (opt('y') == 0)
522760Speter 		return;
523760Speter 	if (to != NIL)
524760Speter 		printf("\n\"%s\" Block=%d\n", rout, cbn);
525760Speter 	nlsp = nlact;
526760Speter 	head = NIL;
527760Speter 	for (p = nlp; p != to;) {
528760Speter 		if (p == nlsp->nls_low) {
529760Speter 			if (nlsp == &ntab[0])
530760Speter 				break;
531760Speter 			nlsp--;
532760Speter 			p = nlsp->nls_high;
533760Speter 		}
534760Speter 		p--;
535760Speter 		if (head == NIL) {
536760Speter 			printf("\tName\tClass  Bn+Flags\tType\tVal\tChn\n");
537760Speter 			head++;
538760Speter 		}
539760Speter 		printf("%3d:", nloff(p));
540760Speter 		if (p->symbol)
541760Speter 			printf("\t%.7s", p->symbol);
542760Speter 		else
543760Speter 			printf(stars);
544760Speter 		if (p->class)
545760Speter 			printf("\t%s", ctext[p->class]);
546760Speter 		else
547760Speter 			printf(stars);
548760Speter 		if (p->nl_flags) {
549760Speter 			pchr('\t');
550760Speter 			if (p->nl_flags & 037)
551760Speter 				printf("%d ", p->nl_flags & 037);
552760Speter #ifndef PI0
553760Speter 			if (p->nl_flags & NMOD)
554760Speter 				pchr('M');
555760Speter 			if (p->nl_flags & NUSED)
556760Speter 				pchr('U');
557760Speter #endif
558760Speter 			if (p->nl_flags & NFILES)
559760Speter 				pchr('F');
560760Speter 		} else
561760Speter 			printf(stars);
562760Speter 		if (p->type)
563760Speter 			printf("\t[%d]", nloff(p->type));
564760Speter 		else
565760Speter 			printf(stars);
566760Speter 		v = p->value[0];
567760Speter 		switch (p->class) {
568760Speter 			case TYPE:
569760Speter 				break;
570760Speter 			case VARNT:
571760Speter 				goto con;
572760Speter 			case CONST:
573760Speter 				switch (nloff(p->type)) {
574760Speter 					default:
575760Speter 						printf("\t%d", v);
576760Speter 						break;
577760Speter 					case TDOUBLE:
578760Speter 						printf("\t%f", p->real);
579760Speter 						break;
580760Speter 					case TINT:
581760Speter 					case T4INT:
582760Speter con:
583760Speter 						printf("\t%ld", p->range[0]);
584760Speter 						break;
585760Speter 					case TSTR:
586760Speter 						printf("\t'%s'", p->ptr[0]);
587760Speter 						break;
588760Speter 					}
589760Speter 				break;
590760Speter 			case VAR:
591760Speter 			case REF:
592760Speter 			case WITHPTR:
5931197Speter 			case FFUNC:
5941197Speter 			case FPROC:
595760Speter 				printf("\t%d,%d", cbn, v);
596760Speter 				break;
597760Speter 			case SCAL:
598760Speter 			case RANGE:
599760Speter 				printf("\t%ld..%ld", p->range[0], p->range[1]);
600760Speter 				break;
601760Speter 			case RECORD:
6028681Speter 				printf("\t%d", v);
603760Speter 				break;
604760Speter 			case FIELD:
605760Speter 				printf("\t%d", v);
606760Speter 				break;
607760Speter 			case STR:
608760Speter 				printf("\t|%d|", p->value[0]);
609760Speter 				break;
610760Speter 			case FVAR:
611760Speter 			case FUNC:
612760Speter 			case PROC:
613760Speter 			case PROG:
614760Speter 				if (cbn == 0) {
615760Speter 					printf("\t<%o>", p->value[0] & 0377);
616760Speter #ifndef PI0
617760Speter 					if (p->value[0] & NSTAND)
618760Speter 						printf("\tNSTAND");
619760Speter #endif
620760Speter 					break;
621760Speter 				}
622760Speter 				v = p->value[1];
623760Speter 			default:
624*14736Sthien 
625760Speter 				if (v)
626760Speter 					printf("\t<%d>", v);
627760Speter 				else
628760Speter 					printf(stars);
629760Speter 		}
630760Speter 		if (p->chain)
631760Speter 			printf("\t[%d]", nloff(p->chain));
632760Speter 		switch (p->class) {
633760Speter 			case RECORD:
6348681Speter 				printf("\tALIGN=%d", p->align_info);
6358681Speter 				if (p->ptr[NL_FIELDLIST]) {
6368681Speter 				    printf(" FLIST=[%d]",
6378681Speter 					nloff(p->ptr[NL_FIELDLIST]));
6388681Speter 				} else {
6398681Speter 				    printf(" FLIST=[]");
6408681Speter 				}
6418681Speter 				if (p->ptr[NL_TAG]) {
6428681Speter 				    printf(" TAG=[%d]",
6438681Speter 					nloff(p->ptr[NL_TAG]));
6448681Speter 				} else {
6458681Speter 				    printf(" TAG=[]");
6468681Speter 				}
6478681Speter 				if (p->ptr[NL_VARNT]) {
6488681Speter 				    printf(" VARNT=[%d]",
6498681Speter 					nloff(p->ptr[NL_VARNT]));
6508681Speter 				} else {
6518681Speter 				    printf(" VARNT=[]");
6528681Speter 				}
653760Speter 				break;
6548681Speter 			case FIELD:
6558681Speter 				if (p->ptr[NL_FIELDLIST]) {
6568681Speter 				    printf("\tFLIST=[%d]",
6578681Speter 					nloff(p->ptr[NL_FIELDLIST]));
6588681Speter 				} else {
6598681Speter 				    printf("\tFLIST=[]");
6608681Speter 				}
6618681Speter 				break;
662760Speter 			case VARNT:
6638681Speter 				printf("\tVTOREC=[%d]",
6648681Speter 				    nloff(p->ptr[NL_VTOREC]));
665760Speter 				break;
666760Speter 		}
6673828Speter #		ifdef PC
6683828Speter 		    if ( p -> extra_flags != 0 ) {
6693828Speter 			pchr( '\t' );
6703828Speter 			if ( p -> extra_flags & NEXTERN )
6713828Speter 			    printf( "NEXTERN " );
6723828Speter 			if ( p -> extra_flags & NLOCAL )
6733828Speter 			    printf( "NLOCAL " );
6743828Speter 			if ( p -> extra_flags & NPARAM )
6753828Speter 			    printf( "NPARAM " );
6763828Speter 			if ( p -> extra_flags & NGLOBAL )
6773828Speter 			    printf( "NGLOBAL " );
6783828Speter 			if ( p -> extra_flags & NREGVAR )
6793828Speter 			    printf( "NREGVAR " );
6803828Speter 		    }
6813828Speter #		endif PC
682760Speter #		ifdef PTREE
683760Speter 		    pchr( '\t' );
684760Speter 		    pPrintPointer( stdout , "%s" , p -> inTree );
685760Speter #		endif
686760Speter 		pchr('\n');
687760Speter 	}
688760Speter 	if (head == 0)
689760Speter 		printf("\tNo entries\n");
690760Speter }
691760Speter #endif
692760Speter 
693760Speter 
694760Speter /*
695760Speter  * Define a new name list entry
696760Speter  * with initial symbol, class, type
697760Speter  * and value[0] as given.  A new name
698760Speter  * list segment is allocated to hold
699760Speter  * the next name list slot if necessary.
700760Speter  */
701760Speter struct nl *
702760Speter defnl(sym, cls, typ, val)
703760Speter 	char *sym;
704760Speter 	int cls;
705760Speter 	struct nl *typ;
706760Speter 	int val;
707760Speter {
708760Speter 	register struct nl *p;
709760Speter 	register int *q, i;
710760Speter 	char *cp;
711760Speter 
712760Speter 	p = nlp;
713760Speter 
714760Speter 	/*
715760Speter 	 * Zero out this entry
716760Speter 	 */
717*14736Sthien 	q = ((int *) p);
718760Speter 	i = (sizeof *p)/(sizeof (int));
719760Speter 	do
720760Speter 		*q++ = 0;
721760Speter 	while (--i);
722760Speter 
723760Speter 	/*
724760Speter 	 * Insert the values
725760Speter 	 */
726760Speter 	p->symbol = sym;
727760Speter 	p->class = cls;
728760Speter 	p->type = typ;
729760Speter 	p->nl_block = cbn;
730760Speter 	p->value[0] = val;
731760Speter 
732760Speter 	/*
733760Speter 	 * Insure that the next namelist
734760Speter 	 * entry actually exists. This is
735760Speter 	 * really not needed here, it would
736760Speter 	 * suffice to do it at entry if we
737760Speter 	 * need the slot.  It is done this
738760Speter 	 * way because, historically, nlp
739760Speter 	 * always pointed at the next namelist
740760Speter 	 * slot.
741760Speter 	 */
742760Speter 	nlp++;
743760Speter 	if (nlp >= nlact->nls_high) {
744760Speter 		i = NLINC;
745*14736Sthien 		cp = (char *) malloc(NLINC * sizeof *nlp);
7461834Speter 		if (cp == 0) {
747760Speter 			i = NLINC / 2;
748*14736Sthien 			cp = (char *) malloc((NLINC / 2) * sizeof *nlp);
749760Speter 		}
7501834Speter 		if (cp == 0) {
751760Speter 			error("Ran out of memory (defnl)");
752760Speter 			pexit(DIED);
753760Speter 		}
754760Speter 		nlact++;
755760Speter 		if (nlact >= &ntab[MAXNL]) {
756760Speter 			error("Ran out of name list tables");
757760Speter 			pexit(DIED);
758760Speter 		}
759*14736Sthien 		nlp = (struct nl *) cp;
760760Speter 		nlact->nls_low = nlp;
761760Speter 		nlact->nls_high = nlact->nls_low + i;
762760Speter 	}
763760Speter 	return (p);
764760Speter }
765760Speter 
766760Speter /*
767760Speter  * Make a duplicate of the argument
768760Speter  * namelist entry for, e.g., type
769760Speter  * declarations of the form 'type a = b'
770760Speter  * and array indicies.
771760Speter  */
772760Speter struct nl *
773760Speter nlcopy(p)
774760Speter 	struct nl *p;
775760Speter {
776*14736Sthien 	register struct nl *p1, *p2;
777*14736Sthien 	register int i;
778760Speter 
779760Speter 	p1 = p;
780*14736Sthien 	p = p2 = defnl((char *) 0, 0, NLNIL, 0);
781760Speter 	i = (sizeof *p)/(sizeof (int));
782760Speter 	do
783760Speter 		*p2++ = *p1++;
784760Speter 	while (--i);
785760Speter 	p->chain = NIL;
786760Speter 	return (p);
787760Speter }
788760Speter 
789760Speter /*
790760Speter  * Compute a namelist offset
791760Speter  */
792760Speter nloff(p)
793760Speter 	struct nl *p;
794760Speter {
795760Speter 
796760Speter 	return (p - nl);
797760Speter }
798760Speter 
799760Speter /*
800760Speter  * Enter a symbol into the block
801760Speter  * symbol table.  Symbols are hashed
802760Speter  * 64 ways based on low 6 bits of the
803760Speter  * character pointer into the string
804760Speter  * table.
805760Speter  */
806760Speter struct nl *
807760Speter enter(np)
808760Speter 	struct nl *np;
809760Speter {
810760Speter 	register struct nl *rp, *hp;
811760Speter 	register struct nl *p;
812760Speter 	int i;
813760Speter 
814760Speter 	rp = np;
815760Speter 	if (rp == NIL)
816760Speter 		return (NIL);
817760Speter #ifndef PI1
818760Speter 	if (cbn > 0)
819760Speter 		if (rp->symbol == input->symbol || rp->symbol == output->symbol)
820760Speter 			error("Pre-defined files input and output must not be redefined");
821760Speter #endif
822*14736Sthien 	i = (int) rp->symbol;
823760Speter 	i &= 077;
824760Speter 	hp = disptab[i];
825760Speter 	if (rp->class != BADUSE && rp->class != FIELD)
826760Speter 	for (p = hp; p != NIL && (p->nl_block & 037) == cbn; p = p->nl_next)
827760Speter 		if (p->symbol == rp->symbol && p->class != BADUSE && p->class != FIELD) {
828760Speter #ifndef PI1
829760Speter 			error("%s is already defined in this block", rp->symbol);
830760Speter #endif
831760Speter 			break;
832760Speter 
833760Speter 		}
834760Speter 	rp->nl_next = hp;
835760Speter 	disptab[i] = rp;
836760Speter 	return (rp);
837760Speter }
838760Speter #endif
839