xref: /csrg-svn/usr.bin/pascal/src/lookup.c (revision 22174)
1*22174Sdist /*
2*22174Sdist  * Copyright (c) 1980 Regents of the University of California.
3*22174Sdist  * All rights reserved.  The Berkeley software License Agreement
4*22174Sdist  * specifies the terms and conditions for redistribution.
5*22174Sdist  */
6757Speter 
714734Sthien #ifndef lint
8*22174Sdist static char sccsid[] = "@(#)lookup.c	5.1 (Berkeley) 06/05/85";
9*22174Sdist #endif not lint
10757Speter 
11757Speter #include "whoami.h"
12757Speter #include "0.h"
13757Speter 
147926Smckusick struct nl *disptab[077+1];
157926Smckusick 
16757Speter /*
17757Speter  * Lookup is called to
18757Speter  * find a symbol in the
19757Speter  * block structure symbol
20757Speter  * table and returns a pointer to
21757Speter  * its namelist entry.
22757Speter  */
23757Speter struct nl *
24757Speter lookup(s)
25757Speter 	register char *s;
26757Speter {
27757Speter 	register struct nl *p;
2814734Sthien 	register struct udinfo;
29757Speter 
30757Speter 	if (s == NIL) {
31757Speter 		nocascade();
3214734Sthien 		return (NLNIL);
33757Speter 	}
34757Speter 	p = lookup1(s);
3514734Sthien 	if (p == NLNIL) {
36757Speter 		derror("%s is undefined", s);
3714734Sthien 		return (NLNIL);
38757Speter 	}
39757Speter 	if (p->class == FVAR) {
40757Speter 		p = p->chain;
41757Speter 		bn--;
42757Speter 	}
43757Speter 	return (p);
44757Speter }
45757Speter 
46757Speter #ifndef PI0
47757Speter int	flagwas;
48757Speter #endif
49757Speter /*
50757Speter  * Lookup1 is an internal lookup.
51757Speter  * It is not an error to call lookup1
52757Speter  * if the symbol is not defined.  Also
53757Speter  * lookup1 will return FVARs while
54757Speter  * lookup never will, thus asgnop
55757Speter  * calls it when it thinks you are
56757Speter  * assigning to the function variable.
57757Speter  */
58757Speter 
59757Speter struct nl *
60757Speter lookup1(s)
61757Speter 	register char *s;
62757Speter {
63757Speter 	register struct nl *p;
64757Speter #ifndef PI0
65757Speter 	register struct nl *q;
66757Speter #endif
67757Speter 	register int i;
68757Speter 
69757Speter 	if (s == NIL)
7014734Sthien 		return (NLNIL);
71757Speter 	bn = cbn;
72757Speter #ifndef PI0
73757Speter 	/*
74757Speter 	 * We first check the field names
75757Speter 	 * of the currently active with
76757Speter 	 * statements (expensive since they
77757Speter 	 * are not hashed).
78757Speter 	 */
7914734Sthien 	for (p = withlist; p != NLNIL; p = p->nl_next) {
80757Speter 		q = p->type;
8114734Sthien 		if (q == NLNIL)
82757Speter 			continue;
83757Speter 		if (reclook(q, s) != NIL)
84757Speter 			/*
85757Speter 			 * Return the WITHPTR, lvalue understands.
86757Speter 			 */
87757Speter 			return (p);
88757Speter 	}
89757Speter #endif
90757Speter 	/*
91757Speter 	 * Symbol table is a 64 way hash
92757Speter 	 * on the low bits of the character
93757Speter 	 * pointer value. (Simple, but effective)
94757Speter 	 */
95757Speter 	i = (int) s & 077;
9614734Sthien 	for (p = disptab[i]; p != NLNIL; p = p->nl_next)
97757Speter 		if (p->symbol == s && p->class != FIELD && p->class != BADUSE) {
98757Speter 			bn = (p->nl_block & 037);
99757Speter #ifndef PI0
100757Speter 			flagwas = p->nl_flags;
101757Speter 			p->nl_flags |= NUSED;
102757Speter #endif
103757Speter 			return (p);
104757Speter 		}
10514734Sthien 	return (NLNIL);
106757Speter }
107757Speter 
108757Speter #ifndef PI01
109757Speter nlfund(sp)
110757Speter 	char *sp;
111757Speter {
112757Speter 	register struct nl *p;
113757Speter 	register int i;
114757Speter 
115757Speter 	i = (int) sp & 077;
11614734Sthien 	for (p = disptab[i]; p != NLNIL; p = p->nl_next)
117757Speter 	if (p->symbol == sp && (p->nl_block & 037) == 0)
118757Speter 		return (nloff(p));
119757Speter 	return (0);
120757Speter }
121757Speter #endif
122