xref: /csrg-svn/usr.bin/pascal/src/lookup.c (revision 7926)
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