# 2.11BSD#431 - /usr/src/ucb/PORT/pascal/pdx/sym/which.c

##### Functions

    findclass         X
    findsym           X
    which             X

       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

- in /usr/src/ucb/PORT/pascal/pdx/sym/tree.c line 299

findsym defined in line 65; used 2 times

- in line 48
- in /usr/src/ucb/PORT/pascal/pdx/sym/tree.c line 290

which defined in line 31; used 2 times

- in /usr/src/ucb/PORT/pascal/pdx/sym/tree.c line 48, 55

#### 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: 727 |