Annotation of coherent/b/bin/c/n0/size.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * n0/size.c
                      3:  * C compiler.
                      4:  * sizeof(thing) computation for symbols and trees.
                      5:  */
                      6: 
                      7: #ifdef   vax
                      8: #include "INC$LIB:cc0.h"
                      9: #else
                     10: #include "cc0.h"
                     11: #endif
                     12: 
                     13: /*
                     14:  * Given a pointer to a symbol table entry,
                     15:  * return the size of the object in "bytes".
                     16:  */
                     17: sizeof_t
                     18: ssize(sp) register SYM *sp;
                     19: {
                     20:        register sizeof_t n;
                     21:        n = tidsize(sp->s_type, sp->s_ip, sp->s_dp, 1);
                     22:        if (n == 0 && sp->s_class == C_GREF)
                     23:                sizewarn(sp->s_id, 0);
                     24:        return n;
                     25: }
                     26: 
                     27: /*
                     28:  * Much like ssize, but takes a tree node pointer
                     29:  * rather than a symbol table entry pointer.
                     30:  */
                     31: sizeof_t
                     32: tsize(tp) register TREE *tp;
                     33: {
                     34:        register sizeof_t n;
                     35:        n = tidsize(tp->t_type, tp->t_ip, tp->t_dp, 1);
                     36:        if (n == 0 && tp->t_op == GID && tp->t_sp->s_class == C_GREF)
                     37:                sizewarn(tp->t_sp->s_id, 0);
                     38:        return n;
                     39: }
                     40: 
                     41: /*
                     42:  * Much like ssize, but takes a symbol pointer and a dimension list.
                     43:  */
                     44: sizeof_t
                     45: sdsize(sp, dp) register SYM *sp; DIM *dp;
                     46: {
                     47:        register sizeof_t n;
                     48:        n = tidsize(sp->s_type, sp->s_ip, dp, 1);
                     49:        if (n == 0 && sp->s_class == C_GREF)
                     50:                sizewarn(sp->s_id, 0);
                     51:        return n;
                     52: }
                     53: 
                     54: 
                     55: /*
                     56:  * Figure out a size given a type,
                     57:  * an INFO structure pointer and a dimension list.
                     58:  */
                     59: sizeof_t
                     60: tidsize(t, ip, dp, f) register int t; register INFO *ip; register DIM *dp;
                     61:                      int f;                    /* Message requested flag */
                     62: {
                     63:        unsigned long n;
                     64:        int a = 0;              /* Array flag for szcheck() */
                     65:        char *s = "object";
                     66: 
                     67:        n = 1;
                     68:        while (dp!=NULL && (dp->d_type==D_ARRAY || dp->d_type==D_MOSAR)) {
                     69:                s = "array";
                     70:                n *= dp->d_bound;
                     71:                dp = dp->d_dp;
                     72:                a += 1;
                     73:        }
                     74:        if (n == 0)
                     75:                return 0;
                     76:        if (dp!=NULL && dp->d_type==D_FUNC)
                     77:                return(f ? sizewarn("function", 0) : 0);
                     78:        if (dp != NULL)
                     79:                n *= mysizes[T_PTR];
                     80:        else {
                     81:                if (t == T_VOID)
                     82:                        return(f ? sizewarn("void", 0) : 0);
                     83:                if (isfr(t)) {
                     84:                        if (f) unksize(t, ip);
                     85:                        return 0;
                     86:                }
                     87:                if (t==T_STRUCT || t==T_UNION) {
                     88:                        s = (t==T_STRUCT) ? "structure" : "union";
                     89:                        n *= ip->i_size;
                     90:                } else {
                     91:                        if (t == T_ENUM)
                     92:                                t = ip->i_type;
                     93:                        n *= mysizes[t];
                     94:                }
                     95:        }
                     96:        if (f)
                     97:                n = szcheck(n, a, s);
                     98:        return n;
                     99: }
                    100: 
                    101: /*
                    102:  * Is this a forward reference?
                    103:  */
                    104: isfr(t) register int t;
                    105: {
                    106:        return (t==T_FSTRUCT || t==T_FUNION || t==T_FENUM);
                    107: }
                    108: 
                    109: /*
                    110:  * Mutter about an unknown size.
                    111:  */
                    112: unksize(t, sp) register int t; register SYM *sp;
                    113: {
                    114:        register char *p;
                    115: 
                    116:        p = "enumeration";
                    117:        if (t == T_FSTRUCT)
                    118:                p = "structure";
                    119:        if (t == T_FUNION)
                    120:                p = "union";
                    121:        cerror("size of %s \"%s\" is not known", p, sp->s_id);
                    122: }
                    123: 
                    124: static
                    125: sizewarn(s, i) char *s; register int i;
                    126: {
                    127:        cerror("sizeof(%s) set to %d", s, i);
                    128:        return i;
                    129: }
                    130: 
                    131: /* end of n0/size.c */

unix.superglobalmegacorp.com

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