Annotation of 43BSDReno/pgrm/pascal/src/clas.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[] = "@(#)clas.c     5.2 (Berkeley) 6/5/85";
                      9: #endif not lint
                     10: #include "whoami.h"
                     11: #include "0.h"
                     12: #include "tree.h"
                     13: #include "tree_ty.h"
                     14: 
                     15: /*
                     16:  * This is the array of class
                     17:  * names for the classes returned
                     18:  * by classify.  The order of the 
                     19:  * classes is the same as the base
                     20:  * of the namelist, with special
                     21:  * negative index entries for structures,
                     22:  * scalars, pointers, sets and strings
                     23:  * to be collapsed into.
                     24:  */
                     25: char   *clnxxxx[] =
                     26: {
                     27:        "file",                 /* -7   TFILE */
                     28:        "record",               /* -6   TREC */
                     29:        "array",                /* -5   TARY */
                     30:        "scalar",               /* -4   TSCAL */
                     31:        "pointer",              /* -3   TPTR */
                     32:        "set",                  /* -2   TSET */
                     33:        "string",               /* -1   TSTR */
                     34:        "SNARK",                /*  0   NIL */
                     35:        "Boolean",              /*  1   TBOOL */
                     36:        "char",                 /*  2   TCHAR */
                     37:        "integer",              /*  3   TINT */
                     38:        "real",                 /*  4   TREAL */
                     39:        "\"nil\"",              /*  5   TNIL */
                     40: };
                     41: 
                     42: char **clnames = &clnxxxx[-(TFIRST)];
                     43: 
                     44: /*
                     45:  * Classify takes a pointer
                     46:  * to a type and returns one
                     47:  * of several interesting group
                     48:  * classifications for easy use.
                     49:  */
                     50: classify(p1)
                     51:        struct nl *p1;
                     52: {
                     53:        register struct nl *p;
                     54: 
                     55:        p = p1;
                     56: swit:
                     57:        if (p == NLNIL) {
                     58:                nocascade();
                     59:                return (NIL);
                     60:        }
                     61:        if (p == &nl[TSTR])
                     62:                return (TSTR);
                     63:        if ( p == &nl[ TSET ] ) {
                     64:            return TSET;
                     65:        }
                     66:        switch (p->class) {
                     67:                case PTR:
                     68:                        return (TPTR);
                     69:                case ARRAY:
                     70:                        if (p->type == nl+T1CHAR)
                     71:                                return (TSTR);
                     72:                        return (TARY);
                     73:                case STR:
                     74:                        return (TSTR);
                     75:                case SET:
                     76:                        return (TSET);
                     77:                case CRANGE:
                     78:                case RANGE:
                     79:                        p = p->type;
                     80:                        goto swit;
                     81:                case TYPE:
                     82:                        if (p <= nl+TLAST)
                     83:                                return (p - nl);
                     84:                        panic("clas2");
                     85:                case FILET:
                     86:                        return (TFILE);
                     87:                case RECORD:
                     88:                        return (TREC);
                     89:                case SCAL:
                     90:                        return (TSCAL);
                     91:                default:
                     92:                        {
                     93:                            panic("clas");
                     94:                            return(NIL);
                     95:                        }
                     96:        }
                     97: }
                     98: 
                     99: #ifndef        PI0
                    100: /*
                    101:  * Is p a text file?
                    102:  */
                    103: text(p)
                    104:        struct nl *p;
                    105: {
                    106: 
                    107:        return (p != NIL && p->class == FILET && p->type == nl+T1CHAR);
                    108: }
                    109: #endif
                    110: 
                    111: /*
                    112:  * Scalar returns a pointer to
                    113:  * the the base scalar type of
                    114:  * its argument if its argument
                    115:  * is a SCALar else NIL.
                    116:  */
                    117: struct nl *
                    118: scalar(p1)
                    119:        struct nl *p1;
                    120: {
                    121:        register struct nl *p;
                    122: 
                    123:        p = p1;
                    124:        if (p == NLNIL)
                    125:                return (NLNIL);
                    126:        if (p->class == RANGE || p->class == CRANGE)
                    127:                p = p->type;
                    128:        if (p == NLNIL)
                    129:                return (NLNIL);
                    130:        return (p->class == SCAL ? p : NLNIL);
                    131: }
                    132: 
                    133: /*
                    134:  * Isa tells whether p
                    135:  * is one of a group of
                    136:  * namelist classes.  The
                    137:  * classes wanted are specified
                    138:  * by the characters in s.
                    139:  * (Note that s would more efficiently,
                    140:  * if less clearly, be given by a mask.)
                    141:  */
                    142: isa(p, s)
                    143:        register struct nl *p;
                    144:        char *s;
                    145: {
                    146:        register i;
                    147:        register char *cp;
                    148: 
                    149:        if (p == NIL)
                    150:                return (NIL);
                    151:        /*
                    152:         * map ranges down to
                    153:         * the base type
                    154:         */
                    155:        if (p->class == RANGE) {
                    156:                p = p->type;
                    157:        }
                    158:        /*
                    159:         * the following character/class
                    160:         * associations are made:
                    161:         *
                    162:         *      s       scalar
                    163:         *      b       Boolean
                    164:         *      c       character
                    165:         *      i       integer
                    166:         *      d       double (real)
                    167:         *      t       set
                    168:         */
                    169:        switch (p->class) {
                    170:                case SET:
                    171:                        i = TDOUBLE+1;
                    172:                        break;
                    173:                case SCAL:
                    174:                        i = 0;
                    175:                        break;
                    176:                case CRANGE:
                    177:                        /*
                    178:                         * find the base type of a conformant array range
                    179:                         */
                    180:                        switch (classify(p->type)) {
                    181:                                case TBOOL: i = 1; break;
                    182:                                case TCHAR: i = 2; break;
                    183:                                case TINT: i = 3; break;
                    184:                                case TSCAL: i = 0; break;
                    185:                                default:
                    186:                                        panic( "isa" );
                    187:                        }
                    188:                        break;
                    189:                default:
                    190:                        i = p - nl;
                    191:        }
                    192:        if (i >= 0 && i <= TDOUBLE+1) {
                    193:                i = "sbcidt"[i];
                    194:                cp = s;
                    195:                while (*cp)
                    196:                        if (*cp++ == i)
                    197:                                return (1);
                    198:        }
                    199:        return (NIL);
                    200: }
                    201: 
                    202: /*
                    203:  * Isnta is !isa
                    204:  */
                    205: isnta(p, s)
                    206:     struct nl *p;
                    207:     char *s;
                    208: {
                    209: 
                    210:        return (!isa(p, s));
                    211: }
                    212: 
                    213: /*
                    214:  * "shorthand"
                    215:  */
                    216: char *
                    217: nameof(p)
                    218: struct nl *p;
                    219: {
                    220: 
                    221:        return (clnames[classify(p)]);
                    222: }
                    223: 
                    224: #ifndef PI0
                    225: /* find out for sure what kind of node this is being passed
                    226:    possibly several different kinds of node are passed to it */
                    227: int nowexp(r)
                    228:        struct tnode *r;
                    229: {
                    230:        if (r->tag == T_WEXP) {
                    231:                if (r->var_node.cptr == NIL)
                    232:                        error("Oct/hex allowed only on writeln/write calls");
                    233:                else
                    234:                        error("Width expressions allowed only in writeln/write calls");
                    235:                return (1);
                    236:        }
                    237:        return (NIL);
                    238: }
                    239: #endif
                    240: 
                    241:     /*
                    242:      * is a variable a local, a formal parameter, or a global?
                    243:      * all this from just the offset:
                    244:      *     globals are at levels 0 or 1
                    245:      *     positives are parameters
                    246:      *     negative evens are locals
                    247:      */
                    248: /*ARGSUSED*/
                    249: whereis( offset , other_flags )
                    250:     int                offset;
                    251:     char       other_flags;
                    252: {
                    253:     
                    254: #   ifdef OBJ
                    255:        return ( offset >= 0 ? PARAMVAR : LOCALVAR );
                    256: #   endif OBJ
                    257: #   ifdef PC
                    258:        switch ( other_flags & ( NGLOBAL | NPARAM | NLOCAL | NNLOCAL) ) {
                    259:            default:
                    260:                panic( "whereis" );
                    261:            case NGLOBAL:
                    262:                return GLOBALVAR;
                    263:            case NPARAM:
                    264:                return PARAMVAR;
                    265:            case NNLOCAL:
                    266:                return NAMEDLOCALVAR;
                    267:            case NLOCAL:
                    268:                return LOCALVAR;
                    269:        }
                    270: #   endif PC
                    271: }

unix.superglobalmegacorp.com

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