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[] = "@(#)which.c 5.1 (Berkeley) 6/6/85";
9: #endif not lint
10:
11: /*
12: * Routines to distinguish symbols of the same name.
13: */
14:
15: #include "defs.h"
16: #include "sym.h"
17: #include "classes.h"
18: #include "symtab.h"
19: #include "mappings.h"
20: #include "machine.h"
21: #include "sym.rep"
22:
23: /*
24: * Figure out the "current" symbol being referred to,
25: * this is either the active one or the most visible from the
26: * current scope.
27: *
28: * Fields are purposely ignored; these can be gotten to via "findclass".
29: */
30:
31: SYM *which(s)
32: SYM *s;
33: {
34: register SYM *p, *t, *f;
35:
36: if (s == program || isbuiltin(s)) {
37: return(s);
38: }
39: if (!isactive(program)) {
40: f = program;
41: } else {
42: f = whatblock(pc);
43: if (f == NIL) {
44: panic("no block for addr 0x%x", pc);
45: }
46: }
47: for (p = f; p != NIL; p = p->func) {
48: if ((t = findsym(s, p)) != NIL) {
49: break;
50: }
51: }
52: if (t == NIL) {
53: error("\"%s\" is not known in \"%s\"", s->symbol, f->symbol);
54: }
55: return(t);
56: }
57:
58: /*
59: * Find a (non-field) symbol with name s->symbol belonging to block f.
60: *
61: * Parameters to the main program are purposely "not found" because
62: * pi gives them no type.
63: */
64:
65: SYM *findsym(s, f)
66: SYM *s;
67: SYM *f;
68: {
69: register SYM *t;
70:
71: if (!isblock(f)) {
72: error("%s is not a block", f->symbol);
73: }
74: for (t = s; t != NIL; t = t->next_sym) {
75: if (t->func == f && !(f == program && isparam(t)) &&
76: t->class != FIELD && streq(t->symbol, s->symbol)) {
77: break;
78: }
79: }
80: return(t);
81: }
82:
83: /*
84: * Find the symbol which is has the same name and scope as the
85: * given symbol but is of the given field. Return NIL if there is none.
86: */
87:
88: SYM *findclass(s, cl)
89: SYM *s;
90: char cl;
91: {
92: register SYM *t;
93:
94: if (s->class == cl) {
95: return(s);
96: }
97: t = st_lookup(symtab, s->symbol);
98: while (t != NIL && (t->class != cl || t->func != s->func ||
99: !streq(s->symbol, t->symbol))) {
100: t = t->next_sym;
101: }
102: return(t);
103: }
Defined functions
which
defined in line
31; used 2 times
Defined variables
sccsid
defined in line
8;
never used