1*22174Sdist /* 2*22174Sdist * Copyright (c) 1980 Regents of the University of California. 3*22174Sdist * All rights reserved. The Berkeley software License Agreement 4*22174Sdist * specifies the terms and conditions for redistribution. 5*22174Sdist */ 6757Speter 714734Sthien #ifndef lint 8*22174Sdist static char sccsid[] = "@(#)lookup.c 5.1 (Berkeley) 06/05/85"; 9*22174Sdist #endif not lint 10757Speter 11757Speter #include "whoami.h" 12757Speter #include "0.h" 13757Speter 147926Smckusick struct nl *disptab[077+1]; 157926Smckusick 16757Speter /* 17757Speter * Lookup is called to 18757Speter * find a symbol in the 19757Speter * block structure symbol 20757Speter * table and returns a pointer to 21757Speter * its namelist entry. 22757Speter */ 23757Speter struct nl * 24757Speter lookup(s) 25757Speter register char *s; 26757Speter { 27757Speter register struct nl *p; 2814734Sthien register struct udinfo; 29757Speter 30757Speter if (s == NIL) { 31757Speter nocascade(); 3214734Sthien return (NLNIL); 33757Speter } 34757Speter p = lookup1(s); 3514734Sthien if (p == NLNIL) { 36757Speter derror("%s is undefined", s); 3714734Sthien return (NLNIL); 38757Speter } 39757Speter if (p->class == FVAR) { 40757Speter p = p->chain; 41757Speter bn--; 42757Speter } 43757Speter return (p); 44757Speter } 45757Speter 46757Speter #ifndef PI0 47757Speter int flagwas; 48757Speter #endif 49757Speter /* 50757Speter * Lookup1 is an internal lookup. 51757Speter * It is not an error to call lookup1 52757Speter * if the symbol is not defined. Also 53757Speter * lookup1 will return FVARs while 54757Speter * lookup never will, thus asgnop 55757Speter * calls it when it thinks you are 56757Speter * assigning to the function variable. 57757Speter */ 58757Speter 59757Speter struct nl * 60757Speter lookup1(s) 61757Speter register char *s; 62757Speter { 63757Speter register struct nl *p; 64757Speter #ifndef PI0 65757Speter register struct nl *q; 66757Speter #endif 67757Speter register int i; 68757Speter 69757Speter if (s == NIL) 7014734Sthien return (NLNIL); 71757Speter bn = cbn; 72757Speter #ifndef PI0 73757Speter /* 74757Speter * We first check the field names 75757Speter * of the currently active with 76757Speter * statements (expensive since they 77757Speter * are not hashed). 78757Speter */ 7914734Sthien for (p = withlist; p != NLNIL; p = p->nl_next) { 80757Speter q = p->type; 8114734Sthien if (q == NLNIL) 82757Speter continue; 83757Speter if (reclook(q, s) != NIL) 84757Speter /* 85757Speter * Return the WITHPTR, lvalue understands. 86757Speter */ 87757Speter return (p); 88757Speter } 89757Speter #endif 90757Speter /* 91757Speter * Symbol table is a 64 way hash 92757Speter * on the low bits of the character 93757Speter * pointer value. (Simple, but effective) 94757Speter */ 95757Speter i = (int) s & 077; 9614734Sthien for (p = disptab[i]; p != NLNIL; p = p->nl_next) 97757Speter if (p->symbol == s && p->class != FIELD && p->class != BADUSE) { 98757Speter bn = (p->nl_block & 037); 99757Speter #ifndef PI0 100757Speter flagwas = p->nl_flags; 101757Speter p->nl_flags |= NUSED; 102757Speter #endif 103757Speter return (p); 104757Speter } 10514734Sthien return (NLNIL); 106757Speter } 107757Speter 108757Speter #ifndef PI01 109757Speter nlfund(sp) 110757Speter char *sp; 111757Speter { 112757Speter register struct nl *p; 113757Speter register int i; 114757Speter 115757Speter i = (int) sp & 077; 11614734Sthien for (p = disptab[i]; p != NLNIL; p = p->nl_next) 117757Speter if (p->symbol == sp && (p->nl_block & 037) == 0) 118757Speter return (nloff(p)); 119757Speter return (0); 120757Speter } 121757Speter #endif 122