1*760Speter /* Copyright (c) 1979 Regents of the University of California */ 2*760Speter 3*760Speter static char sccsid[] = "@(#)nl.c 1.1 08/27/80"; 4*760Speter 5*760Speter #include "whoami.h" 6*760Speter #include "0.h" 7*760Speter #include "opcode.h" 8*760Speter #include "objfmt.h" 9*760Speter 10*760Speter /* 11*760Speter * NAMELIST SEGMENT DEFINITIONS 12*760Speter */ 13*760Speter struct nls { 14*760Speter struct nl *nls_low; 15*760Speter struct nl *nls_high; 16*760Speter } ntab[MAXNL], *nlact; 17*760Speter 18*760Speter struct nl nl[INL]; 19*760Speter struct nl *nlp = nl; 20*760Speter struct nls *nlact = ntab; 21*760Speter 22*760Speter /* 23*760Speter * all these strings must be places where people can find them 24*760Speter * since lookup only looks at the string pointer, not the chars. 25*760Speter * see, for example, pTreeInit. 26*760Speter */ 27*760Speter 28*760Speter /* 29*760Speter * built in constants 30*760Speter */ 31*760Speter char *in_consts[] = { 32*760Speter "true" , 33*760Speter "false" , 34*760Speter "TRUE", 35*760Speter "FALSE", 36*760Speter "minint" , 37*760Speter "maxint" , 38*760Speter "minchar" , 39*760Speter "maxchar" , 40*760Speter "bell" , 41*760Speter "tab" , 42*760Speter 0 43*760Speter }; 44*760Speter 45*760Speter /* 46*760Speter * built in simple types 47*760Speter */ 48*760Speter char *in_types[] = 49*760Speter { 50*760Speter "boolean", 51*760Speter "char", 52*760Speter "integer", 53*760Speter "real", 54*760Speter "_nil", /* dummy name */ 55*760Speter 0 56*760Speter }; 57*760Speter 58*760Speter int in_rclasses[] = 59*760Speter { 60*760Speter TINT , 61*760Speter TINT , 62*760Speter TINT , 63*760Speter TCHAR , 64*760Speter TBOOL , 65*760Speter TDOUBLE , 66*760Speter 0 67*760Speter }; 68*760Speter 69*760Speter long in_ranges[] = 70*760Speter { 71*760Speter -128L , 128L , 72*760Speter -32768L , 32767L , 73*760Speter -2147483648L , 2147483647L , 74*760Speter 0L , 127L , 75*760Speter 0L , 1L , 76*760Speter 0L , 0L /* fake for reals */ 77*760Speter }; 78*760Speter 79*760Speter /* 80*760Speter * built in constructed types 81*760Speter */ 82*760Speter char *in_ctypes[] = { 83*760Speter "Boolean" , 84*760Speter "intset" , 85*760Speter "alfa" , 86*760Speter "text" , 87*760Speter 0 88*760Speter }; 89*760Speter 90*760Speter /* 91*760Speter * built in variables 92*760Speter */ 93*760Speter char *in_vars[] = { 94*760Speter "input" , 95*760Speter "output" , 96*760Speter 0 97*760Speter }; 98*760Speter 99*760Speter /* 100*760Speter * built in functions 101*760Speter */ 102*760Speter char *in_funcs[] = 103*760Speter { 104*760Speter "abs" , 105*760Speter "arctan" , 106*760Speter "card" , 107*760Speter "chr" , 108*760Speter "clock" , 109*760Speter "cos" , 110*760Speter "eof" , 111*760Speter "eoln" , 112*760Speter "eos" , 113*760Speter "exp" , 114*760Speter "expo" , 115*760Speter "ln" , 116*760Speter "odd" , 117*760Speter "ord" , 118*760Speter "pred" , 119*760Speter "round" , 120*760Speter "sin" , 121*760Speter "sqr" , 122*760Speter "sqrt" , 123*760Speter "succ" , 124*760Speter "trunc" , 125*760Speter "undefined" , 126*760Speter /* 127*760Speter * Extensions 128*760Speter */ 129*760Speter "argc" , 130*760Speter "random" , 131*760Speter "seed" , 132*760Speter "wallclock" , 133*760Speter "sysclock" , 134*760Speter 0 135*760Speter }; 136*760Speter 137*760Speter /* 138*760Speter * Built-in procedures 139*760Speter */ 140*760Speter char *in_procs[] = 141*760Speter { 142*760Speter "date" , 143*760Speter "dispose" , 144*760Speter "flush" , 145*760Speter "get" , 146*760Speter "getseg" , 147*760Speter "halt" , 148*760Speter "linelimit" , 149*760Speter "message" , 150*760Speter "new" , 151*760Speter "pack" , 152*760Speter "page" , 153*760Speter "put" , 154*760Speter "putseg" , 155*760Speter "read" , 156*760Speter "readln" , 157*760Speter "remove" , 158*760Speter "reset" , 159*760Speter "rewrite" , 160*760Speter "time" , 161*760Speter "unpack" , 162*760Speter "write" , 163*760Speter "writeln" , 164*760Speter /* 165*760Speter * Extensions 166*760Speter */ 167*760Speter "argv" , 168*760Speter "null" , 169*760Speter "stlimit" , 170*760Speter 0 171*760Speter }; 172*760Speter 173*760Speter #ifndef PI0 174*760Speter /* 175*760Speter * and their opcodes 176*760Speter */ 177*760Speter int in_fops[] = 178*760Speter { 179*760Speter O_ABS2, 180*760Speter O_ATAN, 181*760Speter O_CARD|NSTAND, 182*760Speter O_CHR2, 183*760Speter O_CLCK|NSTAND, 184*760Speter O_COS, 185*760Speter O_EOF, 186*760Speter O_EOLN, 187*760Speter 0, 188*760Speter O_EXP, 189*760Speter O_EXPO|NSTAND, 190*760Speter O_LN, 191*760Speter O_ODD2, 192*760Speter O_ORD2, 193*760Speter O_PRED2, 194*760Speter O_ROUND, 195*760Speter O_SIN, 196*760Speter O_SQR2, 197*760Speter O_SQRT, 198*760Speter O_SUCC2, 199*760Speter O_TRUNC, 200*760Speter O_UNDEF|NSTAND, 201*760Speter /* 202*760Speter * Extensions 203*760Speter */ 204*760Speter O_ARGC|NSTAND, 205*760Speter O_RANDOM|NSTAND, 206*760Speter O_SEED|NSTAND, 207*760Speter O_WCLCK|NSTAND, 208*760Speter O_SCLCK|NSTAND 209*760Speter }; 210*760Speter 211*760Speter /* 212*760Speter * Built-in procedures 213*760Speter */ 214*760Speter int in_pops[] = 215*760Speter { 216*760Speter O_DATE|NSTAND, 217*760Speter O_DISPOSE, 218*760Speter O_FLUSH|NSTAND, 219*760Speter O_GET, 220*760Speter 0, 221*760Speter O_HALT|NSTAND, 222*760Speter O_LLIMIT|NSTAND, 223*760Speter O_MESSAGE|NSTAND, 224*760Speter O_NEW, 225*760Speter O_PACK, 226*760Speter O_PAGE, 227*760Speter O_PUT, 228*760Speter 0, 229*760Speter O_READ4, 230*760Speter O_READLN, 231*760Speter O_REMOVE|NSTAND, 232*760Speter O_RESET, 233*760Speter O_REWRITE, 234*760Speter O_TIME|NSTAND, 235*760Speter O_UNPACK, 236*760Speter O_WRITEF, 237*760Speter O_WRITLN, 238*760Speter /* 239*760Speter * Extensions 240*760Speter */ 241*760Speter O_ARGV|NSTAND, 242*760Speter O_ABORT|NSTAND, 243*760Speter O_STLIM|NSTAND 244*760Speter }; 245*760Speter #endif 246*760Speter 247*760Speter /* 248*760Speter * Initnl initializes the first namelist segment and then 249*760Speter * initializes the name list for block 0. 250*760Speter */ 251*760Speter initnl() 252*760Speter { 253*760Speter register char **cp; 254*760Speter register struct nl *np; 255*760Speter struct nl *fp; 256*760Speter int *ip; 257*760Speter long *lp; 258*760Speter 259*760Speter #ifdef DEBUG 260*760Speter if ( hp21mx ) 261*760Speter { 262*760Speter MININT = -32768.; 263*760Speter MAXINT = 32767.; 264*760Speter #ifndef PI0 265*760Speter genmx(); 266*760Speter #endif 267*760Speter } 268*760Speter #endif 269*760Speter ntab[0].nls_low = nl; 270*760Speter ntab[0].nls_high = &nl[INL]; 271*760Speter defnl ( 0 , 0 , 0 , 0 ); 272*760Speter 273*760Speter /* 274*760Speter * Types 275*760Speter */ 276*760Speter for ( cp = in_types ; *cp != 0 ; cp ++ ) 277*760Speter hdefnl ( *cp , TYPE , nlp , 0 ); 278*760Speter 279*760Speter /* 280*760Speter * Ranges 281*760Speter */ 282*760Speter lp = in_ranges; 283*760Speter for ( ip = in_rclasses ; *ip != 0 ; ip ++ ) 284*760Speter { 285*760Speter np = defnl ( 0 , RANGE , nl+(*ip) , 0 ); 286*760Speter nl[*ip].type = np; 287*760Speter np -> range[0] = *lp ++ ; 288*760Speter np -> range[1] = *lp ++ ; 289*760Speter 290*760Speter }; 291*760Speter 292*760Speter /* 293*760Speter * built in constructed types 294*760Speter */ 295*760Speter 296*760Speter cp = in_ctypes; 297*760Speter /* 298*760Speter * Boolean = boolean; 299*760Speter */ 300*760Speter hdefnl ( *cp++ , TYPE , nl+T1BOOL , 0 ); 301*760Speter 302*760Speter /* 303*760Speter * intset = set of 0 .. 127; 304*760Speter */ 305*760Speter intset = *cp++; 306*760Speter hdefnl( intset , TYPE , nlp+1 , 0 ); 307*760Speter defnl ( 0 , SET , nlp+1 , 0 ); 308*760Speter np = defnl ( 0 , RANGE , nl+TINT , 0 ); 309*760Speter np -> range[0] = 0L; 310*760Speter np -> range[1] = 127L; 311*760Speter 312*760Speter /* 313*760Speter * alfa = array [ 1 .. 10 ] of char; 314*760Speter */ 315*760Speter np = defnl ( 0 , RANGE , nl+TINT , 0 ); 316*760Speter np -> range[0] = 1L; 317*760Speter np -> range[1] = 10L; 318*760Speter defnl ( 0 , ARRAY , nl+T1CHAR , 1 ) -> chain = np; 319*760Speter hdefnl ( *cp++ , TYPE , nlp-1 , 0 ); 320*760Speter 321*760Speter /* 322*760Speter * text = file of char; 323*760Speter */ 324*760Speter hdefnl ( *cp++ , TYPE , nlp+1 , 0 ); 325*760Speter np = defnl ( 0 , FILET , nl+T1CHAR , 0 ); 326*760Speter np -> nl_flags |= NFILES; 327*760Speter 328*760Speter /* 329*760Speter * input,output : text; 330*760Speter */ 331*760Speter cp = in_vars; 332*760Speter # ifndef PI0 333*760Speter input = hdefnl ( *cp++ , VAR , np , INPUT_OFF ); 334*760Speter output = hdefnl ( *cp++ , VAR , np , OUTPUT_OFF ); 335*760Speter # else 336*760Speter input = hdefnl ( *cp++ , VAR , np , 0 ); 337*760Speter output = hdefnl ( *cp++ , VAR , np , 0 ); 338*760Speter # endif 339*760Speter 340*760Speter /* 341*760Speter * built in constants 342*760Speter */ 343*760Speter cp = in_consts; 344*760Speter np = hdefnl ( *cp++ , CONST , nl + TBOOL , 1 ); 345*760Speter fp = hdefnl ( *cp++ , CONST , nl + TBOOL , 0 ); 346*760Speter (nl + TBOOL)->chain = fp; 347*760Speter fp->chain = np; 348*760Speter np = hdefnl ( *cp++ , CONST , nl + TBOOL , 1 ); 349*760Speter fp = hdefnl ( *cp++ , CONST , nl + TBOOL , 0 ); 350*760Speter fp->chain = np; 351*760Speter if (opt('s')) 352*760Speter (nl + TBOOL)->chain = fp; 353*760Speter hdefnl ( *cp++ , CONST , nl + T4INT , 0 ) -> range[0] = MININT; 354*760Speter hdefnl ( *cp++ , CONST , nl + T4INT , 0 ) -> range[0] = MAXINT; 355*760Speter hdefnl ( *cp++ , CONST , nl + T1CHAR , 0 ); 356*760Speter hdefnl ( *cp++ , CONST , nl + T1CHAR , 127 ); 357*760Speter hdefnl ( *cp++ , CONST , nl + T1CHAR , '\007' ); 358*760Speter hdefnl ( *cp++ , CONST , nl + T1CHAR , '\t' ); 359*760Speter 360*760Speter /* 361*760Speter * Built-in functions and procedures 362*760Speter */ 363*760Speter #ifndef PI0 364*760Speter ip = in_fops; 365*760Speter for ( cp = in_funcs ; *cp != 0 ; cp ++ ) 366*760Speter hdefnl ( *cp , FUNC , 0 , * ip ++ ); 367*760Speter ip = in_pops; 368*760Speter for ( cp = in_procs ; *cp != 0 ; cp ++ ) 369*760Speter hdefnl ( *cp , PROC , 0 , * ip ++ ); 370*760Speter #else 371*760Speter for ( cp = in_funcs ; *cp != 0 ; cp ++ ) 372*760Speter hdefnl ( *cp , FUNC , 0 , 0 ); 373*760Speter for ( cp = in_procs ; *cp != 0 , cp ++ ) 374*760Speter hdefnl ( *cp , PROC , 0 , 0 ); 375*760Speter #endif 376*760Speter # ifdef PTREE 377*760Speter pTreeInit(); 378*760Speter # endif 379*760Speter } 380*760Speter 381*760Speter struct nl * 382*760Speter hdefnl(sym, cls, typ, val) 383*760Speter { 384*760Speter register struct nl *p; 385*760Speter 386*760Speter #ifndef PI1 387*760Speter if (sym) 388*760Speter hash(sym, 0); 389*760Speter #endif 390*760Speter p = defnl(sym, cls, typ, val); 391*760Speter if (sym) 392*760Speter enter(p); 393*760Speter return (p); 394*760Speter } 395*760Speter 396*760Speter /* 397*760Speter * Free up the name list segments 398*760Speter * at the end of a statement/proc/func 399*760Speter * All segments are freed down to the one in which 400*760Speter * p points. 401*760Speter */ 402*760Speter nlfree(p) 403*760Speter struct nl *p; 404*760Speter { 405*760Speter 406*760Speter nlp = p; 407*760Speter while (nlact->nls_low > nlp || nlact->nls_high < nlp) { 408*760Speter free(nlact->nls_low); 409*760Speter nlact->nls_low = NIL; 410*760Speter nlact->nls_high = NIL; 411*760Speter --nlact; 412*760Speter if (nlact < &ntab[0]) 413*760Speter panic("nlfree"); 414*760Speter } 415*760Speter } 416*760Speter 417*760Speter 418*760Speter char *VARIABLE = "variable"; 419*760Speter 420*760Speter char *classes[ ] = { 421*760Speter "undefined", 422*760Speter "constant", 423*760Speter "type", 424*760Speter "variable", /* VARIABLE */ 425*760Speter "array", 426*760Speter "pointer or file", 427*760Speter "record", 428*760Speter "field", 429*760Speter "procedure", 430*760Speter "function", 431*760Speter "variable", /* VARIABLE */ 432*760Speter "variable", /* VARIABLE */ 433*760Speter "pointer", 434*760Speter "file", 435*760Speter "set", 436*760Speter "subrange", 437*760Speter "label", 438*760Speter "withptr", 439*760Speter "scalar", 440*760Speter "string", 441*760Speter "program", 442*760Speter "improper" 443*760Speter #ifdef DEBUG 444*760Speter ,"variant" 445*760Speter #endif 446*760Speter }; 447*760Speter 448*760Speter char *snark = "SNARK"; 449*760Speter 450*760Speter #ifdef PI 451*760Speter #ifdef DEBUG 452*760Speter char *ctext[] = 453*760Speter { 454*760Speter "BADUSE", 455*760Speter "CONST", 456*760Speter "TYPE", 457*760Speter "VAR", 458*760Speter "ARRAY", 459*760Speter "PTRFILE", 460*760Speter "RECORD", 461*760Speter "FIELD", 462*760Speter "PROC", 463*760Speter "FUNC", 464*760Speter "FVAR", 465*760Speter "REF", 466*760Speter "PTR", 467*760Speter "FILET", 468*760Speter "SET", 469*760Speter "RANGE", 470*760Speter "LABEL", 471*760Speter "WITHPTR", 472*760Speter "SCAL", 473*760Speter "STR", 474*760Speter "PROG", 475*760Speter "IMPROPER", 476*760Speter "VARNT" 477*760Speter }; 478*760Speter 479*760Speter char *stars = "\t***"; 480*760Speter 481*760Speter /* 482*760Speter * Dump the namelist from the 483*760Speter * current nlp down to 'to'. 484*760Speter * All the namelist is dumped if 485*760Speter * to is NIL. 486*760Speter */ 487*760Speter dumpnl(to, rout) 488*760Speter struct nl *to; 489*760Speter { 490*760Speter register struct nl *p; 491*760Speter register int j; 492*760Speter struct nls *nlsp; 493*760Speter int i, v, head; 494*760Speter 495*760Speter if (opt('y') == 0) 496*760Speter return; 497*760Speter if (to != NIL) 498*760Speter printf("\n\"%s\" Block=%d\n", rout, cbn); 499*760Speter nlsp = nlact; 500*760Speter head = NIL; 501*760Speter for (p = nlp; p != to;) { 502*760Speter if (p == nlsp->nls_low) { 503*760Speter if (nlsp == &ntab[0]) 504*760Speter break; 505*760Speter nlsp--; 506*760Speter p = nlsp->nls_high; 507*760Speter } 508*760Speter p--; 509*760Speter if (head == NIL) { 510*760Speter printf("\tName\tClass Bn+Flags\tType\tVal\tChn\n"); 511*760Speter head++; 512*760Speter } 513*760Speter printf("%3d:", nloff(p)); 514*760Speter if (p->symbol) 515*760Speter printf("\t%.7s", p->symbol); 516*760Speter else 517*760Speter printf(stars); 518*760Speter if (p->class) 519*760Speter printf("\t%s", ctext[p->class]); 520*760Speter else 521*760Speter printf(stars); 522*760Speter if (p->nl_flags) { 523*760Speter pchr('\t'); 524*760Speter if (p->nl_flags & 037) 525*760Speter printf("%d ", p->nl_flags & 037); 526*760Speter #ifndef PI0 527*760Speter if (p->nl_flags & NMOD) 528*760Speter pchr('M'); 529*760Speter if (p->nl_flags & NUSED) 530*760Speter pchr('U'); 531*760Speter #endif 532*760Speter if (p->nl_flags & NFILES) 533*760Speter pchr('F'); 534*760Speter } else 535*760Speter printf(stars); 536*760Speter if (p->type) 537*760Speter printf("\t[%d]", nloff(p->type)); 538*760Speter else 539*760Speter printf(stars); 540*760Speter v = p->value[0]; 541*760Speter switch (p->class) { 542*760Speter case TYPE: 543*760Speter break; 544*760Speter case VARNT: 545*760Speter goto con; 546*760Speter case CONST: 547*760Speter switch (nloff(p->type)) { 548*760Speter default: 549*760Speter printf("\t%d", v); 550*760Speter break; 551*760Speter case TDOUBLE: 552*760Speter printf("\t%f", p->real); 553*760Speter break; 554*760Speter case TINT: 555*760Speter case T4INT: 556*760Speter con: 557*760Speter printf("\t%ld", p->range[0]); 558*760Speter break; 559*760Speter case TSTR: 560*760Speter printf("\t'%s'", p->ptr[0]); 561*760Speter break; 562*760Speter } 563*760Speter break; 564*760Speter case VAR: 565*760Speter case REF: 566*760Speter case WITHPTR: 567*760Speter printf("\t%d,%d", cbn, v); 568*760Speter break; 569*760Speter case SCAL: 570*760Speter case RANGE: 571*760Speter printf("\t%ld..%ld", p->range[0], p->range[1]); 572*760Speter break; 573*760Speter case RECORD: 574*760Speter printf("\t%d(%d)", v, p->value[NL_FLDSZ]); 575*760Speter break; 576*760Speter case FIELD: 577*760Speter printf("\t%d", v); 578*760Speter break; 579*760Speter case STR: 580*760Speter printf("\t|%d|", p->value[0]); 581*760Speter break; 582*760Speter case FVAR: 583*760Speter case FUNC: 584*760Speter case PROC: 585*760Speter case PROG: 586*760Speter if (cbn == 0) { 587*760Speter printf("\t<%o>", p->value[0] & 0377); 588*760Speter #ifndef PI0 589*760Speter if (p->value[0] & NSTAND) 590*760Speter printf("\tNSTAND"); 591*760Speter #endif 592*760Speter break; 593*760Speter } 594*760Speter v = p->value[1]; 595*760Speter default: 596*760Speter casedef: 597*760Speter if (v) 598*760Speter printf("\t<%d>", v); 599*760Speter else 600*760Speter printf(stars); 601*760Speter } 602*760Speter if (p->chain) 603*760Speter printf("\t[%d]", nloff(p->chain)); 604*760Speter switch (p->class) { 605*760Speter case RECORD: 606*760Speter if (p->ptr[NL_VARNT]) 607*760Speter printf("\tVARNT=[%d]", nloff(p->ptr[NL_VARNT])); 608*760Speter if (p->ptr[NL_TAG]) 609*760Speter printf(" TAG=[%d]", nloff(p->ptr[NL_TAG])); 610*760Speter break; 611*760Speter case VARNT: 612*760Speter printf("\tVTOREC=[%d]", nloff(p->ptr[NL_VTOREC])); 613*760Speter break; 614*760Speter } 615*760Speter # ifdef PTREE 616*760Speter pchr( '\t' ); 617*760Speter pPrintPointer( stdout , "%s" , p -> inTree ); 618*760Speter # endif 619*760Speter pchr('\n'); 620*760Speter } 621*760Speter if (head == 0) 622*760Speter printf("\tNo entries\n"); 623*760Speter } 624*760Speter #endif 625*760Speter 626*760Speter 627*760Speter /* 628*760Speter * Define a new name list entry 629*760Speter * with initial symbol, class, type 630*760Speter * and value[0] as given. A new name 631*760Speter * list segment is allocated to hold 632*760Speter * the next name list slot if necessary. 633*760Speter */ 634*760Speter struct nl * 635*760Speter defnl(sym, cls, typ, val) 636*760Speter char *sym; 637*760Speter int cls; 638*760Speter struct nl *typ; 639*760Speter int val; 640*760Speter { 641*760Speter register struct nl *p; 642*760Speter register int *q, i; 643*760Speter char *cp; 644*760Speter 645*760Speter p = nlp; 646*760Speter 647*760Speter /* 648*760Speter * Zero out this entry 649*760Speter */ 650*760Speter q = p; 651*760Speter i = (sizeof *p)/(sizeof (int)); 652*760Speter do 653*760Speter *q++ = 0; 654*760Speter while (--i); 655*760Speter 656*760Speter /* 657*760Speter * Insert the values 658*760Speter */ 659*760Speter p->symbol = sym; 660*760Speter p->class = cls; 661*760Speter p->type = typ; 662*760Speter p->nl_block = cbn; 663*760Speter p->value[0] = val; 664*760Speter 665*760Speter /* 666*760Speter * Insure that the next namelist 667*760Speter * entry actually exists. This is 668*760Speter * really not needed here, it would 669*760Speter * suffice to do it at entry if we 670*760Speter * need the slot. It is done this 671*760Speter * way because, historically, nlp 672*760Speter * always pointed at the next namelist 673*760Speter * slot. 674*760Speter */ 675*760Speter nlp++; 676*760Speter if (nlp >= nlact->nls_high) { 677*760Speter i = NLINC; 678*760Speter cp = malloc(NLINC * sizeof *nlp); 679*760Speter if (cp == -1) { 680*760Speter i = NLINC / 2; 681*760Speter cp = malloc((NLINC / 2) * sizeof *nlp); 682*760Speter } 683*760Speter if (cp == -1) { 684*760Speter error("Ran out of memory (defnl)"); 685*760Speter pexit(DIED); 686*760Speter } 687*760Speter nlact++; 688*760Speter if (nlact >= &ntab[MAXNL]) { 689*760Speter error("Ran out of name list tables"); 690*760Speter pexit(DIED); 691*760Speter } 692*760Speter nlp = cp; 693*760Speter nlact->nls_low = nlp; 694*760Speter nlact->nls_high = nlact->nls_low + i; 695*760Speter } 696*760Speter return (p); 697*760Speter } 698*760Speter 699*760Speter /* 700*760Speter * Make a duplicate of the argument 701*760Speter * namelist entry for, e.g., type 702*760Speter * declarations of the form 'type a = b' 703*760Speter * and array indicies. 704*760Speter */ 705*760Speter struct nl * 706*760Speter nlcopy(p) 707*760Speter struct nl *p; 708*760Speter { 709*760Speter register int *p1, *p2, i; 710*760Speter 711*760Speter p1 = p; 712*760Speter p = p2 = defnl(0, 0, 0, 0); 713*760Speter i = (sizeof *p)/(sizeof (int)); 714*760Speter do 715*760Speter *p2++ = *p1++; 716*760Speter while (--i); 717*760Speter p->chain = NIL; 718*760Speter return (p); 719*760Speter } 720*760Speter 721*760Speter /* 722*760Speter * Compute a namelist offset 723*760Speter */ 724*760Speter nloff(p) 725*760Speter struct nl *p; 726*760Speter { 727*760Speter 728*760Speter return (p - nl); 729*760Speter } 730*760Speter 731*760Speter /* 732*760Speter * Enter a symbol into the block 733*760Speter * symbol table. Symbols are hashed 734*760Speter * 64 ways based on low 6 bits of the 735*760Speter * character pointer into the string 736*760Speter * table. 737*760Speter */ 738*760Speter struct nl * 739*760Speter enter(np) 740*760Speter struct nl *np; 741*760Speter { 742*760Speter register struct nl *rp, *hp; 743*760Speter register struct nl *p; 744*760Speter int i; 745*760Speter 746*760Speter rp = np; 747*760Speter if (rp == NIL) 748*760Speter return (NIL); 749*760Speter #ifndef PI1 750*760Speter if (cbn > 0) 751*760Speter if (rp->symbol == input->symbol || rp->symbol == output->symbol) 752*760Speter error("Pre-defined files input and output must not be redefined"); 753*760Speter #endif 754*760Speter i = rp->symbol; 755*760Speter i &= 077; 756*760Speter hp = disptab[i]; 757*760Speter if (rp->class != BADUSE && rp->class != FIELD) 758*760Speter for (p = hp; p != NIL && (p->nl_block & 037) == cbn; p = p->nl_next) 759*760Speter if (p->symbol == rp->symbol && p->class != BADUSE && p->class != FIELD) { 760*760Speter #ifndef PI1 761*760Speter error("%s is already defined in this block", rp->symbol); 762*760Speter #endif 763*760Speter break; 764*760Speter 765*760Speter } 766*760Speter rp->nl_next = hp; 767*760Speter disptab[i] = rp; 768*760Speter return (rp); 769*760Speter } 770*760Speter #endif 771