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