xref: /csrg-svn/usr.bin/pascal/src/nl.c (revision 760)
1*760Speter /* Copyright (c) 1979 Regents of the University of California */
2*760Speter 
3*760Speter static	char sccsid[] = "@(#)nl.c 1.1 08/27/80";
4*760Speter 
5*760Speter #include "whoami.h"
6*760Speter #include "0.h"
7*760Speter #include "opcode.h"
8*760Speter #include "objfmt.h"
9*760Speter 
10*760Speter /*
11*760Speter  * NAMELIST SEGMENT DEFINITIONS
12*760Speter  */
13*760Speter struct nls {
14*760Speter 	struct nl *nls_low;
15*760Speter 	struct nl *nls_high;
16*760Speter } ntab[MAXNL], *nlact;
17*760Speter 
18*760Speter struct	nl nl[INL];
19*760Speter struct	nl *nlp = nl;
20*760Speter struct	nls *nlact = ntab;
21*760Speter 
22*760Speter     /*
23*760Speter      *	all these strings must be places where people can find them
24*760Speter      *	since lookup only looks at the string pointer, not the chars.
25*760Speter      *	see, for example, pTreeInit.
26*760Speter      */
27*760Speter 
28*760Speter     /*
29*760Speter      *	built in constants
30*760Speter      */
31*760Speter char	*in_consts[] = {
32*760Speter 	    "true" ,
33*760Speter 	    "false" ,
34*760Speter 	    "TRUE",
35*760Speter 	    "FALSE",
36*760Speter 	    "minint" ,
37*760Speter 	    "maxint" ,
38*760Speter 	    "minchar" ,
39*760Speter 	    "maxchar" ,
40*760Speter 	    "bell" ,
41*760Speter 	    "tab" ,
42*760Speter 	    0
43*760Speter 	};
44*760Speter 
45*760Speter     /*
46*760Speter      *	built in simple types
47*760Speter      */
48*760Speter char *in_types[] =
49*760Speter     {
50*760Speter 	"boolean",
51*760Speter 	"char",
52*760Speter 	"integer",
53*760Speter 	"real",
54*760Speter 	"_nil",		/* dummy name */
55*760Speter 	0
56*760Speter     };
57*760Speter 
58*760Speter int in_rclasses[] =
59*760Speter     {
60*760Speter 	TINT ,
61*760Speter 	TINT ,
62*760Speter 	TINT ,
63*760Speter 	TCHAR ,
64*760Speter 	TBOOL ,
65*760Speter 	TDOUBLE ,
66*760Speter 	0
67*760Speter     };
68*760Speter 
69*760Speter long in_ranges[] =
70*760Speter     {
71*760Speter 	-128L	 , 128L ,
72*760Speter 	-32768L	 , 32767L ,
73*760Speter 	-2147483648L , 2147483647L ,
74*760Speter 	0L		 , 127L ,
75*760Speter 	0L		 , 1L ,
76*760Speter 	0L		 , 0L 		/* fake for reals */
77*760Speter     };
78*760Speter 
79*760Speter     /*
80*760Speter      *	built in constructed types
81*760Speter      */
82*760Speter char	*in_ctypes[] = {
83*760Speter 	    "Boolean" ,
84*760Speter 	    "intset" ,
85*760Speter 	    "alfa" ,
86*760Speter 	    "text" ,
87*760Speter 	    0
88*760Speter 	};
89*760Speter 
90*760Speter     /*
91*760Speter      *	built in variables
92*760Speter      */
93*760Speter char	*in_vars[] = {
94*760Speter 	    "input" ,
95*760Speter 	    "output" ,
96*760Speter 	    0
97*760Speter 	};
98*760Speter 
99*760Speter     /*
100*760Speter      *	built in functions
101*760Speter      */
102*760Speter char *in_funcs[] =
103*760Speter     {
104*760Speter 	"abs" ,
105*760Speter 	"arctan" ,
106*760Speter 	"card" ,
107*760Speter 	"chr" ,
108*760Speter 	"clock" ,
109*760Speter 	"cos" ,
110*760Speter 	"eof" ,
111*760Speter 	"eoln" ,
112*760Speter 	"eos" ,
113*760Speter 	"exp" ,
114*760Speter 	"expo" ,
115*760Speter 	"ln" ,
116*760Speter 	"odd" ,
117*760Speter 	"ord" ,
118*760Speter 	"pred" ,
119*760Speter 	"round" ,
120*760Speter 	"sin" ,
121*760Speter 	"sqr" ,
122*760Speter 	"sqrt" ,
123*760Speter 	"succ" ,
124*760Speter 	"trunc" ,
125*760Speter 	"undefined" ,
126*760Speter 	/*
127*760Speter 	 * Extensions
128*760Speter 	 */
129*760Speter 	"argc" ,
130*760Speter 	"random" ,
131*760Speter 	"seed" ,
132*760Speter 	"wallclock" ,
133*760Speter 	"sysclock" ,
134*760Speter 	0
135*760Speter     };
136*760Speter 
137*760Speter 	/*
138*760Speter 	 * Built-in procedures
139*760Speter 	 */
140*760Speter char *in_procs[] =
141*760Speter     {
142*760Speter 	"date" ,
143*760Speter 	"dispose" ,
144*760Speter 	"flush" ,
145*760Speter 	"get" ,
146*760Speter 	"getseg" ,
147*760Speter 	"halt" ,
148*760Speter 	"linelimit" ,
149*760Speter 	"message" ,
150*760Speter 	"new" ,
151*760Speter 	"pack" ,
152*760Speter 	"page" ,
153*760Speter 	"put" ,
154*760Speter 	"putseg" ,
155*760Speter 	"read" ,
156*760Speter 	"readln" ,
157*760Speter 	"remove" ,
158*760Speter 	"reset" ,
159*760Speter 	"rewrite" ,
160*760Speter 	"time" ,
161*760Speter 	"unpack" ,
162*760Speter 	"write" ,
163*760Speter 	"writeln" ,
164*760Speter 	/*
165*760Speter 	 * Extensions
166*760Speter 	 */
167*760Speter 	"argv" ,
168*760Speter 	"null" ,
169*760Speter 	"stlimit" ,
170*760Speter 	0
171*760Speter     };
172*760Speter 
173*760Speter #ifndef PI0
174*760Speter     /*
175*760Speter      *	and their opcodes
176*760Speter      */
177*760Speter int in_fops[] =
178*760Speter     {
179*760Speter 	O_ABS2,
180*760Speter 	O_ATAN,
181*760Speter 	O_CARD|NSTAND,
182*760Speter 	O_CHR2,
183*760Speter 	O_CLCK|NSTAND,
184*760Speter 	O_COS,
185*760Speter 	O_EOF,
186*760Speter 	O_EOLN,
187*760Speter 	0,
188*760Speter 	O_EXP,
189*760Speter 	O_EXPO|NSTAND,
190*760Speter 	O_LN,
191*760Speter 	O_ODD2,
192*760Speter 	O_ORD2,
193*760Speter 	O_PRED2,
194*760Speter 	O_ROUND,
195*760Speter 	O_SIN,
196*760Speter 	O_SQR2,
197*760Speter 	O_SQRT,
198*760Speter 	O_SUCC2,
199*760Speter 	O_TRUNC,
200*760Speter 	O_UNDEF|NSTAND,
201*760Speter 	/*
202*760Speter 	 * Extensions
203*760Speter 	 */
204*760Speter 	O_ARGC|NSTAND,
205*760Speter 	O_RANDOM|NSTAND,
206*760Speter 	O_SEED|NSTAND,
207*760Speter 	O_WCLCK|NSTAND,
208*760Speter 	O_SCLCK|NSTAND
209*760Speter     };
210*760Speter 
211*760Speter     /*
212*760Speter      * Built-in procedures
213*760Speter      */
214*760Speter int in_pops[] =
215*760Speter     {
216*760Speter 	O_DATE|NSTAND,
217*760Speter 	O_DISPOSE,
218*760Speter 	O_FLUSH|NSTAND,
219*760Speter 	O_GET,
220*760Speter 	0,
221*760Speter 	O_HALT|NSTAND,
222*760Speter 	O_LLIMIT|NSTAND,
223*760Speter 	O_MESSAGE|NSTAND,
224*760Speter 	O_NEW,
225*760Speter 	O_PACK,
226*760Speter 	O_PAGE,
227*760Speter 	O_PUT,
228*760Speter 	0,
229*760Speter 	O_READ4,
230*760Speter 	O_READLN,
231*760Speter 	O_REMOVE|NSTAND,
232*760Speter 	O_RESET,
233*760Speter 	O_REWRITE,
234*760Speter 	O_TIME|NSTAND,
235*760Speter 	O_UNPACK,
236*760Speter 	O_WRITEF,
237*760Speter 	O_WRITLN,
238*760Speter 	/*
239*760Speter 	 * Extensions
240*760Speter 	 */
241*760Speter 	O_ARGV|NSTAND,
242*760Speter 	O_ABORT|NSTAND,
243*760Speter 	O_STLIM|NSTAND
244*760Speter     };
245*760Speter #endif
246*760Speter 
247*760Speter /*
248*760Speter  * Initnl initializes the first namelist segment and then
249*760Speter  * initializes the name list for block 0.
250*760Speter  */
251*760Speter initnl()
252*760Speter     {
253*760Speter 	register char		**cp;
254*760Speter 	register struct nl	*np;
255*760Speter 	struct nl		*fp;
256*760Speter 	int			*ip;
257*760Speter 	long			*lp;
258*760Speter 
259*760Speter #ifdef	DEBUG
260*760Speter 	if ( hp21mx )
261*760Speter 	    {
262*760Speter 		MININT = -32768.;
263*760Speter 		MAXINT = 32767.;
264*760Speter #ifndef	PI0
265*760Speter 		genmx();
266*760Speter #endif
267*760Speter 	    }
268*760Speter #endif
269*760Speter 	ntab[0].nls_low = nl;
270*760Speter 	ntab[0].nls_high = &nl[INL];
271*760Speter 	defnl ( 0 , 0 , 0 , 0 );
272*760Speter 
273*760Speter 	/*
274*760Speter 	 *	Types
275*760Speter 	 */
276*760Speter 	for ( cp = in_types ; *cp != 0 ; cp ++ )
277*760Speter 	    hdefnl ( *cp , TYPE , nlp , 0 );
278*760Speter 
279*760Speter 	/*
280*760Speter 	 *	Ranges
281*760Speter 	 */
282*760Speter 	lp = in_ranges;
283*760Speter 	for ( ip = in_rclasses ; *ip != 0 ; ip ++ )
284*760Speter 	    {
285*760Speter 		np = defnl ( 0 , RANGE , nl+(*ip) , 0 );
286*760Speter 		nl[*ip].type = np;
287*760Speter 		np -> range[0] = *lp ++ ;
288*760Speter 		np -> range[1] = *lp ++ ;
289*760Speter 
290*760Speter 	    };
291*760Speter 
292*760Speter 	/*
293*760Speter 	 *	built in constructed types
294*760Speter 	 */
295*760Speter 
296*760Speter 	cp = in_ctypes;
297*760Speter 	/*
298*760Speter 	 *	Boolean = boolean;
299*760Speter 	 */
300*760Speter 	hdefnl ( *cp++ , TYPE , nl+T1BOOL , 0 );
301*760Speter 
302*760Speter 	/*
303*760Speter 	 *	intset = set of 0 .. 127;
304*760Speter 	 */
305*760Speter 	intset = *cp++;
306*760Speter 	hdefnl( intset , TYPE , nlp+1 , 0 );
307*760Speter 	defnl ( 0 , SET , nlp+1 , 0 );
308*760Speter 	np = defnl ( 0 , RANGE , nl+TINT , 0 );
309*760Speter 	np -> range[0] = 0L;
310*760Speter 	np -> range[1] = 127L;
311*760Speter 
312*760Speter 	/*
313*760Speter 	 *	alfa = array [ 1 .. 10 ] of char;
314*760Speter 	 */
315*760Speter 	np = defnl ( 0 , RANGE , nl+TINT , 0 );
316*760Speter 	np -> range[0] = 1L;
317*760Speter 	np -> range[1] = 10L;
318*760Speter 	defnl ( 0 , ARRAY , nl+T1CHAR , 1 ) -> chain = np;
319*760Speter 	hdefnl ( *cp++ , TYPE , nlp-1 , 0 );
320*760Speter 
321*760Speter 	/*
322*760Speter 	 *	text = file of char;
323*760Speter 	 */
324*760Speter 	hdefnl ( *cp++ , TYPE , nlp+1 , 0 );
325*760Speter 	np = defnl ( 0 , FILET , nl+T1CHAR , 0 );
326*760Speter 	np -> nl_flags |= NFILES;
327*760Speter 
328*760Speter 	/*
329*760Speter 	 *	input,output : text;
330*760Speter 	 */
331*760Speter 	cp = in_vars;
332*760Speter #	ifndef	PI0
333*760Speter 		input = hdefnl ( *cp++ , VAR , np , INPUT_OFF );
334*760Speter 		output = hdefnl (  *cp++ , VAR , np , OUTPUT_OFF );
335*760Speter #	else
336*760Speter 		input = hdefnl ( *cp++ , VAR , np , 0 );
337*760Speter 		output = hdefnl ( *cp++ , VAR , np , 0 );
338*760Speter #	endif
339*760Speter 
340*760Speter 	/*
341*760Speter 	 *	built in constants
342*760Speter 	 */
343*760Speter 	cp = in_consts;
344*760Speter 	np = hdefnl ( *cp++ , CONST , nl + TBOOL , 1 );
345*760Speter 	fp = hdefnl ( *cp++ , CONST , nl + TBOOL , 0 );
346*760Speter 	(nl + TBOOL)->chain = fp;
347*760Speter 	fp->chain = np;
348*760Speter 	np = hdefnl ( *cp++ , CONST , nl + TBOOL , 1 );
349*760Speter 	fp = hdefnl ( *cp++ , CONST , nl + TBOOL , 0 );
350*760Speter 	fp->chain = np;
351*760Speter 	if (opt('s'))
352*760Speter 		(nl + TBOOL)->chain = fp;
353*760Speter 	hdefnl ( *cp++ , CONST , nl + T4INT , 0 ) -> range[0] = MININT;
354*760Speter 	hdefnl ( *cp++ , CONST , nl + T4INT , 0 ) -> range[0] = MAXINT;
355*760Speter 	hdefnl ( *cp++ , CONST , nl + T1CHAR , 0 );
356*760Speter 	hdefnl ( *cp++ , CONST , nl + T1CHAR , 127 );
357*760Speter 	hdefnl ( *cp++ , CONST , nl + T1CHAR , '\007' );
358*760Speter 	hdefnl ( *cp++ , CONST , nl + T1CHAR , '\t' );
359*760Speter 
360*760Speter 	/*
361*760Speter 	 * Built-in functions and procedures
362*760Speter 	 */
363*760Speter #ifndef PI0
364*760Speter 	ip = in_fops;
365*760Speter 	for ( cp = in_funcs ; *cp != 0 ; cp ++ )
366*760Speter 	    hdefnl ( *cp , FUNC , 0 , * ip ++ );
367*760Speter 	ip = in_pops;
368*760Speter 	for ( cp = in_procs ; *cp != 0 ; cp ++ )
369*760Speter 	    hdefnl ( *cp , PROC , 0 , * ip ++ );
370*760Speter #else
371*760Speter 	for ( cp = in_funcs ; *cp != 0 ; cp ++ )
372*760Speter 	    hdefnl ( *cp , FUNC , 0 , 0 );
373*760Speter 	for ( cp = in_procs ; *cp != 0 , cp ++ )
374*760Speter 	    hdefnl ( *cp , PROC , 0 , 0 );
375*760Speter #endif
376*760Speter #	ifdef PTREE
377*760Speter 	    pTreeInit();
378*760Speter #	endif
379*760Speter     }
380*760Speter 
381*760Speter struct nl *
382*760Speter hdefnl(sym, cls, typ, val)
383*760Speter {
384*760Speter 	register struct nl *p;
385*760Speter 
386*760Speter #ifndef PI1
387*760Speter 	if (sym)
388*760Speter 		hash(sym, 0);
389*760Speter #endif
390*760Speter 	p = defnl(sym, cls, typ, val);
391*760Speter 	if (sym)
392*760Speter 		enter(p);
393*760Speter 	return (p);
394*760Speter }
395*760Speter 
396*760Speter /*
397*760Speter  * Free up the name list segments
398*760Speter  * at the end of a statement/proc/func
399*760Speter  * All segments are freed down to the one in which
400*760Speter  * p points.
401*760Speter  */
402*760Speter nlfree(p)
403*760Speter 	struct nl *p;
404*760Speter {
405*760Speter 
406*760Speter 	nlp = p;
407*760Speter 	while (nlact->nls_low > nlp || nlact->nls_high < nlp) {
408*760Speter 		free(nlact->nls_low);
409*760Speter 		nlact->nls_low = NIL;
410*760Speter 		nlact->nls_high = NIL;
411*760Speter 		--nlact;
412*760Speter 		if (nlact < &ntab[0])
413*760Speter 			panic("nlfree");
414*760Speter 	}
415*760Speter }
416*760Speter 
417*760Speter 
418*760Speter char	*VARIABLE	= "variable";
419*760Speter 
420*760Speter char	*classes[ ] = {
421*760Speter 	"undefined",
422*760Speter 	"constant",
423*760Speter 	"type",
424*760Speter 	"variable",	/*	VARIABLE	*/
425*760Speter 	"array",
426*760Speter 	"pointer or file",
427*760Speter 	"record",
428*760Speter 	"field",
429*760Speter 	"procedure",
430*760Speter 	"function",
431*760Speter 	"variable",	/*	VARIABLE	*/
432*760Speter 	"variable",	/*	VARIABLE	*/
433*760Speter 	"pointer",
434*760Speter 	"file",
435*760Speter 	"set",
436*760Speter 	"subrange",
437*760Speter 	"label",
438*760Speter 	"withptr",
439*760Speter 	"scalar",
440*760Speter 	"string",
441*760Speter 	"program",
442*760Speter 	"improper"
443*760Speter #ifdef DEBUG
444*760Speter 	,"variant"
445*760Speter #endif
446*760Speter };
447*760Speter 
448*760Speter char	*snark	= "SNARK";
449*760Speter 
450*760Speter #ifdef PI
451*760Speter #ifdef DEBUG
452*760Speter char	*ctext[] =
453*760Speter {
454*760Speter 	"BADUSE",
455*760Speter 	"CONST",
456*760Speter 	"TYPE",
457*760Speter 	"VAR",
458*760Speter 	"ARRAY",
459*760Speter 	"PTRFILE",
460*760Speter 	"RECORD",
461*760Speter 	"FIELD",
462*760Speter 	"PROC",
463*760Speter 	"FUNC",
464*760Speter 	"FVAR",
465*760Speter 	"REF",
466*760Speter 	"PTR",
467*760Speter 	"FILET",
468*760Speter 	"SET",
469*760Speter 	"RANGE",
470*760Speter 	"LABEL",
471*760Speter 	"WITHPTR",
472*760Speter 	"SCAL",
473*760Speter 	"STR",
474*760Speter 	"PROG",
475*760Speter 	"IMPROPER",
476*760Speter 	"VARNT"
477*760Speter };
478*760Speter 
479*760Speter char	*stars	= "\t***";
480*760Speter 
481*760Speter /*
482*760Speter  * Dump the namelist from the
483*760Speter  * current nlp down to 'to'.
484*760Speter  * All the namelist is dumped if
485*760Speter  * to is NIL.
486*760Speter  */
487*760Speter dumpnl(to, rout)
488*760Speter 	struct nl *to;
489*760Speter {
490*760Speter 	register struct nl *p;
491*760Speter 	register int j;
492*760Speter 	struct nls *nlsp;
493*760Speter 	int i, v, head;
494*760Speter 
495*760Speter 	if (opt('y') == 0)
496*760Speter 		return;
497*760Speter 	if (to != NIL)
498*760Speter 		printf("\n\"%s\" Block=%d\n", rout, cbn);
499*760Speter 	nlsp = nlact;
500*760Speter 	head = NIL;
501*760Speter 	for (p = nlp; p != to;) {
502*760Speter 		if (p == nlsp->nls_low) {
503*760Speter 			if (nlsp == &ntab[0])
504*760Speter 				break;
505*760Speter 			nlsp--;
506*760Speter 			p = nlsp->nls_high;
507*760Speter 		}
508*760Speter 		p--;
509*760Speter 		if (head == NIL) {
510*760Speter 			printf("\tName\tClass  Bn+Flags\tType\tVal\tChn\n");
511*760Speter 			head++;
512*760Speter 		}
513*760Speter 		printf("%3d:", nloff(p));
514*760Speter 		if (p->symbol)
515*760Speter 			printf("\t%.7s", p->symbol);
516*760Speter 		else
517*760Speter 			printf(stars);
518*760Speter 		if (p->class)
519*760Speter 			printf("\t%s", ctext[p->class]);
520*760Speter 		else
521*760Speter 			printf(stars);
522*760Speter 		if (p->nl_flags) {
523*760Speter 			pchr('\t');
524*760Speter 			if (p->nl_flags & 037)
525*760Speter 				printf("%d ", p->nl_flags & 037);
526*760Speter #ifndef PI0
527*760Speter 			if (p->nl_flags & NMOD)
528*760Speter 				pchr('M');
529*760Speter 			if (p->nl_flags & NUSED)
530*760Speter 				pchr('U');
531*760Speter #endif
532*760Speter 			if (p->nl_flags & NFILES)
533*760Speter 				pchr('F');
534*760Speter 		} else
535*760Speter 			printf(stars);
536*760Speter 		if (p->type)
537*760Speter 			printf("\t[%d]", nloff(p->type));
538*760Speter 		else
539*760Speter 			printf(stars);
540*760Speter 		v = p->value[0];
541*760Speter 		switch (p->class) {
542*760Speter 			case TYPE:
543*760Speter 				break;
544*760Speter 			case VARNT:
545*760Speter 				goto con;
546*760Speter 			case CONST:
547*760Speter 				switch (nloff(p->type)) {
548*760Speter 					default:
549*760Speter 						printf("\t%d", v);
550*760Speter 						break;
551*760Speter 					case TDOUBLE:
552*760Speter 						printf("\t%f", p->real);
553*760Speter 						break;
554*760Speter 					case TINT:
555*760Speter 					case T4INT:
556*760Speter con:
557*760Speter 						printf("\t%ld", p->range[0]);
558*760Speter 						break;
559*760Speter 					case TSTR:
560*760Speter 						printf("\t'%s'", p->ptr[0]);
561*760Speter 						break;
562*760Speter 					}
563*760Speter 				break;
564*760Speter 			case VAR:
565*760Speter 			case REF:
566*760Speter 			case WITHPTR:
567*760Speter 				printf("\t%d,%d", cbn, v);
568*760Speter 				break;
569*760Speter 			case SCAL:
570*760Speter 			case RANGE:
571*760Speter 				printf("\t%ld..%ld", p->range[0], p->range[1]);
572*760Speter 				break;
573*760Speter 			case RECORD:
574*760Speter 				printf("\t%d(%d)", v, p->value[NL_FLDSZ]);
575*760Speter 				break;
576*760Speter 			case FIELD:
577*760Speter 				printf("\t%d", v);
578*760Speter 				break;
579*760Speter 			case STR:
580*760Speter 				printf("\t|%d|", p->value[0]);
581*760Speter 				break;
582*760Speter 			case FVAR:
583*760Speter 			case FUNC:
584*760Speter 			case PROC:
585*760Speter 			case PROG:
586*760Speter 				if (cbn == 0) {
587*760Speter 					printf("\t<%o>", p->value[0] & 0377);
588*760Speter #ifndef PI0
589*760Speter 					if (p->value[0] & NSTAND)
590*760Speter 						printf("\tNSTAND");
591*760Speter #endif
592*760Speter 					break;
593*760Speter 				}
594*760Speter 				v = p->value[1];
595*760Speter 			default:
596*760Speter casedef:
597*760Speter 				if (v)
598*760Speter 					printf("\t<%d>", v);
599*760Speter 				else
600*760Speter 					printf(stars);
601*760Speter 		}
602*760Speter 		if (p->chain)
603*760Speter 			printf("\t[%d]", nloff(p->chain));
604*760Speter 		switch (p->class) {
605*760Speter 			case RECORD:
606*760Speter 				if (p->ptr[NL_VARNT])
607*760Speter 					printf("\tVARNT=[%d]", nloff(p->ptr[NL_VARNT]));
608*760Speter 				if (p->ptr[NL_TAG])
609*760Speter 					printf(" TAG=[%d]", nloff(p->ptr[NL_TAG]));
610*760Speter 				break;
611*760Speter 			case VARNT:
612*760Speter 				printf("\tVTOREC=[%d]", nloff(p->ptr[NL_VTOREC]));
613*760Speter 				break;
614*760Speter 		}
615*760Speter #		ifdef PTREE
616*760Speter 		    pchr( '\t' );
617*760Speter 		    pPrintPointer( stdout , "%s" , p -> inTree );
618*760Speter #		endif
619*760Speter 		pchr('\n');
620*760Speter 	}
621*760Speter 	if (head == 0)
622*760Speter 		printf("\tNo entries\n");
623*760Speter }
624*760Speter #endif
625*760Speter 
626*760Speter 
627*760Speter /*
628*760Speter  * Define a new name list entry
629*760Speter  * with initial symbol, class, type
630*760Speter  * and value[0] as given.  A new name
631*760Speter  * list segment is allocated to hold
632*760Speter  * the next name list slot if necessary.
633*760Speter  */
634*760Speter struct nl *
635*760Speter defnl(sym, cls, typ, val)
636*760Speter 	char *sym;
637*760Speter 	int cls;
638*760Speter 	struct nl *typ;
639*760Speter 	int val;
640*760Speter {
641*760Speter 	register struct nl *p;
642*760Speter 	register int *q, i;
643*760Speter 	char *cp;
644*760Speter 
645*760Speter 	p = nlp;
646*760Speter 
647*760Speter 	/*
648*760Speter 	 * Zero out this entry
649*760Speter 	 */
650*760Speter 	q = p;
651*760Speter 	i = (sizeof *p)/(sizeof (int));
652*760Speter 	do
653*760Speter 		*q++ = 0;
654*760Speter 	while (--i);
655*760Speter 
656*760Speter 	/*
657*760Speter 	 * Insert the values
658*760Speter 	 */
659*760Speter 	p->symbol = sym;
660*760Speter 	p->class = cls;
661*760Speter 	p->type = typ;
662*760Speter 	p->nl_block = cbn;
663*760Speter 	p->value[0] = val;
664*760Speter 
665*760Speter 	/*
666*760Speter 	 * Insure that the next namelist
667*760Speter 	 * entry actually exists. This is
668*760Speter 	 * really not needed here, it would
669*760Speter 	 * suffice to do it at entry if we
670*760Speter 	 * need the slot.  It is done this
671*760Speter 	 * way because, historically, nlp
672*760Speter 	 * always pointed at the next namelist
673*760Speter 	 * slot.
674*760Speter 	 */
675*760Speter 	nlp++;
676*760Speter 	if (nlp >= nlact->nls_high) {
677*760Speter 		i = NLINC;
678*760Speter 		cp = malloc(NLINC * sizeof *nlp);
679*760Speter 		if (cp == -1) {
680*760Speter 			i = NLINC / 2;
681*760Speter 			cp = malloc((NLINC / 2) * sizeof *nlp);
682*760Speter 		}
683*760Speter 		if (cp == -1) {
684*760Speter 			error("Ran out of memory (defnl)");
685*760Speter 			pexit(DIED);
686*760Speter 		}
687*760Speter 		nlact++;
688*760Speter 		if (nlact >= &ntab[MAXNL]) {
689*760Speter 			error("Ran out of name list tables");
690*760Speter 			pexit(DIED);
691*760Speter 		}
692*760Speter 		nlp = cp;
693*760Speter 		nlact->nls_low = nlp;
694*760Speter 		nlact->nls_high = nlact->nls_low + i;
695*760Speter 	}
696*760Speter 	return (p);
697*760Speter }
698*760Speter 
699*760Speter /*
700*760Speter  * Make a duplicate of the argument
701*760Speter  * namelist entry for, e.g., type
702*760Speter  * declarations of the form 'type a = b'
703*760Speter  * and array indicies.
704*760Speter  */
705*760Speter struct nl *
706*760Speter nlcopy(p)
707*760Speter 	struct nl *p;
708*760Speter {
709*760Speter 	register int *p1, *p2, i;
710*760Speter 
711*760Speter 	p1 = p;
712*760Speter 	p = p2 = defnl(0, 0, 0, 0);
713*760Speter 	i = (sizeof *p)/(sizeof (int));
714*760Speter 	do
715*760Speter 		*p2++ = *p1++;
716*760Speter 	while (--i);
717*760Speter 	p->chain = NIL;
718*760Speter 	return (p);
719*760Speter }
720*760Speter 
721*760Speter /*
722*760Speter  * Compute a namelist offset
723*760Speter  */
724*760Speter nloff(p)
725*760Speter 	struct nl *p;
726*760Speter {
727*760Speter 
728*760Speter 	return (p - nl);
729*760Speter }
730*760Speter 
731*760Speter /*
732*760Speter  * Enter a symbol into the block
733*760Speter  * symbol table.  Symbols are hashed
734*760Speter  * 64 ways based on low 6 bits of the
735*760Speter  * character pointer into the string
736*760Speter  * table.
737*760Speter  */
738*760Speter struct nl *
739*760Speter enter(np)
740*760Speter 	struct nl *np;
741*760Speter {
742*760Speter 	register struct nl *rp, *hp;
743*760Speter 	register struct nl *p;
744*760Speter 	int i;
745*760Speter 
746*760Speter 	rp = np;
747*760Speter 	if (rp == NIL)
748*760Speter 		return (NIL);
749*760Speter #ifndef PI1
750*760Speter 	if (cbn > 0)
751*760Speter 		if (rp->symbol == input->symbol || rp->symbol == output->symbol)
752*760Speter 			error("Pre-defined files input and output must not be redefined");
753*760Speter #endif
754*760Speter 	i = rp->symbol;
755*760Speter 	i &= 077;
756*760Speter 	hp = disptab[i];
757*760Speter 	if (rp->class != BADUSE && rp->class != FIELD)
758*760Speter 	for (p = hp; p != NIL && (p->nl_block & 037) == cbn; p = p->nl_next)
759*760Speter 		if (p->symbol == rp->symbol && p->class != BADUSE && p->class != FIELD) {
760*760Speter #ifndef PI1
761*760Speter 			error("%s is already defined in this block", rp->symbol);
762*760Speter #endif
763*760Speter 			break;
764*760Speter 
765*760Speter 		}
766*760Speter 	rp->nl_next = hp;
767*760Speter 	disptab[i] = rp;
768*760Speter 	return (rp);
769*760Speter }
770*760Speter #endif
771