1760Speter /* Copyright (c) 1979 Regents of the University of California */ 2760Speter 3*12854Speter static char sccsid[] = "@(#)nl.c 1.12 05/31/83"; 4760Speter 5760Speter #include "whoami.h" 6760Speter #include "0.h" 7*12854Speter #ifdef PI 8760Speter #include "opcode.h" 9760Speter #include "objfmt.h" 10760Speter 11760Speter /* 12760Speter * NAMELIST SEGMENT DEFINITIONS 13760Speter */ 14760Speter struct nls { 15760Speter struct nl *nls_low; 16760Speter struct nl *nls_high; 17760Speter } ntab[MAXNL], *nlact; 18760Speter 19760Speter struct nl nl[INL]; 20760Speter struct nl *nlp = nl; 21760Speter struct nls *nlact = ntab; 22760Speter 23760Speter /* 24760Speter * all these strings must be places where people can find them 25760Speter * since lookup only looks at the string pointer, not the chars. 26760Speter * see, for example, pTreeInit. 27760Speter */ 28760Speter 29760Speter /* 30760Speter * built in constants 31760Speter */ 32760Speter char *in_consts[] = { 33760Speter "true" , 34760Speter "false" , 35760Speter "TRUE", 36760Speter "FALSE", 37760Speter "minint" , 38760Speter "maxint" , 39760Speter "minchar" , 40760Speter "maxchar" , 41760Speter "bell" , 42760Speter "tab" , 43760Speter 0 44760Speter }; 45760Speter 46760Speter /* 47760Speter * built in simple types 48760Speter */ 49760Speter char *in_types[] = 50760Speter { 51760Speter "boolean", 52760Speter "char", 53760Speter "integer", 54760Speter "real", 55760Speter "_nil", /* dummy name */ 56760Speter 0 57760Speter }; 58760Speter 59760Speter int in_rclasses[] = 60760Speter { 61760Speter TINT , 62760Speter TINT , 63760Speter TINT , 64760Speter TCHAR , 65760Speter TBOOL , 66760Speter TDOUBLE , 67760Speter 0 68760Speter }; 69760Speter 70760Speter long in_ranges[] = 71760Speter { 7210648Speter -128L , 127L , 73760Speter -32768L , 32767L , 74760Speter -2147483648L , 2147483647L , 75760Speter 0L , 127L , 76760Speter 0L , 1L , 77760Speter 0L , 0L /* fake for reals */ 78760Speter }; 79760Speter 80760Speter /* 81760Speter * built in constructed types 82760Speter */ 83760Speter char *in_ctypes[] = { 84760Speter "Boolean" , 85760Speter "intset" , 86760Speter "alfa" , 87760Speter "text" , 88760Speter 0 89760Speter }; 90760Speter 91760Speter /* 92760Speter * built in variables 93760Speter */ 94760Speter char *in_vars[] = { 95760Speter "input" , 96760Speter "output" , 97760Speter 0 98760Speter }; 99760Speter 100760Speter /* 101760Speter * built in functions 102760Speter */ 103760Speter char *in_funcs[] = 104760Speter { 105760Speter "abs" , 106760Speter "arctan" , 107760Speter "card" , 108760Speter "chr" , 109760Speter "clock" , 110760Speter "cos" , 111760Speter "eof" , 112760Speter "eoln" , 113760Speter "eos" , 114760Speter "exp" , 115760Speter "expo" , 116760Speter "ln" , 117760Speter "odd" , 118760Speter "ord" , 119760Speter "pred" , 120760Speter "round" , 121760Speter "sin" , 122760Speter "sqr" , 123760Speter "sqrt" , 124760Speter "succ" , 125760Speter "trunc" , 126760Speter "undefined" , 127760Speter /* 128760Speter * Extensions 129760Speter */ 130760Speter "argc" , 131760Speter "random" , 132760Speter "seed" , 133760Speter "wallclock" , 134760Speter "sysclock" , 135760Speter 0 136760Speter }; 137760Speter 138760Speter /* 139760Speter * Built-in procedures 140760Speter */ 141760Speter char *in_procs[] = 142760Speter { 1437927Smckusick "assert", 144760Speter "date" , 145760Speter "dispose" , 146760Speter "flush" , 147760Speter "get" , 148760Speter "getseg" , 149760Speter "halt" , 150760Speter "linelimit" , 151760Speter "message" , 152760Speter "new" , 153760Speter "pack" , 154760Speter "page" , 155760Speter "put" , 156760Speter "putseg" , 157760Speter "read" , 158760Speter "readln" , 159760Speter "remove" , 160760Speter "reset" , 161760Speter "rewrite" , 162760Speter "time" , 163760Speter "unpack" , 164760Speter "write" , 165760Speter "writeln" , 166760Speter /* 167760Speter * Extensions 168760Speter */ 169760Speter "argv" , 170760Speter "null" , 171760Speter "stlimit" , 172760Speter 0 173760Speter }; 174760Speter 175760Speter #ifndef PI0 176760Speter /* 177760Speter * and their opcodes 178760Speter */ 179760Speter int in_fops[] = 180760Speter { 181760Speter O_ABS2, 182760Speter O_ATAN, 183760Speter O_CARD|NSTAND, 184760Speter O_CHR2, 185760Speter O_CLCK|NSTAND, 186760Speter O_COS, 187760Speter O_EOF, 188760Speter O_EOLN, 189760Speter 0, 190760Speter O_EXP, 191760Speter O_EXPO|NSTAND, 192760Speter O_LN, 193760Speter O_ODD2, 194760Speter O_ORD2, 195760Speter O_PRED2, 196760Speter O_ROUND, 197760Speter O_SIN, 198760Speter O_SQR2, 199760Speter O_SQRT, 200760Speter O_SUCC2, 201760Speter O_TRUNC, 202760Speter O_UNDEF|NSTAND, 203760Speter /* 204760Speter * Extensions 205760Speter */ 206760Speter O_ARGC|NSTAND, 207760Speter O_RANDOM|NSTAND, 208760Speter O_SEED|NSTAND, 209760Speter O_WCLCK|NSTAND, 210760Speter O_SCLCK|NSTAND 211760Speter }; 212760Speter 213760Speter /* 214760Speter * Built-in procedures 215760Speter */ 216760Speter int in_pops[] = 217760Speter { 2187927Smckusick O_ASRT|NSTAND, 219760Speter O_DATE|NSTAND, 2207914Smckusick O_DISPOSE, 221760Speter O_FLUSH|NSTAND, 222760Speter O_GET, 223760Speter 0, 224760Speter O_HALT|NSTAND, 225760Speter O_LLIMIT|NSTAND, 226760Speter O_MESSAGE|NSTAND, 227760Speter O_NEW, 228760Speter O_PACK, 229760Speter O_PAGE, 230760Speter O_PUT, 231760Speter 0, 232760Speter O_READ4, 233760Speter O_READLN, 234760Speter O_REMOVE|NSTAND, 235760Speter O_RESET, 236760Speter O_REWRITE, 237760Speter O_TIME|NSTAND, 238760Speter O_UNPACK, 239760Speter O_WRITEF, 240760Speter O_WRITLN, 241760Speter /* 242760Speter * Extensions 243760Speter */ 244760Speter O_ARGV|NSTAND, 245760Speter O_ABORT|NSTAND, 246760Speter O_STLIM|NSTAND 247760Speter }; 248760Speter #endif 249760Speter 250760Speter /* 251760Speter * Initnl initializes the first namelist segment and then 252760Speter * initializes the name list for block 0. 253760Speter */ 254760Speter initnl() 255760Speter { 256760Speter register char **cp; 257760Speter register struct nl *np; 258760Speter struct nl *fp; 259760Speter int *ip; 260760Speter long *lp; 261760Speter 262760Speter #ifdef DEBUG 263760Speter if ( hp21mx ) 264760Speter { 265760Speter MININT = -32768.; 266760Speter MAXINT = 32767.; 267760Speter #ifndef PI0 2686356Speter #ifdef OBJ 269760Speter genmx(); 2706356Speter #endif OBJ 271760Speter #endif 272760Speter } 273760Speter #endif 274760Speter ntab[0].nls_low = nl; 275760Speter ntab[0].nls_high = &nl[INL]; 276760Speter defnl ( 0 , 0 , 0 , 0 ); 277760Speter 278760Speter /* 279760Speter * Types 280760Speter */ 281760Speter for ( cp = in_types ; *cp != 0 ; cp ++ ) 282760Speter hdefnl ( *cp , TYPE , nlp , 0 ); 283760Speter 284760Speter /* 285760Speter * Ranges 286760Speter */ 287760Speter lp = in_ranges; 288760Speter for ( ip = in_rclasses ; *ip != 0 ; ip ++ ) 289760Speter { 290760Speter np = defnl ( 0 , RANGE , nl+(*ip) , 0 ); 291760Speter nl[*ip].type = np; 292760Speter np -> range[0] = *lp ++ ; 293760Speter np -> range[1] = *lp ++ ; 294760Speter 295760Speter }; 296760Speter 297760Speter /* 298760Speter * built in constructed types 299760Speter */ 300760Speter 301760Speter cp = in_ctypes; 302760Speter /* 303760Speter * Boolean = boolean; 304760Speter */ 305760Speter hdefnl ( *cp++ , TYPE , nl+T1BOOL , 0 ); 306760Speter 307760Speter /* 308760Speter * intset = set of 0 .. 127; 309760Speter */ 310760Speter intset = *cp++; 311760Speter hdefnl( intset , TYPE , nlp+1 , 0 ); 312760Speter defnl ( 0 , SET , nlp+1 , 0 ); 313760Speter np = defnl ( 0 , RANGE , nl+TINT , 0 ); 314760Speter np -> range[0] = 0L; 315760Speter np -> range[1] = 127L; 316760Speter 317760Speter /* 318760Speter * alfa = array [ 1 .. 10 ] of char; 319760Speter */ 320760Speter np = defnl ( 0 , RANGE , nl+TINT , 0 ); 321760Speter np -> range[0] = 1L; 322760Speter np -> range[1] = 10L; 323760Speter defnl ( 0 , ARRAY , nl+T1CHAR , 1 ) -> chain = np; 324760Speter hdefnl ( *cp++ , TYPE , nlp-1 , 0 ); 325760Speter 326760Speter /* 327760Speter * text = file of char; 328760Speter */ 329760Speter hdefnl ( *cp++ , TYPE , nlp+1 , 0 ); 330760Speter np = defnl ( 0 , FILET , nl+T1CHAR , 0 ); 331760Speter np -> nl_flags |= NFILES; 332760Speter 333760Speter /* 334760Speter * input,output : text; 335760Speter */ 336760Speter cp = in_vars; 337760Speter # ifndef PI0 338760Speter input = hdefnl ( *cp++ , VAR , np , INPUT_OFF ); 339760Speter output = hdefnl ( *cp++ , VAR , np , OUTPUT_OFF ); 340760Speter # else 341760Speter input = hdefnl ( *cp++ , VAR , np , 0 ); 342760Speter output = hdefnl ( *cp++ , VAR , np , 0 ); 343760Speter # endif 3443828Speter # ifdef PC 3453828Speter input -> extra_flags |= NGLOBAL; 3463828Speter output -> extra_flags |= NGLOBAL; 3473828Speter # endif PC 348760Speter 349760Speter /* 350760Speter * built in constants 351760Speter */ 352760Speter cp = in_consts; 353760Speter np = hdefnl ( *cp++ , CONST , nl + TBOOL , 1 ); 354760Speter fp = hdefnl ( *cp++ , CONST , nl + TBOOL , 0 ); 355760Speter (nl + TBOOL)->chain = fp; 356760Speter fp->chain = np; 357760Speter np = hdefnl ( *cp++ , CONST , nl + TBOOL , 1 ); 358760Speter fp = hdefnl ( *cp++ , CONST , nl + TBOOL , 0 ); 359760Speter fp->chain = np; 360760Speter if (opt('s')) 361760Speter (nl + TBOOL)->chain = fp; 362760Speter hdefnl ( *cp++ , CONST , nl + T4INT , 0 ) -> range[0] = MININT; 363760Speter hdefnl ( *cp++ , CONST , nl + T4INT , 0 ) -> range[0] = MAXINT; 364760Speter hdefnl ( *cp++ , CONST , nl + T1CHAR , 0 ); 365760Speter hdefnl ( *cp++ , CONST , nl + T1CHAR , 127 ); 366760Speter hdefnl ( *cp++ , CONST , nl + T1CHAR , '\007' ); 367760Speter hdefnl ( *cp++ , CONST , nl + T1CHAR , '\t' ); 368760Speter 369760Speter /* 370760Speter * Built-in functions and procedures 371760Speter */ 372760Speter #ifndef PI0 373760Speter ip = in_fops; 374760Speter for ( cp = in_funcs ; *cp != 0 ; cp ++ ) 375760Speter hdefnl ( *cp , FUNC , 0 , * ip ++ ); 376760Speter ip = in_pops; 377760Speter for ( cp = in_procs ; *cp != 0 ; cp ++ ) 378760Speter hdefnl ( *cp , PROC , 0 , * ip ++ ); 379760Speter #else 380760Speter for ( cp = in_funcs ; *cp != 0 ; cp ++ ) 381760Speter hdefnl ( *cp , FUNC , 0 , 0 ); 382760Speter for ( cp = in_procs ; *cp != 0 , cp ++ ) 383760Speter hdefnl ( *cp , PROC , 0 , 0 ); 384760Speter #endif 385760Speter # ifdef PTREE 386760Speter pTreeInit(); 387760Speter # endif 388760Speter } 389760Speter 390760Speter struct nl * 391760Speter hdefnl(sym, cls, typ, val) 392760Speter { 393760Speter register struct nl *p; 394760Speter 395760Speter #ifndef PI1 396760Speter if (sym) 397760Speter hash(sym, 0); 398760Speter #endif 399760Speter p = defnl(sym, cls, typ, val); 400760Speter if (sym) 401760Speter enter(p); 402760Speter return (p); 403760Speter } 404760Speter 405760Speter /* 406760Speter * Free up the name list segments 407760Speter * at the end of a statement/proc/func 408760Speter * All segments are freed down to the one in which 409760Speter * p points. 410760Speter */ 411760Speter nlfree(p) 412760Speter struct nl *p; 413760Speter { 414760Speter 415760Speter nlp = p; 416760Speter while (nlact->nls_low > nlp || nlact->nls_high < nlp) { 417760Speter free(nlact->nls_low); 418760Speter nlact->nls_low = NIL; 419760Speter nlact->nls_high = NIL; 420760Speter --nlact; 421760Speter if (nlact < &ntab[0]) 422760Speter panic("nlfree"); 423760Speter } 424760Speter } 42512851Speter #endif PI 426760Speter 427760Speter 428760Speter char *VARIABLE = "variable"; 429760Speter 430760Speter char *classes[ ] = { 431760Speter "undefined", 432760Speter "constant", 433760Speter "type", 434760Speter "variable", /* VARIABLE */ 435760Speter "array", 436760Speter "pointer or file", 437760Speter "record", 438760Speter "field", 439760Speter "procedure", 440760Speter "function", 441760Speter "variable", /* VARIABLE */ 442760Speter "variable", /* VARIABLE */ 443760Speter "pointer", 444760Speter "file", 445760Speter "set", 446760Speter "subrange", 447760Speter "label", 448760Speter "withptr", 449760Speter "scalar", 450760Speter "string", 451760Speter "program", 4521197Speter "improper", 4531197Speter "variant", 4541197Speter "formal procedure", 4551197Speter "formal function" 456760Speter }; 457760Speter 458760Speter char *snark = "SNARK"; 459760Speter 460760Speter #ifdef PI 461760Speter #ifdef DEBUG 462760Speter char *ctext[] = 463760Speter { 464760Speter "BADUSE", 465760Speter "CONST", 466760Speter "TYPE", 467760Speter "VAR", 468760Speter "ARRAY", 469760Speter "PTRFILE", 470760Speter "RECORD", 471760Speter "FIELD", 472760Speter "PROC", 473760Speter "FUNC", 474760Speter "FVAR", 475760Speter "REF", 476760Speter "PTR", 477760Speter "FILET", 478760Speter "SET", 479760Speter "RANGE", 480760Speter "LABEL", 481760Speter "WITHPTR", 482760Speter "SCAL", 483760Speter "STR", 484760Speter "PROG", 485760Speter "IMPROPER", 4861197Speter "VARNT", 4871197Speter "FPROC", 4881197Speter "FFUNC" 489760Speter }; 490760Speter 491760Speter char *stars = "\t***"; 492760Speter 493760Speter /* 494760Speter * Dump the namelist from the 495760Speter * current nlp down to 'to'. 496760Speter * All the namelist is dumped if 497760Speter * to is NIL. 498760Speter */ 499760Speter dumpnl(to, rout) 500760Speter struct nl *to; 501760Speter { 502760Speter register struct nl *p; 503760Speter register int j; 504760Speter struct nls *nlsp; 505760Speter int i, v, head; 506760Speter 507760Speter if (opt('y') == 0) 508760Speter return; 509760Speter if (to != NIL) 510760Speter printf("\n\"%s\" Block=%d\n", rout, cbn); 511760Speter nlsp = nlact; 512760Speter head = NIL; 513760Speter for (p = nlp; p != to;) { 514760Speter if (p == nlsp->nls_low) { 515760Speter if (nlsp == &ntab[0]) 516760Speter break; 517760Speter nlsp--; 518760Speter p = nlsp->nls_high; 519760Speter } 520760Speter p--; 521760Speter if (head == NIL) { 522760Speter printf("\tName\tClass Bn+Flags\tType\tVal\tChn\n"); 523760Speter head++; 524760Speter } 525760Speter printf("%3d:", nloff(p)); 526760Speter if (p->symbol) 527760Speter printf("\t%.7s", p->symbol); 528760Speter else 529760Speter printf(stars); 530760Speter if (p->class) 531760Speter printf("\t%s", ctext[p->class]); 532760Speter else 533760Speter printf(stars); 534760Speter if (p->nl_flags) { 535760Speter pchr('\t'); 536760Speter if (p->nl_flags & 037) 537760Speter printf("%d ", p->nl_flags & 037); 538760Speter #ifndef PI0 539760Speter if (p->nl_flags & NMOD) 540760Speter pchr('M'); 541760Speter if (p->nl_flags & NUSED) 542760Speter pchr('U'); 543760Speter #endif 544760Speter if (p->nl_flags & NFILES) 545760Speter pchr('F'); 546760Speter } else 547760Speter printf(stars); 548760Speter if (p->type) 549760Speter printf("\t[%d]", nloff(p->type)); 550760Speter else 551760Speter printf(stars); 552760Speter v = p->value[0]; 553760Speter switch (p->class) { 554760Speter case TYPE: 555760Speter break; 556760Speter case VARNT: 557760Speter goto con; 558760Speter case CONST: 559760Speter switch (nloff(p->type)) { 560760Speter default: 561760Speter printf("\t%d", v); 562760Speter break; 563760Speter case TDOUBLE: 564760Speter printf("\t%f", p->real); 565760Speter break; 566760Speter case TINT: 567760Speter case T4INT: 568760Speter con: 569760Speter printf("\t%ld", p->range[0]); 570760Speter break; 571760Speter case TSTR: 572760Speter printf("\t'%s'", p->ptr[0]); 573760Speter break; 574760Speter } 575760Speter break; 576760Speter case VAR: 577760Speter case REF: 578760Speter case WITHPTR: 5791197Speter case FFUNC: 5801197Speter case FPROC: 581760Speter printf("\t%d,%d", cbn, v); 582760Speter break; 583760Speter case SCAL: 584760Speter case RANGE: 585760Speter printf("\t%ld..%ld", p->range[0], p->range[1]); 586760Speter break; 587760Speter case RECORD: 5888681Speter printf("\t%d", v); 589760Speter break; 590760Speter case FIELD: 591760Speter printf("\t%d", v); 592760Speter break; 593760Speter case STR: 594760Speter printf("\t|%d|", p->value[0]); 595760Speter break; 596760Speter case FVAR: 597760Speter case FUNC: 598760Speter case PROC: 599760Speter case PROG: 600760Speter if (cbn == 0) { 601760Speter printf("\t<%o>", p->value[0] & 0377); 602760Speter #ifndef PI0 603760Speter if (p->value[0] & NSTAND) 604760Speter printf("\tNSTAND"); 605760Speter #endif 606760Speter break; 607760Speter } 608760Speter v = p->value[1]; 609760Speter default: 610760Speter casedef: 611760Speter if (v) 612760Speter printf("\t<%d>", v); 613760Speter else 614760Speter printf(stars); 615760Speter } 616760Speter if (p->chain) 617760Speter printf("\t[%d]", nloff(p->chain)); 618760Speter switch (p->class) { 619760Speter case RECORD: 6208681Speter printf("\tALIGN=%d", p->align_info); 6218681Speter if (p->ptr[NL_FIELDLIST]) { 6228681Speter printf(" FLIST=[%d]", 6238681Speter nloff(p->ptr[NL_FIELDLIST])); 6248681Speter } else { 6258681Speter printf(" FLIST=[]"); 6268681Speter } 6278681Speter if (p->ptr[NL_TAG]) { 6288681Speter printf(" TAG=[%d]", 6298681Speter nloff(p->ptr[NL_TAG])); 6308681Speter } else { 6318681Speter printf(" TAG=[]"); 6328681Speter } 6338681Speter if (p->ptr[NL_VARNT]) { 6348681Speter printf(" VARNT=[%d]", 6358681Speter nloff(p->ptr[NL_VARNT])); 6368681Speter } else { 6378681Speter printf(" VARNT=[]"); 6388681Speter } 639760Speter break; 6408681Speter case FIELD: 6418681Speter if (p->ptr[NL_FIELDLIST]) { 6428681Speter printf("\tFLIST=[%d]", 6438681Speter nloff(p->ptr[NL_FIELDLIST])); 6448681Speter } else { 6458681Speter printf("\tFLIST=[]"); 6468681Speter } 6478681Speter break; 648760Speter case VARNT: 6498681Speter printf("\tVTOREC=[%d]", 6508681Speter nloff(p->ptr[NL_VTOREC])); 651760Speter break; 652760Speter } 6533828Speter # ifdef PC 6543828Speter if ( p -> extra_flags != 0 ) { 6553828Speter pchr( '\t' ); 6563828Speter if ( p -> extra_flags & NEXTERN ) 6573828Speter printf( "NEXTERN " ); 6583828Speter if ( p -> extra_flags & NLOCAL ) 6593828Speter printf( "NLOCAL " ); 6603828Speter if ( p -> extra_flags & NPARAM ) 6613828Speter printf( "NPARAM " ); 6623828Speter if ( p -> extra_flags & NGLOBAL ) 6633828Speter printf( "NGLOBAL " ); 6643828Speter if ( p -> extra_flags & NREGVAR ) 6653828Speter printf( "NREGVAR " ); 6663828Speter } 6673828Speter # endif PC 668760Speter # ifdef PTREE 669760Speter pchr( '\t' ); 670760Speter pPrintPointer( stdout , "%s" , p -> inTree ); 671760Speter # endif 672760Speter pchr('\n'); 673760Speter } 674760Speter if (head == 0) 675760Speter printf("\tNo entries\n"); 676760Speter } 677760Speter #endif 678760Speter 679760Speter 680760Speter /* 681760Speter * Define a new name list entry 682760Speter * with initial symbol, class, type 683760Speter * and value[0] as given. A new name 684760Speter * list segment is allocated to hold 685760Speter * the next name list slot if necessary. 686760Speter */ 687760Speter struct nl * 688760Speter defnl(sym, cls, typ, val) 689760Speter char *sym; 690760Speter int cls; 691760Speter struct nl *typ; 692760Speter int val; 693760Speter { 694760Speter register struct nl *p; 695760Speter register int *q, i; 696760Speter char *cp; 697760Speter 698760Speter p = nlp; 699760Speter 700760Speter /* 701760Speter * Zero out this entry 702760Speter */ 703760Speter q = p; 704760Speter i = (sizeof *p)/(sizeof (int)); 705760Speter do 706760Speter *q++ = 0; 707760Speter while (--i); 708760Speter 709760Speter /* 710760Speter * Insert the values 711760Speter */ 712760Speter p->symbol = sym; 713760Speter p->class = cls; 714760Speter p->type = typ; 715760Speter p->nl_block = cbn; 716760Speter p->value[0] = val; 717760Speter 718760Speter /* 719760Speter * Insure that the next namelist 720760Speter * entry actually exists. This is 721760Speter * really not needed here, it would 722760Speter * suffice to do it at entry if we 723760Speter * need the slot. It is done this 724760Speter * way because, historically, nlp 725760Speter * always pointed at the next namelist 726760Speter * slot. 727760Speter */ 728760Speter nlp++; 729760Speter if (nlp >= nlact->nls_high) { 730760Speter i = NLINC; 731760Speter cp = malloc(NLINC * sizeof *nlp); 7321834Speter if (cp == 0) { 733760Speter i = NLINC / 2; 734760Speter cp = malloc((NLINC / 2) * sizeof *nlp); 735760Speter } 7361834Speter if (cp == 0) { 737760Speter error("Ran out of memory (defnl)"); 738760Speter pexit(DIED); 739760Speter } 740760Speter nlact++; 741760Speter if (nlact >= &ntab[MAXNL]) { 742760Speter error("Ran out of name list tables"); 743760Speter pexit(DIED); 744760Speter } 745760Speter nlp = cp; 746760Speter nlact->nls_low = nlp; 747760Speter nlact->nls_high = nlact->nls_low + i; 748760Speter } 749760Speter return (p); 750760Speter } 751760Speter 752760Speter /* 753760Speter * Make a duplicate of the argument 754760Speter * namelist entry for, e.g., type 755760Speter * declarations of the form 'type a = b' 756760Speter * and array indicies. 757760Speter */ 758760Speter struct nl * 759760Speter nlcopy(p) 760760Speter struct nl *p; 761760Speter { 762760Speter register int *p1, *p2, i; 763760Speter 764760Speter p1 = p; 765760Speter p = p2 = defnl(0, 0, 0, 0); 766760Speter i = (sizeof *p)/(sizeof (int)); 767760Speter do 768760Speter *p2++ = *p1++; 769760Speter while (--i); 770760Speter p->chain = NIL; 771760Speter return (p); 772760Speter } 773760Speter 774760Speter /* 775760Speter * Compute a namelist offset 776760Speter */ 777760Speter nloff(p) 778760Speter struct nl *p; 779760Speter { 780760Speter 781760Speter return (p - nl); 782760Speter } 783760Speter 784760Speter /* 785760Speter * Enter a symbol into the block 786760Speter * symbol table. Symbols are hashed 787760Speter * 64 ways based on low 6 bits of the 788760Speter * character pointer into the string 789760Speter * table. 790760Speter */ 791760Speter struct nl * 792760Speter enter(np) 793760Speter struct nl *np; 794760Speter { 795760Speter register struct nl *rp, *hp; 796760Speter register struct nl *p; 797760Speter int i; 798760Speter 799760Speter rp = np; 800760Speter if (rp == NIL) 801760Speter return (NIL); 802760Speter #ifndef PI1 803760Speter if (cbn > 0) 804760Speter if (rp->symbol == input->symbol || rp->symbol == output->symbol) 805760Speter error("Pre-defined files input and output must not be redefined"); 806760Speter #endif 807760Speter i = rp->symbol; 808760Speter i &= 077; 809760Speter hp = disptab[i]; 810760Speter if (rp->class != BADUSE && rp->class != FIELD) 811760Speter for (p = hp; p != NIL && (p->nl_block & 037) == cbn; p = p->nl_next) 812760Speter if (p->symbol == rp->symbol && p->class != BADUSE && p->class != FIELD) { 813760Speter #ifndef PI1 814760Speter error("%s is already defined in this block", rp->symbol); 815760Speter #endif 816760Speter break; 817760Speter 818760Speter } 819760Speter rp->nl_next = hp; 820760Speter disptab[i] = rp; 821760Speter return (rp); 822760Speter } 823760Speter #endif 824