1*22178Sdist /* 2*22178Sdist * Copyright (c) 1980 Regents of the University of California. 3*22178Sdist * All rights reserved. The Berkeley software License Agreement 4*22178Sdist * specifies the terms and conditions for redistribution. 5*22178Sdist */ 6760Speter 714736Sthien #ifndef lint 8*22178Sdist static char sccsid[] = "@(#)nl.c 5.1 (Berkeley) 06/05/85"; 9*22178Sdist #endif not lint 10760Speter 11*22178Sdist 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 */ 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 * 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 * 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 * 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 * 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