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