148116Sbostic /*- 2*62213Sbostic * Copyright (c) 1980, 1993 3*62213Sbostic * The Regents of the University of California. All rights reserved. 448116Sbostic * 548116Sbostic * %sccs.include.redist.c% 622174Sdist */ 7757Speter 814734Sthien #ifndef lint 9*62213Sbostic static char sccsid[] = "@(#)lookup.c 8.1 (Berkeley) 06/06/93"; 1048116Sbostic #endif /* not lint */ 11757Speter 12757Speter #include "whoami.h" 13757Speter #include "0.h" 14757Speter 157926Smckusick struct nl *disptab[077+1]; 167926Smckusick 17757Speter /* 18757Speter * Lookup is called to 19757Speter * find a symbol in the 20757Speter * block structure symbol 21757Speter * table and returns a pointer to 22757Speter * its namelist entry. 23757Speter */ 24757Speter struct nl * lookup(s)25757Speterlookup(s) 26757Speter register char *s; 27757Speter { 28757Speter register struct nl *p; 2914734Sthien register struct udinfo; 30757Speter 31757Speter if (s == NIL) { 32757Speter nocascade(); 3314734Sthien return (NLNIL); 34757Speter } 35757Speter p = lookup1(s); 3614734Sthien if (p == NLNIL) { 37757Speter derror("%s is undefined", s); 3814734Sthien return (NLNIL); 39757Speter } 40757Speter if (p->class == FVAR) { 41757Speter p = p->chain; 42757Speter bn--; 43757Speter } 44757Speter return (p); 45757Speter } 46757Speter 47757Speter #ifndef PI0 48757Speter int flagwas; 49757Speter #endif 50757Speter /* 51757Speter * Lookup1 is an internal lookup. 52757Speter * It is not an error to call lookup1 53757Speter * if the symbol is not defined. Also 54757Speter * lookup1 will return FVARs while 55757Speter * lookup never will, thus asgnop 56757Speter * calls it when it thinks you are 57757Speter * assigning to the function variable. 58757Speter */ 59757Speter 60757Speter struct nl * lookup1(s)61757Speterlookup1(s) 62757Speter register char *s; 63757Speter { 64757Speter register struct nl *p; 65757Speter #ifndef PI0 66757Speter register struct nl *q; 67757Speter #endif 68757Speter register int i; 69757Speter 70757Speter if (s == NIL) 7114734Sthien return (NLNIL); 72757Speter bn = cbn; 73757Speter #ifndef PI0 74757Speter /* 75757Speter * We first check the field names 76757Speter * of the currently active with 77757Speter * statements (expensive since they 78757Speter * are not hashed). 79757Speter */ 8014734Sthien for (p = withlist; p != NLNIL; p = p->nl_next) { 81757Speter q = p->type; 8214734Sthien if (q == NLNIL) 83757Speter continue; 84757Speter if (reclook(q, s) != NIL) 85757Speter /* 86757Speter * Return the WITHPTR, lvalue understands. 87757Speter */ 88757Speter return (p); 89757Speter } 90757Speter #endif 91757Speter /* 92757Speter * Symbol table is a 64 way hash 93757Speter * on the low bits of the character 94757Speter * pointer value. (Simple, but effective) 95757Speter */ 96757Speter i = (int) s & 077; 9714734Sthien for (p = disptab[i]; p != NLNIL; p = p->nl_next) 98757Speter if (p->symbol == s && p->class != FIELD && p->class != BADUSE) { 99757Speter bn = (p->nl_block & 037); 100757Speter #ifndef PI0 101757Speter flagwas = p->nl_flags; 102757Speter p->nl_flags |= NUSED; 103757Speter #endif 104757Speter return (p); 105757Speter } 10614734Sthien return (NLNIL); 107757Speter } 108757Speter 109757Speter #ifndef PI01 nlfund(sp)110757Speternlfund(sp) 111757Speter char *sp; 112757Speter { 113757Speter register struct nl *p; 114757Speter register int i; 115757Speter 116757Speter i = (int) sp & 077; 11714734Sthien for (p = disptab[i]; p != NLNIL; p = p->nl_next) 118757Speter if (p->symbol == sp && (p->nl_block & 037) == 0) 119757Speter return (nloff(p)); 120757Speter return (0); 121757Speter } 122757Speter #endif 123