|
|
1.1 ! root 1: /* Copyright (c) 1979 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)lookup.c 1.1 8/27/80"; ! 4: ! 5: #include "whoami.h" ! 6: #include "0.h" ! 7: ! 8: /* ! 9: * Lookup is called to ! 10: * find a symbol in the ! 11: * block structure symbol ! 12: * table and returns a pointer to ! 13: * its namelist entry. ! 14: */ ! 15: struct nl * ! 16: lookup(s) ! 17: register char *s; ! 18: { ! 19: register struct nl *p; ! 20: register struct udinfo *udp; ! 21: ! 22: if (s == NIL) { ! 23: nocascade(); ! 24: return (NIL); ! 25: } ! 26: p = lookup1(s); ! 27: if (p == NIL) { ! 28: derror("%s is undefined", s); ! 29: return (NIL); ! 30: } ! 31: if (p->class == FVAR) { ! 32: p = p->chain; ! 33: bn--; ! 34: } ! 35: return (p); ! 36: } ! 37: ! 38: #ifndef PI0 ! 39: int flagwas; ! 40: #endif ! 41: /* ! 42: * Lookup1 is an internal lookup. ! 43: * It is not an error to call lookup1 ! 44: * if the symbol is not defined. Also ! 45: * lookup1 will return FVARs while ! 46: * lookup never will, thus asgnop ! 47: * calls it when it thinks you are ! 48: * assigning to the function variable. ! 49: */ ! 50: ! 51: struct nl * ! 52: lookup1(s) ! 53: register char *s; ! 54: { ! 55: register struct nl *p; ! 56: #ifndef PI0 ! 57: register struct nl *q; ! 58: #endif ! 59: register int i; ! 60: ! 61: if (s == NIL) ! 62: return (NIL); ! 63: bn = cbn; ! 64: #ifndef PI0 ! 65: /* ! 66: * We first check the field names ! 67: * of the currently active with ! 68: * statements (expensive since they ! 69: * are not hashed). ! 70: */ ! 71: for (p = withlist; p != NIL; p = p->nl_next) { ! 72: q = p->type; ! 73: if (q == NIL) ! 74: continue; ! 75: if (reclook(q, s) != NIL) ! 76: /* ! 77: * Return the WITHPTR, lvalue understands. ! 78: */ ! 79: return (p); ! 80: } ! 81: #endif ! 82: /* ! 83: * Symbol table is a 64 way hash ! 84: * on the low bits of the character ! 85: * pointer value. (Simple, but effective) ! 86: */ ! 87: i = (int) s & 077; ! 88: for (p = disptab[i]; p != NIL; p = p->nl_next) ! 89: if (p->symbol == s && p->class != FIELD && p->class != BADUSE) { ! 90: bn = (p->nl_block & 037); ! 91: #ifndef PI0 ! 92: flagwas = p->nl_flags; ! 93: p->nl_flags |= NUSED; ! 94: #endif ! 95: return (p); ! 96: } ! 97: return (NIL); ! 98: } ! 99: ! 100: #ifndef PI01 ! 101: nlfund(sp) ! 102: char *sp; ! 103: { ! 104: register struct nl *p; ! 105: register int i; ! 106: ! 107: i = (int) sp & 077; ! 108: for (p = disptab[i]; p != NIL; p = p->nl_next) ! 109: if (p->symbol == sp && (p->nl_block & 037) == 0) ! 110: return (nloff(p)); ! 111: return (0); ! 112: } ! 113: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.