148116Sbostic /*-
2*62213Sbostic * Copyright (c) 1980, 1993
3*62213Sbostic * The Regents of the University of California. All rights reserved.
448116Sbostic *
548116Sbostic * %sccs.include.redist.c%
622178Sdist */
7760Speter
814736Sthien #ifndef lint
9*62213Sbostic static char sccsid[] = "@(#)nl.c 8.1 (Berkeley) 06/06/93";
1048116Sbostic #endif /* not lint */
11760Speter
12760Speter #include "whoami.h"
13760Speter #include "0.h"
1412854Speter #ifdef PI
15760Speter #include "opcode.h"
16760Speter #include "objfmt.h"
17760Speter
18760Speter /*
19760Speter * NAMELIST SEGMENT DEFINITIONS
20760Speter */
21760Speter struct nls {
22760Speter struct nl *nls_low;
23760Speter struct nl *nls_high;
24760Speter } ntab[MAXNL], *nlact;
25760Speter
26760Speter struct nl nl[INL];
27760Speter struct nl *nlp = nl;
28760Speter struct nls *nlact = ntab;
29760Speter
30760Speter /*
31760Speter * all these strings must be places where people can find them
32760Speter * since lookup only looks at the string pointer, not the chars.
33760Speter * see, for example, pTreeInit.
34760Speter */
35760Speter
36760Speter /*
37760Speter * built in constants
38760Speter */
39760Speter char *in_consts[] = {
40760Speter "true" ,
41760Speter "false" ,
42760Speter "TRUE",
43760Speter "FALSE",
44760Speter "minint" ,
45760Speter "maxint" ,
46760Speter "minchar" ,
47760Speter "maxchar" ,
48760Speter "bell" ,
49760Speter "tab" ,
50760Speter 0
51760Speter };
52760Speter
53760Speter /*
54760Speter * built in simple types
55760Speter */
56760Speter char *in_types[] =
57760Speter {
58760Speter "boolean",
59760Speter "char",
60760Speter "integer",
61760Speter "real",
62760Speter "_nil", /* dummy name */
63760Speter 0
64760Speter };
65760Speter
66760Speter int in_rclasses[] =
67760Speter {
68760Speter TINT ,
69760Speter TINT ,
70760Speter TINT ,
71760Speter TCHAR ,
72760Speter TBOOL ,
73760Speter TDOUBLE ,
74760Speter 0
75760Speter };
76760Speter
77760Speter long in_ranges[] =
78760Speter {
7910648Speter -128L , 127L ,
80760Speter -32768L , 32767L ,
81760Speter -2147483648L , 2147483647L ,
82760Speter 0L , 127L ,
83760Speter 0L , 1L ,
84760Speter 0L , 0L /* fake for reals */
85760Speter };
86760Speter
87760Speter /*
88760Speter * built in constructed types
89760Speter */
90760Speter char *in_ctypes[] = {
91760Speter "Boolean" ,
92760Speter "intset" ,
93760Speter "alfa" ,
94760Speter "text" ,
95760Speter 0
96760Speter };
97760Speter
98760Speter /*
99760Speter * built in variables
100760Speter */
101760Speter char *in_vars[] = {
102760Speter "input" ,
103760Speter "output" ,
104760Speter 0
105760Speter };
106760Speter
107760Speter /*
108760Speter * built in functions
109760Speter */
110760Speter char *in_funcs[] =
111760Speter {
112760Speter "abs" ,
113760Speter "arctan" ,
114760Speter "card" ,
115760Speter "chr" ,
116760Speter "clock" ,
117760Speter "cos" ,
118760Speter "eof" ,
119760Speter "eoln" ,
120760Speter "eos" ,
121760Speter "exp" ,
122760Speter "expo" ,
123760Speter "ln" ,
124760Speter "odd" ,
125760Speter "ord" ,
126760Speter "pred" ,
127760Speter "round" ,
128760Speter "sin" ,
129760Speter "sqr" ,
130760Speter "sqrt" ,
131760Speter "succ" ,
132760Speter "trunc" ,
133760Speter "undefined" ,
134760Speter /*
135760Speter * Extensions
136760Speter */
137760Speter "argc" ,
138760Speter "random" ,
139760Speter "seed" ,
140760Speter "wallclock" ,
141760Speter "sysclock" ,
142760Speter 0
143760Speter };
144760Speter
145760Speter /*
146760Speter * Built-in procedures
147760Speter */
148760Speter char *in_procs[] =
149760Speter {
1507927Smckusick "assert",
151760Speter "date" ,
152760Speter "dispose" ,
153760Speter "flush" ,
154760Speter "get" ,
155760Speter "getseg" ,
156760Speter "halt" ,
157760Speter "linelimit" ,
158760Speter "message" ,
159760Speter "new" ,
160760Speter "pack" ,
161760Speter "page" ,
162760Speter "put" ,
163760Speter "putseg" ,
164760Speter "read" ,
165760Speter "readln" ,
166760Speter "remove" ,
167760Speter "reset" ,
168760Speter "rewrite" ,
169760Speter "time" ,
170760Speter "unpack" ,
171760Speter "write" ,
172760Speter "writeln" ,
173760Speter /*
174760Speter * Extensions
175760Speter */
176760Speter "argv" ,
177760Speter "null" ,
178760Speter "stlimit" ,
179760Speter 0
180760Speter };
181760Speter
182760Speter #ifndef PI0
183760Speter /*
184760Speter * and their opcodes
185760Speter */
186760Speter int in_fops[] =
187760Speter {
188760Speter O_ABS2,
189760Speter O_ATAN,
190760Speter O_CARD|NSTAND,
191760Speter O_CHR2,
192760Speter O_CLCK|NSTAND,
193760Speter O_COS,
194760Speter O_EOF,
195760Speter O_EOLN,
196760Speter 0,
197760Speter O_EXP,
198760Speter O_EXPO|NSTAND,
199760Speter O_LN,
200760Speter O_ODD2,
201760Speter O_ORD2,
202760Speter O_PRED2,
203760Speter O_ROUND,
204760Speter O_SIN,
205760Speter O_SQR2,
206760Speter O_SQRT,
207760Speter O_SUCC2,
208760Speter O_TRUNC,
209760Speter O_UNDEF|NSTAND,
210760Speter /*
211760Speter * Extensions
212760Speter */
213760Speter O_ARGC|NSTAND,
214760Speter O_RANDOM|NSTAND,
215760Speter O_SEED|NSTAND,
216760Speter O_WCLCK|NSTAND,
217760Speter O_SCLCK|NSTAND
218760Speter };
219760Speter
220760Speter /*
221760Speter * Built-in procedures
222760Speter */
223760Speter int in_pops[] =
224760Speter {
2257927Smckusick O_ASRT|NSTAND,
226760Speter O_DATE|NSTAND,
2277914Smckusick O_DISPOSE,
228760Speter O_FLUSH|NSTAND,
229760Speter O_GET,
230760Speter 0,
231760Speter O_HALT|NSTAND,
232760Speter O_LLIMIT|NSTAND,
233760Speter O_MESSAGE|NSTAND,
234760Speter O_NEW,
235760Speter O_PACK,
236760Speter O_PAGE,
237760Speter O_PUT,
238760Speter 0,
239760Speter O_READ4,
240760Speter O_READLN,
241760Speter O_REMOVE|NSTAND,
242760Speter O_RESET,
243760Speter O_REWRITE,
244760Speter O_TIME|NSTAND,
245760Speter O_UNPACK,
246760Speter O_WRITEF,
247760Speter O_WRITLN,
248760Speter /*
249760Speter * Extensions
250760Speter */
251760Speter O_ARGV|NSTAND,
252760Speter O_ABORT|NSTAND,
253760Speter O_STLIM|NSTAND
254760Speter };
255760Speter #endif
256760Speter
257760Speter /*
258760Speter * Initnl initializes the first namelist segment and then
259760Speter * initializes the name list for block 0.
260760Speter */
initnl()261760Speter initnl()
262760Speter {
263760Speter register char **cp;
264760Speter register struct nl *np;
265760Speter struct nl *fp;
266760Speter int *ip;
267760Speter long *lp;
268760Speter
269760Speter #ifdef DEBUG
270760Speter if ( hp21mx )
271760Speter {
272760Speter MININT = -32768.;
273760Speter MAXINT = 32767.;
274760Speter #ifndef PI0
2756356Speter #ifdef OBJ
276760Speter genmx();
2776356Speter #endif OBJ
278760Speter #endif
279760Speter }
280760Speter #endif
281760Speter ntab[0].nls_low = nl;
282760Speter ntab[0].nls_high = &nl[INL];
28314736Sthien (void) defnl ( (char *) 0 , 0 , NLNIL , 0 );
284760Speter
285760Speter /*
286760Speter * Types
287760Speter */
288760Speter for ( cp = in_types ; *cp != 0 ; cp ++ )
28914736Sthien (void) hdefnl ( *cp , TYPE , nlp , 0 );
290760Speter
291760Speter /*
292760Speter * Ranges
293760Speter */
294760Speter lp = in_ranges;
295760Speter for ( ip = in_rclasses ; *ip != 0 ; ip ++ )
296760Speter {
29714736Sthien np = defnl ( (char *) 0 , RANGE , nl+(*ip) , 0 );
298760Speter nl[*ip].type = np;
299760Speter np -> range[0] = *lp ++ ;
300760Speter np -> range[1] = *lp ++ ;
301760Speter
302760Speter };
303760Speter
304760Speter /*
305760Speter * built in constructed types
306760Speter */
307760Speter
308760Speter cp = in_ctypes;
309760Speter /*
310760Speter * Boolean = boolean;
311760Speter */
31214736Sthien (void) hdefnl ( *cp++ , TYPE , (struct nl *) (nl+T1BOOL) , 0 );
313760Speter
314760Speter /*
315760Speter * intset = set of 0 .. 127;
316760Speter */
31714736Sthien intset = ((struct nl *) *cp++);
31814736Sthien (void) hdefnl( (char *) intset , TYPE , nlp+1 , 0 );
31914736Sthien (void) defnl ( (char *) 0 , SET , nlp+1 , 0 );
32014736Sthien np = defnl ( (char *) 0 , RANGE , nl+TINT , 0 );
321760Speter np -> range[0] = 0L;
322760Speter np -> range[1] = 127L;
323760Speter
324760Speter /*
325760Speter * alfa = array [ 1 .. 10 ] of char;
326760Speter */
32714736Sthien np = defnl ( (char *) 0 , RANGE , nl+TINT , 0 );
328760Speter np -> range[0] = 1L;
329760Speter np -> range[1] = 10L;
33014736Sthien defnl ( (char *) 0 , ARRAY , nl+T1CHAR , 1 ) -> chain = np;
33114736Sthien (void) hdefnl ( *cp++ , TYPE , nlp-1 , 0 );
332760Speter
333760Speter /*
334760Speter * text = file of char;
335760Speter */
33614736Sthien (void) hdefnl ( *cp++ , TYPE , nlp+1 , 0 );
33714736Sthien np = defnl ( (char *) 0 , FILET , nl+T1CHAR , 0 );
338760Speter np -> nl_flags |= NFILES;
339760Speter
340760Speter /*
341760Speter * input,output : text;
342760Speter */
343760Speter cp = in_vars;
344760Speter # ifndef PI0
345760Speter input = hdefnl ( *cp++ , VAR , np , INPUT_OFF );
346760Speter output = hdefnl ( *cp++ , VAR , np , OUTPUT_OFF );
347760Speter # else
348760Speter input = hdefnl ( *cp++ , VAR , np , 0 );
349760Speter output = hdefnl ( *cp++ , VAR , np , 0 );
350760Speter # endif
3513828Speter # ifdef PC
3523828Speter input -> extra_flags |= NGLOBAL;
3533828Speter output -> extra_flags |= NGLOBAL;
3543828Speter # endif PC
355760Speter
356760Speter /*
357760Speter * built in constants
358760Speter */
359760Speter cp = in_consts;
360760Speter np = hdefnl ( *cp++ , CONST , nl + TBOOL , 1 );
361760Speter fp = hdefnl ( *cp++ , CONST , nl + TBOOL , 0 );
362760Speter (nl + TBOOL)->chain = fp;
363760Speter fp->chain = np;
364760Speter np = hdefnl ( *cp++ , CONST , nl + TBOOL , 1 );
365760Speter fp = hdefnl ( *cp++ , CONST , nl + TBOOL , 0 );
366760Speter fp->chain = np;
367760Speter if (opt('s'))
368760Speter (nl + TBOOL)->chain = fp;
369760Speter hdefnl ( *cp++ , CONST , nl + T4INT , 0 ) -> range[0] = MININT;
370760Speter hdefnl ( *cp++ , CONST , nl + T4INT , 0 ) -> range[0] = MAXINT;
37114736Sthien (void) hdefnl ( *cp++ , CONST , nl + T1CHAR , 0 );
37214736Sthien (void) hdefnl ( *cp++ , CONST , nl + T1CHAR , 127 );
37314736Sthien (void) hdefnl ( *cp++ , CONST , nl + T1CHAR , '\007' );
37414736Sthien (void) hdefnl ( *cp++ , CONST , nl + T1CHAR , '\t' );
375760Speter
376760Speter /*
377760Speter * Built-in functions and procedures
378760Speter */
379760Speter #ifndef PI0
380760Speter ip = in_fops;
381760Speter for ( cp = in_funcs ; *cp != 0 ; cp ++ )
38214736Sthien (void) hdefnl ( *cp , FUNC , NLNIL , * ip ++ );
383760Speter ip = in_pops;
384760Speter for ( cp = in_procs ; *cp != 0 ; cp ++ )
38514736Sthien (void) hdefnl ( *cp , PROC , NLNIL , * ip ++ );
386760Speter #else
387760Speter for ( cp = in_funcs ; *cp != 0 ; cp ++ )
38814736Sthien (void) hdefnl ( *cp , FUNC , NLNIL , 0 );
389760Speter for ( cp = in_procs ; *cp != 0 , cp ++ )
39014736Sthien (void) hdefnl ( *cp , PROC , NLNIL , 0 );
391760Speter #endif
392760Speter # ifdef PTREE
393760Speter pTreeInit();
394760Speter # endif
395760Speter }
396760Speter
397760Speter struct nl *
hdefnl(sym,cls,typ,val)398760Speter hdefnl(sym, cls, typ, val)
39914736Sthien char *sym;
40014736Sthien int cls;
40114736Sthien struct nl *typ;
40214736Sthien int val;
403760Speter {
404760Speter register struct nl *p;
405760Speter
406760Speter #ifndef PI1
407760Speter if (sym)
40814736Sthien (void) hash(sym, 0);
409760Speter #endif
410760Speter p = defnl(sym, cls, typ, val);
411760Speter if (sym)
41214736Sthien (void) enter(p);
413760Speter return (p);
414760Speter }
415760Speter
416760Speter /*
417760Speter * Free up the name list segments
418760Speter * at the end of a statement/proc/func
419760Speter * All segments are freed down to the one in which
420760Speter * p points.
421760Speter */
422760Speter nlfree(p)
423760Speter struct nl *p;
424760Speter {
425760Speter
426760Speter nlp = p;
427760Speter while (nlact->nls_low > nlp || nlact->nls_high < nlp) {
42814736Sthien free((char *) nlact->nls_low);
429760Speter nlact->nls_low = NIL;
430760Speter nlact->nls_high = NIL;
431760Speter --nlact;
432760Speter if (nlact < &ntab[0])
433760Speter panic("nlfree");
434760Speter }
435760Speter }
43612851Speter #endif PI
437760Speter
438760Speter
43914736Sthien #ifndef PC
44014736Sthien #ifndef OBJ
441760Speter char *VARIABLE = "variable";
44214736Sthien #endif PC
44314736Sthien #endif OBJ
444760Speter
445760Speter char *classes[ ] = {
446760Speter "undefined",
447760Speter "constant",
448760Speter "type",
449760Speter "variable", /* VARIABLE */
450760Speter "array",
451760Speter "pointer or file",
452760Speter "record",
453760Speter "field",
454760Speter "procedure",
455760Speter "function",
456760Speter "variable", /* VARIABLE */
457760Speter "variable", /* VARIABLE */
458760Speter "pointer",
459760Speter "file",
460760Speter "set",
461760Speter "subrange",
462760Speter "label",
463760Speter "withptr",
464760Speter "scalar",
465760Speter "string",
466760Speter "program",
4671197Speter "improper",
4681197Speter "variant",
4691197Speter "formal procedure",
4701197Speter "formal function"
471760Speter };
472760Speter
47314736Sthien #ifndef PC
47414736Sthien #ifndef OBJ
475760Speter char *snark = "SNARK";
47614736Sthien #endif
47714736Sthien #endif
478760Speter
479760Speter #ifdef PI
480760Speter #ifdef DEBUG
481760Speter char *ctext[] =
482760Speter {
483760Speter "BADUSE",
484760Speter "CONST",
485760Speter "TYPE",
486760Speter "VAR",
487760Speter "ARRAY",
488760Speter "PTRFILE",
489760Speter "RECORD",
490760Speter "FIELD",
491760Speter "PROC",
492760Speter "FUNC",
493760Speter "FVAR",
494760Speter "REF",
495760Speter "PTR",
496760Speter "FILET",
497760Speter "SET",
498760Speter "RANGE",
499760Speter "LABEL",
500760Speter "WITHPTR",
501760Speter "SCAL",
502760Speter "STR",
503760Speter "PROG",
504760Speter "IMPROPER",
5051197Speter "VARNT",
5061197Speter "FPROC",
50715973Smckusick "FFUNC",
50815973Smckusick "CRANGE"
509760Speter };
510760Speter
511760Speter char *stars = "\t***";
512760Speter
513760Speter /*
514760Speter * Dump the namelist from the
515760Speter * current nlp down to 'to'.
516760Speter * All the namelist is dumped if
517760Speter * to is NIL.
518760Speter */
51914736Sthien /*VARARGS*/
520760Speter dumpnl(to, rout)
521760Speter struct nl *to;
522760Speter {
523760Speter register struct nl *p;
524760Speter struct nls *nlsp;
52514736Sthien int v, head;
526760Speter
527760Speter if (opt('y') == 0)
528760Speter return;
529760Speter if (to != NIL)
530760Speter printf("\n\"%s\" Block=%d\n", rout, cbn);
531760Speter nlsp = nlact;
532760Speter head = NIL;
533760Speter for (p = nlp; p != to;) {
534760Speter if (p == nlsp->nls_low) {
535760Speter if (nlsp == &ntab[0])
536760Speter break;
537760Speter nlsp--;
538760Speter p = nlsp->nls_high;
539760Speter }
540760Speter p--;
541760Speter if (head == NIL) {
542760Speter printf("\tName\tClass Bn+Flags\tType\tVal\tChn\n");
543760Speter head++;
544760Speter }
545760Speter printf("%3d:", nloff(p));
546760Speter if (p->symbol)
547760Speter printf("\t%.7s", p->symbol);
548760Speter else
549760Speter printf(stars);
550760Speter if (p->class)
551760Speter printf("\t%s", ctext[p->class]);
552760Speter else
553760Speter printf(stars);
554760Speter if (p->nl_flags) {
555760Speter pchr('\t');
556760Speter if (p->nl_flags & 037)
557760Speter printf("%d ", p->nl_flags & 037);
558760Speter #ifndef PI0
559760Speter if (p->nl_flags & NMOD)
560760Speter pchr('M');
561760Speter if (p->nl_flags & NUSED)
562760Speter pchr('U');
563760Speter #endif
564760Speter if (p->nl_flags & NFILES)
565760Speter pchr('F');
566760Speter } else
567760Speter printf(stars);
568760Speter if (p->type)
569760Speter printf("\t[%d]", nloff(p->type));
570760Speter else
571760Speter printf(stars);
572760Speter v = p->value[0];
573760Speter switch (p->class) {
574760Speter case TYPE:
575760Speter break;
576760Speter case VARNT:
577760Speter goto con;
578760Speter case CONST:
579760Speter switch (nloff(p->type)) {
580760Speter default:
581760Speter printf("\t%d", v);
582760Speter break;
583760Speter case TDOUBLE:
584760Speter printf("\t%f", p->real);
585760Speter break;
586760Speter case TINT:
587760Speter case T4INT:
588760Speter con:
589760Speter printf("\t%ld", p->range[0]);
590760Speter break;
591760Speter case TSTR:
592760Speter printf("\t'%s'", p->ptr[0]);
593760Speter break;
594760Speter }
595760Speter break;
596760Speter case VAR:
597760Speter case REF:
598760Speter case WITHPTR:
5991197Speter case FFUNC:
6001197Speter case FPROC:
601760Speter printf("\t%d,%d", cbn, v);
602760Speter break;
603760Speter case SCAL:
604760Speter case RANGE:
605760Speter printf("\t%ld..%ld", p->range[0], p->range[1]);
606760Speter break;
60715973Smckusick case CRANGE:
60815973Smckusick printf("\t%s..%s", p->nptr[0]->symbol,
60915973Smckusick p->nptr[1]->symbol);
61015973Smckusick break;
611760Speter case RECORD:
6128681Speter printf("\t%d", v);
613760Speter break;
614760Speter case FIELD:
615760Speter printf("\t%d", v);
616760Speter break;
617760Speter case STR:
618760Speter printf("\t|%d|", p->value[0]);
619760Speter break;
620760Speter case FVAR:
621760Speter case FUNC:
622760Speter case PROC:
623760Speter case PROG:
624760Speter if (cbn == 0) {
625760Speter printf("\t<%o>", p->value[0] & 0377);
626760Speter #ifndef PI0
627760Speter if (p->value[0] & NSTAND)
628760Speter printf("\tNSTAND");
629760Speter #endif
630760Speter break;
631760Speter }
632760Speter v = p->value[1];
633760Speter default:
63414736Sthien
635760Speter if (v)
636760Speter printf("\t<%d>", v);
637760Speter else
638760Speter printf(stars);
639760Speter }
640760Speter if (p->chain)
641760Speter printf("\t[%d]", nloff(p->chain));
642760Speter switch (p->class) {
643760Speter case RECORD:
6448681Speter printf("\tALIGN=%d", p->align_info);
6458681Speter if (p->ptr[NL_FIELDLIST]) {
6468681Speter printf(" FLIST=[%d]",
6478681Speter nloff(p->ptr[NL_FIELDLIST]));
6488681Speter } else {
6498681Speter printf(" FLIST=[]");
6508681Speter }
6518681Speter if (p->ptr[NL_TAG]) {
6528681Speter printf(" TAG=[%d]",
6538681Speter nloff(p->ptr[NL_TAG]));
6548681Speter } else {
6558681Speter printf(" TAG=[]");
6568681Speter }
6578681Speter if (p->ptr[NL_VARNT]) {
6588681Speter printf(" VARNT=[%d]",
6598681Speter nloff(p->ptr[NL_VARNT]));
6608681Speter } else {
6618681Speter printf(" VARNT=[]");
6628681Speter }
663760Speter break;
6648681Speter case FIELD:
6658681Speter if (p->ptr[NL_FIELDLIST]) {
6668681Speter printf("\tFLIST=[%d]",
6678681Speter nloff(p->ptr[NL_FIELDLIST]));
6688681Speter } else {
6698681Speter printf("\tFLIST=[]");
6708681Speter }
6718681Speter break;
672760Speter case VARNT:
6738681Speter printf("\tVTOREC=[%d]",
6748681Speter nloff(p->ptr[NL_VTOREC]));
675760Speter break;
676760Speter }
6773828Speter # ifdef PC
6783828Speter if ( p -> extra_flags != 0 ) {
6793828Speter pchr( '\t' );
6803828Speter if ( p -> extra_flags & NEXTERN )
6813828Speter printf( "NEXTERN " );
6823828Speter if ( p -> extra_flags & NLOCAL )
6833828Speter printf( "NLOCAL " );
6843828Speter if ( p -> extra_flags & NPARAM )
6853828Speter printf( "NPARAM " );
6863828Speter if ( p -> extra_flags & NGLOBAL )
6873828Speter printf( "NGLOBAL " );
6883828Speter if ( p -> extra_flags & NREGVAR )
6893828Speter printf( "NREGVAR " );
6903828Speter }
6913828Speter # endif PC
692760Speter # ifdef PTREE
693760Speter pchr( '\t' );
694760Speter pPrintPointer( stdout , "%s" , p -> inTree );
695760Speter # endif
696760Speter pchr('\n');
697760Speter }
698760Speter if (head == 0)
699760Speter printf("\tNo entries\n");
700760Speter }
701760Speter #endif
702760Speter
703760Speter
704760Speter /*
705760Speter * Define a new name list entry
706760Speter * with initial symbol, class, type
707760Speter * and value[0] as given. A new name
708760Speter * list segment is allocated to hold
709760Speter * the next name list slot if necessary.
710760Speter */
711760Speter struct nl *
defnl(sym,cls,typ,val)712760Speter defnl(sym, cls, typ, val)
713760Speter char *sym;
714760Speter int cls;
715760Speter struct nl *typ;
716760Speter int val;
717760Speter {
718760Speter register struct nl *p;
719760Speter register int *q, i;
720760Speter char *cp;
721760Speter
722760Speter p = nlp;
723760Speter
724760Speter /*
725760Speter * Zero out this entry
726760Speter */
72714736Sthien q = ((int *) p);
728760Speter i = (sizeof *p)/(sizeof (int));
729760Speter do
730760Speter *q++ = 0;
731760Speter while (--i);
732760Speter
733760Speter /*
734760Speter * Insert the values
735760Speter */
736760Speter p->symbol = sym;
737760Speter p->class = cls;
738760Speter p->type = typ;
739760Speter p->nl_block = cbn;
740760Speter p->value[0] = val;
741760Speter
742760Speter /*
743760Speter * Insure that the next namelist
744760Speter * entry actually exists. This is
745760Speter * really not needed here, it would
746760Speter * suffice to do it at entry if we
747760Speter * need the slot. It is done this
748760Speter * way because, historically, nlp
749760Speter * always pointed at the next namelist
750760Speter * slot.
751760Speter */
752760Speter nlp++;
753760Speter if (nlp >= nlact->nls_high) {
754760Speter i = NLINC;
75514736Sthien cp = (char *) malloc(NLINC * sizeof *nlp);
7561834Speter if (cp == 0) {
757760Speter i = NLINC / 2;
75814736Sthien cp = (char *) malloc((NLINC / 2) * sizeof *nlp);
759760Speter }
7601834Speter if (cp == 0) {
761760Speter error("Ran out of memory (defnl)");
762760Speter pexit(DIED);
763760Speter }
764760Speter nlact++;
765760Speter if (nlact >= &ntab[MAXNL]) {
766760Speter error("Ran out of name list tables");
767760Speter pexit(DIED);
768760Speter }
76914736Sthien nlp = (struct nl *) cp;
770760Speter nlact->nls_low = nlp;
771760Speter nlact->nls_high = nlact->nls_low + i;
772760Speter }
773760Speter return (p);
774760Speter }
775760Speter
776760Speter /*
777760Speter * Make a duplicate of the argument
778760Speter * namelist entry for, e.g., type
779760Speter * declarations of the form 'type a = b'
780760Speter * and array indicies.
781760Speter */
782760Speter struct nl *
nlcopy(p)783760Speter nlcopy(p)
784760Speter struct nl *p;
785760Speter {
78614736Sthien register struct nl *p1, *p2;
787760Speter
788760Speter p1 = p;
78916272Speter p2 = defnl((char *) 0, 0, NLNIL, 0);
79016272Speter *p2 = *p1;
79116272Speter p2->chain = NLNIL;
79216272Speter return (p2);
793760Speter }
794760Speter
795760Speter /*
796760Speter * Compute a namelist offset
797760Speter */
798760Speter nloff(p)
799760Speter struct nl *p;
800760Speter {
801760Speter
802760Speter return (p - nl);
803760Speter }
804760Speter
805760Speter /*
806760Speter * Enter a symbol into the block
807760Speter * symbol table. Symbols are hashed
808760Speter * 64 ways based on low 6 bits of the
809760Speter * character pointer into the string
810760Speter * table.
811760Speter */
812760Speter struct nl *
enter(np)813760Speter enter(np)
814760Speter struct nl *np;
815760Speter {
816760Speter register struct nl *rp, *hp;
817760Speter register struct nl *p;
818760Speter int i;
819760Speter
820760Speter rp = np;
821760Speter if (rp == NIL)
822760Speter return (NIL);
823760Speter #ifndef PI1
824760Speter if (cbn > 0)
825760Speter if (rp->symbol == input->symbol || rp->symbol == output->symbol)
826760Speter error("Pre-defined files input and output must not be redefined");
827760Speter #endif
82814736Sthien i = (int) rp->symbol;
829760Speter i &= 077;
830760Speter hp = disptab[i];
831760Speter if (rp->class != BADUSE && rp->class != FIELD)
832760Speter for (p = hp; p != NIL && (p->nl_block & 037) == cbn; p = p->nl_next)
83315973Smckusick if (p->symbol == rp->symbol && p->symbol != NIL &&
83415973Smckusick p->class != BADUSE && p->class != FIELD) {
835760Speter #ifndef PI1
836760Speter error("%s is already defined in this block", rp->symbol);
837760Speter #endif
838760Speter break;
839760Speter
840760Speter }
841760Speter rp->nl_next = hp;
842760Speter disptab[i] = rp;
843760Speter return (rp);
844760Speter }
845760Speter #endif
846