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