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