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