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