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

unix.superglobalmegacorp.com

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