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