1760Speter /* Copyright (c) 1979 Regents of the University of California */ 2760Speter 3*14736Sthien #ifndef lint 4*14736Sthien static char sccsid[] = "@(#)nl.c 1.13 08/19/83"; 5*14736Sthien #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]; 278*14736Sthien (void) defnl ( (char *) 0 , 0 , NLNIL , 0 ); 279760Speter 280760Speter /* 281760Speter * Types 282760Speter */ 283760Speter for ( cp = in_types ; *cp != 0 ; cp ++ ) 284*14736Sthien (void) hdefnl ( *cp , TYPE , nlp , 0 ); 285760Speter 286760Speter /* 287760Speter * Ranges 288760Speter */ 289760Speter lp = in_ranges; 290760Speter for ( ip = in_rclasses ; *ip != 0 ; ip ++ ) 291760Speter { 292*14736Sthien 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 */ 307*14736Sthien (void) hdefnl ( *cp++ , TYPE , (struct nl *) (nl+T1BOOL) , 0 ); 308760Speter 309760Speter /* 310760Speter * intset = set of 0 .. 127; 311760Speter */ 312*14736Sthien intset = ((struct nl *) *cp++); 313*14736Sthien (void) hdefnl( (char *) intset , TYPE , nlp+1 , 0 ); 314*14736Sthien (void) defnl ( (char *) 0 , SET , nlp+1 , 0 ); 315*14736Sthien 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 */ 322*14736Sthien np = defnl ( (char *) 0 , RANGE , nl+TINT , 0 ); 323760Speter np -> range[0] = 1L; 324760Speter np -> range[1] = 10L; 325*14736Sthien defnl ( (char *) 0 , ARRAY , nl+T1CHAR , 1 ) -> chain = np; 326*14736Sthien (void) hdefnl ( *cp++ , TYPE , nlp-1 , 0 ); 327760Speter 328760Speter /* 329760Speter * text = file of char; 330760Speter */ 331*14736Sthien (void) hdefnl ( *cp++ , TYPE , nlp+1 , 0 ); 332*14736Sthien 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; 366*14736Sthien (void) hdefnl ( *cp++ , CONST , nl + T1CHAR , 0 ); 367*14736Sthien (void) hdefnl ( *cp++ , CONST , nl + T1CHAR , 127 ); 368*14736Sthien (void) hdefnl ( *cp++ , CONST , nl + T1CHAR , '\007' ); 369*14736Sthien (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 ++ ) 377*14736Sthien (void) hdefnl ( *cp , FUNC , NLNIL , * ip ++ ); 378760Speter ip = in_pops; 379760Speter for ( cp = in_procs ; *cp != 0 ; cp ++ ) 380*14736Sthien (void) hdefnl ( *cp , PROC , NLNIL , * ip ++ ); 381760Speter #else 382760Speter for ( cp = in_funcs ; *cp != 0 ; cp ++ ) 383*14736Sthien (void) hdefnl ( *cp , FUNC , NLNIL , 0 ); 384760Speter for ( cp = in_procs ; *cp != 0 , cp ++ ) 385*14736Sthien (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) 394*14736Sthien char *sym; 395*14736Sthien int cls; 396*14736Sthien struct nl *typ; 397*14736Sthien int val; 398760Speter { 399760Speter register struct nl *p; 400760Speter 401760Speter #ifndef PI1 402760Speter if (sym) 403*14736Sthien (void) hash(sym, 0); 404760Speter #endif 405760Speter p = defnl(sym, cls, typ, val); 406760Speter if (sym) 407*14736Sthien (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) { 423*14736Sthien 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 434*14736Sthien #ifndef PC 435*14736Sthien #ifndef OBJ 436760Speter char *VARIABLE = "variable"; 437*14736Sthien #endif PC 438*14736Sthien #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 468*14736Sthien #ifndef PC 469*14736Sthien #ifndef OBJ 470760Speter char *snark = "SNARK"; 471*14736Sthien #endif 472*14736Sthien #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", 5021197Speter "FFUNC" 503760Speter }; 504760Speter 505760Speter char *stars = "\t***"; 506760Speter 507760Speter /* 508760Speter * Dump the namelist from the 509760Speter * current nlp down to 'to'. 510760Speter * All the namelist is dumped if 511760Speter * to is NIL. 512760Speter */ 513*14736Sthien /*VARARGS*/ 514760Speter dumpnl(to, rout) 515760Speter struct nl *to; 516760Speter { 517760Speter register struct nl *p; 518760Speter struct nls *nlsp; 519*14736Sthien int v, head; 520760Speter 521760Speter if (opt('y') == 0) 522760Speter return; 523760Speter if (to != NIL) 524760Speter printf("\n\"%s\" Block=%d\n", rout, cbn); 525760Speter nlsp = nlact; 526760Speter head = NIL; 527760Speter for (p = nlp; p != to;) { 528760Speter if (p == nlsp->nls_low) { 529760Speter if (nlsp == &ntab[0]) 530760Speter break; 531760Speter nlsp--; 532760Speter p = nlsp->nls_high; 533760Speter } 534760Speter p--; 535760Speter if (head == NIL) { 536760Speter printf("\tName\tClass Bn+Flags\tType\tVal\tChn\n"); 537760Speter head++; 538760Speter } 539760Speter printf("%3d:", nloff(p)); 540760Speter if (p->symbol) 541760Speter printf("\t%.7s", p->symbol); 542760Speter else 543760Speter printf(stars); 544760Speter if (p->class) 545760Speter printf("\t%s", ctext[p->class]); 546760Speter else 547760Speter printf(stars); 548760Speter if (p->nl_flags) { 549760Speter pchr('\t'); 550760Speter if (p->nl_flags & 037) 551760Speter printf("%d ", p->nl_flags & 037); 552760Speter #ifndef PI0 553760Speter if (p->nl_flags & NMOD) 554760Speter pchr('M'); 555760Speter if (p->nl_flags & NUSED) 556760Speter pchr('U'); 557760Speter #endif 558760Speter if (p->nl_flags & NFILES) 559760Speter pchr('F'); 560760Speter } else 561760Speter printf(stars); 562760Speter if (p->type) 563760Speter printf("\t[%d]", nloff(p->type)); 564760Speter else 565760Speter printf(stars); 566760Speter v = p->value[0]; 567760Speter switch (p->class) { 568760Speter case TYPE: 569760Speter break; 570760Speter case VARNT: 571760Speter goto con; 572760Speter case CONST: 573760Speter switch (nloff(p->type)) { 574760Speter default: 575760Speter printf("\t%d", v); 576760Speter break; 577760Speter case TDOUBLE: 578760Speter printf("\t%f", p->real); 579760Speter break; 580760Speter case TINT: 581760Speter case T4INT: 582760Speter con: 583760Speter printf("\t%ld", p->range[0]); 584760Speter break; 585760Speter case TSTR: 586760Speter printf("\t'%s'", p->ptr[0]); 587760Speter break; 588760Speter } 589760Speter break; 590760Speter case VAR: 591760Speter case REF: 592760Speter case WITHPTR: 5931197Speter case FFUNC: 5941197Speter case FPROC: 595760Speter printf("\t%d,%d", cbn, v); 596760Speter break; 597760Speter case SCAL: 598760Speter case RANGE: 599760Speter printf("\t%ld..%ld", p->range[0], p->range[1]); 600760Speter break; 601760Speter case RECORD: 6028681Speter printf("\t%d", v); 603760Speter break; 604760Speter case FIELD: 605760Speter printf("\t%d", v); 606760Speter break; 607760Speter case STR: 608760Speter printf("\t|%d|", p->value[0]); 609760Speter break; 610760Speter case FVAR: 611760Speter case FUNC: 612760Speter case PROC: 613760Speter case PROG: 614760Speter if (cbn == 0) { 615760Speter printf("\t<%o>", p->value[0] & 0377); 616760Speter #ifndef PI0 617760Speter if (p->value[0] & NSTAND) 618760Speter printf("\tNSTAND"); 619760Speter #endif 620760Speter break; 621760Speter } 622760Speter v = p->value[1]; 623760Speter default: 624*14736Sthien 625760Speter if (v) 626760Speter printf("\t<%d>", v); 627760Speter else 628760Speter printf(stars); 629760Speter } 630760Speter if (p->chain) 631760Speter printf("\t[%d]", nloff(p->chain)); 632760Speter switch (p->class) { 633760Speter case RECORD: 6348681Speter printf("\tALIGN=%d", p->align_info); 6358681Speter if (p->ptr[NL_FIELDLIST]) { 6368681Speter printf(" FLIST=[%d]", 6378681Speter nloff(p->ptr[NL_FIELDLIST])); 6388681Speter } else { 6398681Speter printf(" FLIST=[]"); 6408681Speter } 6418681Speter if (p->ptr[NL_TAG]) { 6428681Speter printf(" TAG=[%d]", 6438681Speter nloff(p->ptr[NL_TAG])); 6448681Speter } else { 6458681Speter printf(" TAG=[]"); 6468681Speter } 6478681Speter if (p->ptr[NL_VARNT]) { 6488681Speter printf(" VARNT=[%d]", 6498681Speter nloff(p->ptr[NL_VARNT])); 6508681Speter } else { 6518681Speter printf(" VARNT=[]"); 6528681Speter } 653760Speter break; 6548681Speter case FIELD: 6558681Speter if (p->ptr[NL_FIELDLIST]) { 6568681Speter printf("\tFLIST=[%d]", 6578681Speter nloff(p->ptr[NL_FIELDLIST])); 6588681Speter } else { 6598681Speter printf("\tFLIST=[]"); 6608681Speter } 6618681Speter break; 662760Speter case VARNT: 6638681Speter printf("\tVTOREC=[%d]", 6648681Speter nloff(p->ptr[NL_VTOREC])); 665760Speter break; 666760Speter } 6673828Speter # ifdef PC 6683828Speter if ( p -> extra_flags != 0 ) { 6693828Speter pchr( '\t' ); 6703828Speter if ( p -> extra_flags & NEXTERN ) 6713828Speter printf( "NEXTERN " ); 6723828Speter if ( p -> extra_flags & NLOCAL ) 6733828Speter printf( "NLOCAL " ); 6743828Speter if ( p -> extra_flags & NPARAM ) 6753828Speter printf( "NPARAM " ); 6763828Speter if ( p -> extra_flags & NGLOBAL ) 6773828Speter printf( "NGLOBAL " ); 6783828Speter if ( p -> extra_flags & NREGVAR ) 6793828Speter printf( "NREGVAR " ); 6803828Speter } 6813828Speter # endif PC 682760Speter # ifdef PTREE 683760Speter pchr( '\t' ); 684760Speter pPrintPointer( stdout , "%s" , p -> inTree ); 685760Speter # endif 686760Speter pchr('\n'); 687760Speter } 688760Speter if (head == 0) 689760Speter printf("\tNo entries\n"); 690760Speter } 691760Speter #endif 692760Speter 693760Speter 694760Speter /* 695760Speter * Define a new name list entry 696760Speter * with initial symbol, class, type 697760Speter * and value[0] as given. A new name 698760Speter * list segment is allocated to hold 699760Speter * the next name list slot if necessary. 700760Speter */ 701760Speter struct nl * 702760Speter defnl(sym, cls, typ, val) 703760Speter char *sym; 704760Speter int cls; 705760Speter struct nl *typ; 706760Speter int val; 707760Speter { 708760Speter register struct nl *p; 709760Speter register int *q, i; 710760Speter char *cp; 711760Speter 712760Speter p = nlp; 713760Speter 714760Speter /* 715760Speter * Zero out this entry 716760Speter */ 717*14736Sthien q = ((int *) p); 718760Speter i = (sizeof *p)/(sizeof (int)); 719760Speter do 720760Speter *q++ = 0; 721760Speter while (--i); 722760Speter 723760Speter /* 724760Speter * Insert the values 725760Speter */ 726760Speter p->symbol = sym; 727760Speter p->class = cls; 728760Speter p->type = typ; 729760Speter p->nl_block = cbn; 730760Speter p->value[0] = val; 731760Speter 732760Speter /* 733760Speter * Insure that the next namelist 734760Speter * entry actually exists. This is 735760Speter * really not needed here, it would 736760Speter * suffice to do it at entry if we 737760Speter * need the slot. It is done this 738760Speter * way because, historically, nlp 739760Speter * always pointed at the next namelist 740760Speter * slot. 741760Speter */ 742760Speter nlp++; 743760Speter if (nlp >= nlact->nls_high) { 744760Speter i = NLINC; 745*14736Sthien cp = (char *) malloc(NLINC * sizeof *nlp); 7461834Speter if (cp == 0) { 747760Speter i = NLINC / 2; 748*14736Sthien cp = (char *) malloc((NLINC / 2) * sizeof *nlp); 749760Speter } 7501834Speter if (cp == 0) { 751760Speter error("Ran out of memory (defnl)"); 752760Speter pexit(DIED); 753760Speter } 754760Speter nlact++; 755760Speter if (nlact >= &ntab[MAXNL]) { 756760Speter error("Ran out of name list tables"); 757760Speter pexit(DIED); 758760Speter } 759*14736Sthien nlp = (struct nl *) cp; 760760Speter nlact->nls_low = nlp; 761760Speter nlact->nls_high = nlact->nls_low + i; 762760Speter } 763760Speter return (p); 764760Speter } 765760Speter 766760Speter /* 767760Speter * Make a duplicate of the argument 768760Speter * namelist entry for, e.g., type 769760Speter * declarations of the form 'type a = b' 770760Speter * and array indicies. 771760Speter */ 772760Speter struct nl * 773760Speter nlcopy(p) 774760Speter struct nl *p; 775760Speter { 776*14736Sthien register struct nl *p1, *p2; 777*14736Sthien register int i; 778760Speter 779760Speter p1 = p; 780*14736Sthien p = p2 = defnl((char *) 0, 0, NLNIL, 0); 781760Speter i = (sizeof *p)/(sizeof (int)); 782760Speter do 783760Speter *p2++ = *p1++; 784760Speter while (--i); 785760Speter p->chain = NIL; 786760Speter return (p); 787760Speter } 788760Speter 789760Speter /* 790760Speter * Compute a namelist offset 791760Speter */ 792760Speter nloff(p) 793760Speter struct nl *p; 794760Speter { 795760Speter 796760Speter return (p - nl); 797760Speter } 798760Speter 799760Speter /* 800760Speter * Enter a symbol into the block 801760Speter * symbol table. Symbols are hashed 802760Speter * 64 ways based on low 6 bits of the 803760Speter * character pointer into the string 804760Speter * table. 805760Speter */ 806760Speter struct nl * 807760Speter enter(np) 808760Speter struct nl *np; 809760Speter { 810760Speter register struct nl *rp, *hp; 811760Speter register struct nl *p; 812760Speter int i; 813760Speter 814760Speter rp = np; 815760Speter if (rp == NIL) 816760Speter return (NIL); 817760Speter #ifndef PI1 818760Speter if (cbn > 0) 819760Speter if (rp->symbol == input->symbol || rp->symbol == output->symbol) 820760Speter error("Pre-defined files input and output must not be redefined"); 821760Speter #endif 822*14736Sthien i = (int) rp->symbol; 823760Speter i &= 077; 824760Speter hp = disptab[i]; 825760Speter if (rp->class != BADUSE && rp->class != FIELD) 826760Speter for (p = hp; p != NIL && (p->nl_block & 037) == cbn; p = p->nl_next) 827760Speter if (p->symbol == rp->symbol && p->class != BADUSE && p->class != FIELD) { 828760Speter #ifndef PI1 829760Speter error("%s is already defined in this block", rp->symbol); 830760Speter #endif 831760Speter break; 832760Speter 833760Speter } 834760Speter rp->nl_next = hp; 835760Speter disptab[i] = rp; 836760Speter return (rp); 837760Speter } 838760Speter #endif 839