xref: /csrg-svn/usr.bin/pascal/src/nl.c (revision 16272)
1760Speter /* Copyright (c) 1979 Regents of the University of California */
2760Speter 
314736Sthien #ifndef lint
4*16272Speter static	char sccsid[] = "@(#)nl.c 2.2 04/02/84";
514736Sthien #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];
27814736Sthien 	(void) defnl ( (char *) 0 , 0 , NLNIL , 0 );
279760Speter 
280760Speter 	/*
281760Speter 	 *	Types
282760Speter 	 */
283760Speter 	for ( cp = in_types ; *cp != 0 ; cp ++ )
28414736Sthien 	    (void) hdefnl ( *cp , TYPE , nlp , 0 );
285760Speter 
286760Speter 	/*
287760Speter 	 *	Ranges
288760Speter 	 */
289760Speter 	lp = in_ranges;
290760Speter 	for ( ip = in_rclasses ; *ip != 0 ; ip ++ )
291760Speter 	    {
29214736Sthien 		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 	 */
30714736Sthien 	(void) hdefnl ( *cp++ , TYPE , (struct nl *) (nl+T1BOOL) , 0 );
308760Speter 
309760Speter 	/*
310760Speter 	 *	intset = set of 0 .. 127;
311760Speter 	 */
31214736Sthien 	intset = ((struct nl *) *cp++);
31314736Sthien 	(void) hdefnl( (char *) intset , TYPE , nlp+1 , 0 );
31414736Sthien 	(void) defnl ( (char *) 0 , SET , nlp+1 , 0 );
31514736Sthien 	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 	 */
32214736Sthien 	np = defnl ( (char *) 0 , RANGE , nl+TINT , 0 );
323760Speter 	np -> range[0] = 1L;
324760Speter 	np -> range[1] = 10L;
32514736Sthien 	defnl ( (char *) 0 , ARRAY , nl+T1CHAR , 1 ) -> chain = np;
32614736Sthien 	(void) hdefnl ( *cp++ , TYPE , nlp-1 , 0 );
327760Speter 
328760Speter 	/*
329760Speter 	 *	text = file of char;
330760Speter 	 */
33114736Sthien 	(void) hdefnl ( *cp++ , TYPE , nlp+1 , 0 );
33214736Sthien 	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;
36614736Sthien 	(void) hdefnl ( *cp++ , CONST , nl + T1CHAR , 0 );
36714736Sthien 	(void) hdefnl ( *cp++ , CONST , nl + T1CHAR , 127 );
36814736Sthien 	(void) hdefnl ( *cp++ , CONST , nl + T1CHAR , '\007' );
36914736Sthien 	(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 ++ )
37714736Sthien 	    (void) hdefnl ( *cp , FUNC , NLNIL , * ip ++ );
378760Speter 	ip = in_pops;
379760Speter 	for ( cp = in_procs ; *cp != 0 ; cp ++ )
38014736Sthien 	    (void) hdefnl ( *cp , PROC , NLNIL , * ip ++ );
381760Speter #else
382760Speter 	for ( cp = in_funcs ; *cp != 0 ; cp ++ )
38314736Sthien 	    (void) hdefnl ( *cp , FUNC , NLNIL , 0 );
384760Speter 	for ( cp = in_procs ; *cp != 0 , cp ++ )
38514736Sthien 	    (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)
39414736Sthien     char *sym;
39514736Sthien     int  cls;
39614736Sthien     struct nl *typ;
39714736Sthien     int val;
398760Speter {
399760Speter 	register struct nl *p;
400760Speter 
401760Speter #ifndef PI1
402760Speter 	if (sym)
40314736Sthien 		(void) hash(sym, 0);
404760Speter #endif
405760Speter 	p = defnl(sym, cls, typ, val);
406760Speter 	if (sym)
40714736Sthien 		(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) {
42314736Sthien 		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 
43414736Sthien #ifndef PC
43514736Sthien #ifndef OBJ
436760Speter char	*VARIABLE	= "variable";
43714736Sthien #endif PC
43814736Sthien #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 
46814736Sthien #ifndef PC
46914736Sthien #ifndef OBJ
470760Speter char	*snark	= "SNARK";
47114736Sthien #endif
47214736Sthien #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",
50215973Smckusick 	"FFUNC",
50315973Smckusick 	"CRANGE"
504760Speter };
505760Speter 
506760Speter char	*stars	= "\t***";
507760Speter 
508760Speter /*
509760Speter  * Dump the namelist from the
510760Speter  * current nlp down to 'to'.
511760Speter  * All the namelist is dumped if
512760Speter  * to is NIL.
513760Speter  */
51414736Sthien /*VARARGS*/
515760Speter dumpnl(to, rout)
516760Speter 	struct nl *to;
517760Speter {
518760Speter 	register struct nl *p;
519760Speter 	struct nls *nlsp;
52014736Sthien 	int v, head;
521760Speter 
522760Speter 	if (opt('y') == 0)
523760Speter 		return;
524760Speter 	if (to != NIL)
525760Speter 		printf("\n\"%s\" Block=%d\n", rout, cbn);
526760Speter 	nlsp = nlact;
527760Speter 	head = NIL;
528760Speter 	for (p = nlp; p != to;) {
529760Speter 		if (p == nlsp->nls_low) {
530760Speter 			if (nlsp == &ntab[0])
531760Speter 				break;
532760Speter 			nlsp--;
533760Speter 			p = nlsp->nls_high;
534760Speter 		}
535760Speter 		p--;
536760Speter 		if (head == NIL) {
537760Speter 			printf("\tName\tClass  Bn+Flags\tType\tVal\tChn\n");
538760Speter 			head++;
539760Speter 		}
540760Speter 		printf("%3d:", nloff(p));
541760Speter 		if (p->symbol)
542760Speter 			printf("\t%.7s", p->symbol);
543760Speter 		else
544760Speter 			printf(stars);
545760Speter 		if (p->class)
546760Speter 			printf("\t%s", ctext[p->class]);
547760Speter 		else
548760Speter 			printf(stars);
549760Speter 		if (p->nl_flags) {
550760Speter 			pchr('\t');
551760Speter 			if (p->nl_flags & 037)
552760Speter 				printf("%d ", p->nl_flags & 037);
553760Speter #ifndef PI0
554760Speter 			if (p->nl_flags & NMOD)
555760Speter 				pchr('M');
556760Speter 			if (p->nl_flags & NUSED)
557760Speter 				pchr('U');
558760Speter #endif
559760Speter 			if (p->nl_flags & NFILES)
560760Speter 				pchr('F');
561760Speter 		} else
562760Speter 			printf(stars);
563760Speter 		if (p->type)
564760Speter 			printf("\t[%d]", nloff(p->type));
565760Speter 		else
566760Speter 			printf(stars);
567760Speter 		v = p->value[0];
568760Speter 		switch (p->class) {
569760Speter 			case TYPE:
570760Speter 				break;
571760Speter 			case VARNT:
572760Speter 				goto con;
573760Speter 			case CONST:
574760Speter 				switch (nloff(p->type)) {
575760Speter 					default:
576760Speter 						printf("\t%d", v);
577760Speter 						break;
578760Speter 					case TDOUBLE:
579760Speter 						printf("\t%f", p->real);
580760Speter 						break;
581760Speter 					case TINT:
582760Speter 					case T4INT:
583760Speter con:
584760Speter 						printf("\t%ld", p->range[0]);
585760Speter 						break;
586760Speter 					case TSTR:
587760Speter 						printf("\t'%s'", p->ptr[0]);
588760Speter 						break;
589760Speter 					}
590760Speter 				break;
591760Speter 			case VAR:
592760Speter 			case REF:
593760Speter 			case WITHPTR:
5941197Speter 			case FFUNC:
5951197Speter 			case FPROC:
596760Speter 				printf("\t%d,%d", cbn, v);
597760Speter 				break;
598760Speter 			case SCAL:
599760Speter 			case RANGE:
600760Speter 				printf("\t%ld..%ld", p->range[0], p->range[1]);
601760Speter 				break;
60215973Smckusick 			case CRANGE:
60315973Smckusick 				printf("\t%s..%s", p->nptr[0]->symbol,
60415973Smckusick 					p->nptr[1]->symbol);
60515973Smckusick 				break;
606760Speter 			case RECORD:
6078681Speter 				printf("\t%d", v);
608760Speter 				break;
609760Speter 			case FIELD:
610760Speter 				printf("\t%d", v);
611760Speter 				break;
612760Speter 			case STR:
613760Speter 				printf("\t|%d|", p->value[0]);
614760Speter 				break;
615760Speter 			case FVAR:
616760Speter 			case FUNC:
617760Speter 			case PROC:
618760Speter 			case PROG:
619760Speter 				if (cbn == 0) {
620760Speter 					printf("\t<%o>", p->value[0] & 0377);
621760Speter #ifndef PI0
622760Speter 					if (p->value[0] & NSTAND)
623760Speter 						printf("\tNSTAND");
624760Speter #endif
625760Speter 					break;
626760Speter 				}
627760Speter 				v = p->value[1];
628760Speter 			default:
62914736Sthien 
630760Speter 				if (v)
631760Speter 					printf("\t<%d>", v);
632760Speter 				else
633760Speter 					printf(stars);
634760Speter 		}
635760Speter 		if (p->chain)
636760Speter 			printf("\t[%d]", nloff(p->chain));
637760Speter 		switch (p->class) {
638760Speter 			case RECORD:
6398681Speter 				printf("\tALIGN=%d", p->align_info);
6408681Speter 				if (p->ptr[NL_FIELDLIST]) {
6418681Speter 				    printf(" FLIST=[%d]",
6428681Speter 					nloff(p->ptr[NL_FIELDLIST]));
6438681Speter 				} else {
6448681Speter 				    printf(" FLIST=[]");
6458681Speter 				}
6468681Speter 				if (p->ptr[NL_TAG]) {
6478681Speter 				    printf(" TAG=[%d]",
6488681Speter 					nloff(p->ptr[NL_TAG]));
6498681Speter 				} else {
6508681Speter 				    printf(" TAG=[]");
6518681Speter 				}
6528681Speter 				if (p->ptr[NL_VARNT]) {
6538681Speter 				    printf(" VARNT=[%d]",
6548681Speter 					nloff(p->ptr[NL_VARNT]));
6558681Speter 				} else {
6568681Speter 				    printf(" VARNT=[]");
6578681Speter 				}
658760Speter 				break;
6598681Speter 			case FIELD:
6608681Speter 				if (p->ptr[NL_FIELDLIST]) {
6618681Speter 				    printf("\tFLIST=[%d]",
6628681Speter 					nloff(p->ptr[NL_FIELDLIST]));
6638681Speter 				} else {
6648681Speter 				    printf("\tFLIST=[]");
6658681Speter 				}
6668681Speter 				break;
667760Speter 			case VARNT:
6688681Speter 				printf("\tVTOREC=[%d]",
6698681Speter 				    nloff(p->ptr[NL_VTOREC]));
670760Speter 				break;
671760Speter 		}
6723828Speter #		ifdef PC
6733828Speter 		    if ( p -> extra_flags != 0 ) {
6743828Speter 			pchr( '\t' );
6753828Speter 			if ( p -> extra_flags & NEXTERN )
6763828Speter 			    printf( "NEXTERN " );
6773828Speter 			if ( p -> extra_flags & NLOCAL )
6783828Speter 			    printf( "NLOCAL " );
6793828Speter 			if ( p -> extra_flags & NPARAM )
6803828Speter 			    printf( "NPARAM " );
6813828Speter 			if ( p -> extra_flags & NGLOBAL )
6823828Speter 			    printf( "NGLOBAL " );
6833828Speter 			if ( p -> extra_flags & NREGVAR )
6843828Speter 			    printf( "NREGVAR " );
6853828Speter 		    }
6863828Speter #		endif PC
687760Speter #		ifdef PTREE
688760Speter 		    pchr( '\t' );
689760Speter 		    pPrintPointer( stdout , "%s" , p -> inTree );
690760Speter #		endif
691760Speter 		pchr('\n');
692760Speter 	}
693760Speter 	if (head == 0)
694760Speter 		printf("\tNo entries\n");
695760Speter }
696760Speter #endif
697760Speter 
698760Speter 
699760Speter /*
700760Speter  * Define a new name list entry
701760Speter  * with initial symbol, class, type
702760Speter  * and value[0] as given.  A new name
703760Speter  * list segment is allocated to hold
704760Speter  * the next name list slot if necessary.
705760Speter  */
706760Speter struct nl *
707760Speter defnl(sym, cls, typ, val)
708760Speter 	char *sym;
709760Speter 	int cls;
710760Speter 	struct nl *typ;
711760Speter 	int val;
712760Speter {
713760Speter 	register struct nl *p;
714760Speter 	register int *q, i;
715760Speter 	char *cp;
716760Speter 
717760Speter 	p = nlp;
718760Speter 
719760Speter 	/*
720760Speter 	 * Zero out this entry
721760Speter 	 */
72214736Sthien 	q = ((int *) p);
723760Speter 	i = (sizeof *p)/(sizeof (int));
724760Speter 	do
725760Speter 		*q++ = 0;
726760Speter 	while (--i);
727760Speter 
728760Speter 	/*
729760Speter 	 * Insert the values
730760Speter 	 */
731760Speter 	p->symbol = sym;
732760Speter 	p->class = cls;
733760Speter 	p->type = typ;
734760Speter 	p->nl_block = cbn;
735760Speter 	p->value[0] = val;
736760Speter 
737760Speter 	/*
738760Speter 	 * Insure that the next namelist
739760Speter 	 * entry actually exists. This is
740760Speter 	 * really not needed here, it would
741760Speter 	 * suffice to do it at entry if we
742760Speter 	 * need the slot.  It is done this
743760Speter 	 * way because, historically, nlp
744760Speter 	 * always pointed at the next namelist
745760Speter 	 * slot.
746760Speter 	 */
747760Speter 	nlp++;
748760Speter 	if (nlp >= nlact->nls_high) {
749760Speter 		i = NLINC;
75014736Sthien 		cp = (char *) malloc(NLINC * sizeof *nlp);
7511834Speter 		if (cp == 0) {
752760Speter 			i = NLINC / 2;
75314736Sthien 			cp = (char *) malloc((NLINC / 2) * sizeof *nlp);
754760Speter 		}
7551834Speter 		if (cp == 0) {
756760Speter 			error("Ran out of memory (defnl)");
757760Speter 			pexit(DIED);
758760Speter 		}
759760Speter 		nlact++;
760760Speter 		if (nlact >= &ntab[MAXNL]) {
761760Speter 			error("Ran out of name list tables");
762760Speter 			pexit(DIED);
763760Speter 		}
76414736Sthien 		nlp = (struct nl *) cp;
765760Speter 		nlact->nls_low = nlp;
766760Speter 		nlact->nls_high = nlact->nls_low + i;
767760Speter 	}
768760Speter 	return (p);
769760Speter }
770760Speter 
771760Speter /*
772760Speter  * Make a duplicate of the argument
773760Speter  * namelist entry for, e.g., type
774760Speter  * declarations of the form 'type a = b'
775760Speter  * and array indicies.
776760Speter  */
777760Speter struct nl *
778760Speter nlcopy(p)
779760Speter 	struct nl *p;
780760Speter {
78114736Sthien 	register struct nl *p1, *p2;
782760Speter 
783760Speter 	p1 = p;
784*16272Speter 	p2 = defnl((char *) 0, 0, NLNIL, 0);
785*16272Speter 	*p2 = *p1;
786*16272Speter 	p2->chain = NLNIL;
787*16272Speter 	return (p2);
788760Speter }
789760Speter 
790760Speter /*
791760Speter  * Compute a namelist offset
792760Speter  */
793760Speter nloff(p)
794760Speter 	struct nl *p;
795760Speter {
796760Speter 
797760Speter 	return (p - nl);
798760Speter }
799760Speter 
800760Speter /*
801760Speter  * Enter a symbol into the block
802760Speter  * symbol table.  Symbols are hashed
803760Speter  * 64 ways based on low 6 bits of the
804760Speter  * character pointer into the string
805760Speter  * table.
806760Speter  */
807760Speter struct nl *
808760Speter enter(np)
809760Speter 	struct nl *np;
810760Speter {
811760Speter 	register struct nl *rp, *hp;
812760Speter 	register struct nl *p;
813760Speter 	int i;
814760Speter 
815760Speter 	rp = np;
816760Speter 	if (rp == NIL)
817760Speter 		return (NIL);
818760Speter #ifndef PI1
819760Speter 	if (cbn > 0)
820760Speter 		if (rp->symbol == input->symbol || rp->symbol == output->symbol)
821760Speter 			error("Pre-defined files input and output must not be redefined");
822760Speter #endif
82314736Sthien 	i = (int) rp->symbol;
824760Speter 	i &= 077;
825760Speter 	hp = disptab[i];
826760Speter 	if (rp->class != BADUSE && rp->class != FIELD)
827760Speter 	for (p = hp; p != NIL && (p->nl_block & 037) == cbn; p = p->nl_next)
82815973Smckusick 		if (p->symbol == rp->symbol && p->symbol != NIL &&
82915973Smckusick 		    p->class != BADUSE && p->class != FIELD) {
830760Speter #ifndef PI1
831760Speter 			error("%s is already defined in this block", rp->symbol);
832760Speter #endif
833760Speter 			break;
834760Speter 
835760Speter 		}
836760Speter 	rp->nl_next = hp;
837760Speter 	disptab[i] = rp;
838760Speter 	return (rp);
839760Speter }
840760Speter #endif
841