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