xref: /csrg-svn/usr.bin/pascal/src/lookup.c (revision 62213)
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)25757Speter lookup(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)61757Speter lookup1(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)110757Speter nlfund(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