|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.