1757Speter /* Copyright (c) 1979 Regents of the University of California */ 2757Speter 3*14734Sthien #ifndef lint 4*14734Sthien static char sccsid[] = "@(#)lookup.c 1.3 08/19/83"; 5*14734Sthien #endif 6757Speter 7757Speter #include "whoami.h" 8757Speter #include "0.h" 9757Speter 107926Smckusick struct nl *disptab[077+1]; 117926Smckusick 12757Speter /* 13757Speter * Lookup is called to 14757Speter * find a symbol in the 15757Speter * block structure symbol 16757Speter * table and returns a pointer to 17757Speter * its namelist entry. 18757Speter */ 19757Speter struct nl * 20757Speter lookup(s) 21757Speter register char *s; 22757Speter { 23757Speter register struct nl *p; 24*14734Sthien register struct udinfo; 25757Speter 26757Speter if (s == NIL) { 27757Speter nocascade(); 28*14734Sthien return (NLNIL); 29757Speter } 30757Speter p = lookup1(s); 31*14734Sthien if (p == NLNIL) { 32757Speter derror("%s is undefined", s); 33*14734Sthien return (NLNIL); 34757Speter } 35757Speter if (p->class == FVAR) { 36757Speter p = p->chain; 37757Speter bn--; 38757Speter } 39757Speter return (p); 40757Speter } 41757Speter 42757Speter #ifndef PI0 43757Speter int flagwas; 44757Speter #endif 45757Speter /* 46757Speter * Lookup1 is an internal lookup. 47757Speter * It is not an error to call lookup1 48757Speter * if the symbol is not defined. Also 49757Speter * lookup1 will return FVARs while 50757Speter * lookup never will, thus asgnop 51757Speter * calls it when it thinks you are 52757Speter * assigning to the function variable. 53757Speter */ 54757Speter 55757Speter struct nl * 56757Speter lookup1(s) 57757Speter register char *s; 58757Speter { 59757Speter register struct nl *p; 60757Speter #ifndef PI0 61757Speter register struct nl *q; 62757Speter #endif 63757Speter register int i; 64757Speter 65757Speter if (s == NIL) 66*14734Sthien return (NLNIL); 67757Speter bn = cbn; 68757Speter #ifndef PI0 69757Speter /* 70757Speter * We first check the field names 71757Speter * of the currently active with 72757Speter * statements (expensive since they 73757Speter * are not hashed). 74757Speter */ 75*14734Sthien for (p = withlist; p != NLNIL; p = p->nl_next) { 76757Speter q = p->type; 77*14734Sthien if (q == NLNIL) 78757Speter continue; 79757Speter if (reclook(q, s) != NIL) 80757Speter /* 81757Speter * Return the WITHPTR, lvalue understands. 82757Speter */ 83757Speter return (p); 84757Speter } 85757Speter #endif 86757Speter /* 87757Speter * Symbol table is a 64 way hash 88757Speter * on the low bits of the character 89757Speter * pointer value. (Simple, but effective) 90757Speter */ 91757Speter i = (int) s & 077; 92*14734Sthien for (p = disptab[i]; p != NLNIL; p = p->nl_next) 93757Speter if (p->symbol == s && p->class != FIELD && p->class != BADUSE) { 94757Speter bn = (p->nl_block & 037); 95757Speter #ifndef PI0 96757Speter flagwas = p->nl_flags; 97757Speter p->nl_flags |= NUSED; 98757Speter #endif 99757Speter return (p); 100757Speter } 101*14734Sthien return (NLNIL); 102757Speter } 103757Speter 104757Speter #ifndef PI01 105757Speter nlfund(sp) 106757Speter char *sp; 107757Speter { 108757Speter register struct nl *p; 109757Speter register int i; 110757Speter 111757Speter i = (int) sp & 077; 112*14734Sthien for (p = disptab[i]; p != NLNIL; p = p->nl_next) 113757Speter if (p->symbol == sp && (p->nl_block & 037) == 0) 114757Speter return (nloff(p)); 115757Speter return (0); 116757Speter } 117757Speter #endif 118