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

findclass defined in line 88; used 1 times
findsym defined in line 65; used 2 times
which defined in line 31; used 2 times

Defined variables

sccsid defined in line 8; never used
Last modified: 1985-06-06
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2201
Valid CSS Valid XHTML 1.0 Strict