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