Annotation of 42BSD/ucb/pascal/pdx/sym/predicates.c, revision 1.1

1.1     ! root        1: /* Copyright (c) 1982 Regents of the University of California */
        !             2: 
        !             3: static char sccsid[] = "@(#)predicates.c 1.4 4/23/82";
        !             4: 
        !             5: /*
        !             6:  * The basic tests on a symbol.
        !             7:  */
        !             8: 
        !             9: #include "defs.h"
        !            10: #include "sym.h"
        !            11: #include "symtab.h"
        !            12: #include "btypes.h"
        !            13: #include "classes.h"
        !            14: #include "sym.rep"
        !            15: 
        !            16: /*
        !            17:  * Test if a symbol is a parameter.  This is true if there
        !            18:  * is a cycle from s->func to s via chain pointers.
        !            19:  */
        !            20: 
        !            21: BOOLEAN isparam(s)
        !            22: SYM *s;
        !            23: {
        !            24:     register SYM *t;
        !            25: 
        !            26:     for (t = s->func; t != NIL; t = t->chain) {
        !            27:        if (t == s) {
        !            28:            return(TRUE);
        !            29:        }
        !            30:     }
        !            31:     return(FALSE);
        !            32: }
        !            33: 
        !            34: /*
        !            35:  * Test if a symbol is a var parameter, i.e. has class REF.
        !            36:  */
        !            37: 
        !            38: BOOLEAN isvarparam(s)
        !            39: SYM *s;
        !            40: {
        !            41:     return (BOOLEAN) s->class == REF;
        !            42: }
        !            43: 
        !            44: /*
        !            45:  * Test if a symbol is a variable (actually any addressible quantity
        !            46:  * with do).
        !            47:  */
        !            48: 
        !            49: BOOLEAN isvariable(s)
        !            50: SYM *s;
        !            51: {
        !            52:     return s->class == VAR || s->class == FVAR || s->class == REF;
        !            53: }
        !            54: 
        !            55: /*
        !            56:  * Test if a symbol is a block, e.g. function, procedure, or the
        !            57:  * main program.
        !            58:  */
        !            59: 
        !            60: BOOLEAN isblock(s)
        !            61: register SYM *s;
        !            62: {
        !            63:     return(s->class == FUNC || s->class == PROC || s->class == PROG);
        !            64: }
        !            65: 
        !            66: /*
        !            67:  * Test if a symbol is builtin, that is, a predefined type or
        !            68:  * reserved word.
        !            69:  */
        !            70: 
        !            71: BOOLEAN isbuiltin(s)
        !            72: SYM *s;
        !            73: {
        !            74:     return(s->blkno == 0 && s->class != PROG && s->class != VAR);
        !            75: }
        !            76: 
        !            77: /*
        !            78:  * Compatible tests if two types are compatible.  The issue
        !            79:  * is complicated a bit by ranges.
        !            80:  *
        !            81:  * Integers and reals are not compatible since they cannot always be mixed.
        !            82:  */
        !            83: 
        !            84: BOOLEAN compatible(t1, t2)
        !            85: register SYM *t1, *t2;
        !            86: {
        !            87:     register BOOLEAN b;
        !            88: 
        !            89:     if (isvariable(t1)) {
        !            90:        t1 = t1->type;
        !            91:     }
        !            92:     if (isvariable(t2)) {
        !            93:        t2 = t2->type;
        !            94:     }
        !            95:     if (t1 == t2) {
        !            96:        b = TRUE;
        !            97:     } else {
        !            98:        t1 = rtype(t1);
        !            99:        t2 = rtype(t2);
        !           100:        if (t1->type == t2->type) {
        !           101:            if (t1->class == RANGE && t2->class == RANGE) {
        !           102:                b = TRUE;
        !           103:            } else if ((t1->class == SCAL || t1->class == CONST) &&
        !           104:              (t2->class == SCAL || t2->class == CONST)) {
        !           105:                b = TRUE;
        !           106:            } else if (t1->type == t_char &&
        !           107:              t1->class == ARRAY && t2->class == ARRAY) {
        !           108:                b = TRUE;
        !           109:            } else {
        !           110:                b = FALSE;
        !           111:            }
        !           112:     /*
        !           113:      * A kludge here for "nil".  Should be handled better.
        !           114:      * Opens a pandora's box for integer/pointer compatibility.
        !           115:      */
        !           116:        } else if ((t1->class == RANGE && t2->class == PTR) ||
        !           117:          (t2->class == RANGE && t1->class == PTR)) {
        !           118:            b = TRUE;
        !           119:        } else {
        !           120:            b = FALSE;
        !           121:        }
        !           122:     }
        !           123:     return b;
        !           124: }
        !           125: 
        !           126: /*
        !           127:  * Predicate to test if a symbol should be printed.  We don't print
        !           128:  * files, for example, simply because there's no good way to do it.
        !           129:  * The symbol must be within the given function.
        !           130:  */
        !           131: 
        !           132: BOOLEAN should_print(s, f)
        !           133: SYM *s;
        !           134: SYM *f;
        !           135: {
        !           136:     SYM *t;
        !           137: 
        !           138:     if (s->func != f || (s->class != VAR && s->class != FVAR)) {
        !           139:        return(FALSE);
        !           140:     } else if (s->chain != NIL) {
        !           141:        return(FALSE);
        !           142:     } else {
        !           143:        t = rtype(s->type);
        !           144:        if (t == NIL || t->class == FILET || t->class == SET) {
        !           145:            return(FALSE);
        !           146:        } else {
        !           147:            return(TRUE);
        !           148:        }
        !           149:     }
        !           150: }
        !           151: 
        !           152: /*
        !           153:  * Test if the name of a symbol is uniquely defined or not.
        !           154:  */
        !           155: 
        !           156: BOOLEAN isambiguous(s)
        !           157: SYM *s;
        !           158: {
        !           159:     SYM *t;
        !           160: 
        !           161:     t = st_lookup(symtab, s->symbol);
        !           162:     if (t == NIL) {
        !           163:        panic("symbol name vanished");
        !           164:     }
        !           165:     while (t != NIL && (s == t || !streq(t->symbol, s->symbol))) {
        !           166:        t = t->next_sym;
        !           167:     }
        !           168:     return t != NIL;
        !           169: }

unix.superglobalmegacorp.com

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