Annotation of 43BSDReno/pgrm/pascal/pdx/sym/which.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.