xref: /csrg-svn/usr.bin/pascal/src/lookup.c (revision 14734)
1757Speter /* Copyright (c) 1979 Regents of the University of California */
2757Speter 
3*14734Sthien #ifndef lint
4*14734Sthien static	char sccsid[] = "@(#)lookup.c 1.3 08/19/83";
5*14734Sthien #endif
6757Speter 
7757Speter #include "whoami.h"
8757Speter #include "0.h"
9757Speter 
107926Smckusick struct nl *disptab[077+1];
117926Smckusick 
12757Speter /*
13757Speter  * Lookup is called to
14757Speter  * find a symbol in the
15757Speter  * block structure symbol
16757Speter  * table and returns a pointer to
17757Speter  * its namelist entry.
18757Speter  */
19757Speter struct nl *
20757Speter lookup(s)
21757Speter 	register char *s;
22757Speter {
23757Speter 	register struct nl *p;
24*14734Sthien 	register struct udinfo;
25757Speter 
26757Speter 	if (s == NIL) {
27757Speter 		nocascade();
28*14734Sthien 		return (NLNIL);
29757Speter 	}
30757Speter 	p = lookup1(s);
31*14734Sthien 	if (p == NLNIL) {
32757Speter 		derror("%s is undefined", s);
33*14734Sthien 		return (NLNIL);
34757Speter 	}
35757Speter 	if (p->class == FVAR) {
36757Speter 		p = p->chain;
37757Speter 		bn--;
38757Speter 	}
39757Speter 	return (p);
40757Speter }
41757Speter 
42757Speter #ifndef PI0
43757Speter int	flagwas;
44757Speter #endif
45757Speter /*
46757Speter  * Lookup1 is an internal lookup.
47757Speter  * It is not an error to call lookup1
48757Speter  * if the symbol is not defined.  Also
49757Speter  * lookup1 will return FVARs while
50757Speter  * lookup never will, thus asgnop
51757Speter  * calls it when it thinks you are
52757Speter  * assigning to the function variable.
53757Speter  */
54757Speter 
55757Speter struct nl *
56757Speter lookup1(s)
57757Speter 	register char *s;
58757Speter {
59757Speter 	register struct nl *p;
60757Speter #ifndef PI0
61757Speter 	register struct nl *q;
62757Speter #endif
63757Speter 	register int i;
64757Speter 
65757Speter 	if (s == NIL)
66*14734Sthien 		return (NLNIL);
67757Speter 	bn = cbn;
68757Speter #ifndef PI0
69757Speter 	/*
70757Speter 	 * We first check the field names
71757Speter 	 * of the currently active with
72757Speter 	 * statements (expensive since they
73757Speter 	 * are not hashed).
74757Speter 	 */
75*14734Sthien 	for (p = withlist; p != NLNIL; p = p->nl_next) {
76757Speter 		q = p->type;
77*14734Sthien 		if (q == NLNIL)
78757Speter 			continue;
79757Speter 		if (reclook(q, s) != NIL)
80757Speter 			/*
81757Speter 			 * Return the WITHPTR, lvalue understands.
82757Speter 			 */
83757Speter 			return (p);
84757Speter 	}
85757Speter #endif
86757Speter 	/*
87757Speter 	 * Symbol table is a 64 way hash
88757Speter 	 * on the low bits of the character
89757Speter 	 * pointer value. (Simple, but effective)
90757Speter 	 */
91757Speter 	i = (int) s & 077;
92*14734Sthien 	for (p = disptab[i]; p != NLNIL; p = p->nl_next)
93757Speter 		if (p->symbol == s && p->class != FIELD && p->class != BADUSE) {
94757Speter 			bn = (p->nl_block & 037);
95757Speter #ifndef PI0
96757Speter 			flagwas = p->nl_flags;
97757Speter 			p->nl_flags |= NUSED;
98757Speter #endif
99757Speter 			return (p);
100757Speter 		}
101*14734Sthien 	return (NLNIL);
102757Speter }
103757Speter 
104757Speter #ifndef PI01
105757Speter nlfund(sp)
106757Speter 	char *sp;
107757Speter {
108757Speter 	register struct nl *p;
109757Speter 	register int i;
110757Speter 
111757Speter 	i = (int) sp & 077;
112*14734Sthien 	for (p = disptab[i]; p != NLNIL; p = p->nl_next)
113757Speter 	if (p->symbol == sp && (p->nl_block & 037) == 0)
114757Speter 		return (nloff(p));
115757Speter 	return (0);
116757Speter }
117757Speter #endif
118