Annotation of 43BSDReno/old/efl/struct.c, revision 1.1.1.1

1.1       root        1: #include "defs"
                      2: 
                      3: offsets(s)
                      4: register ptr s;
                      5: {
                      6: register ptr p, q;
                      7: ptr t;
                      8: ptr prevp;
                      9: int n;
                     10: int size, align, mask, nelt;
                     11: double rshift;
                     12: 
                     13: s->stralign = 1;
                     14: s->strsize = 0;
                     15: s->basetypes = 0;
                     16: prevp = 0;
                     17: rshift = 0;
                     18: 
                     19: for(p = s->strdesc ; p ; p = p->nextp)
                     20:        {
                     21:        q = p->datap;
                     22:        if(q->vclass != 0)
                     23:                dclerr("attempt to give storage class to mos",
                     24:                        q->namep);
                     25:        else  q->vclass = CLMOS;
                     26:        if(q->vtype == TYUNDEFINED)
                     27:                impldecl(q);
                     28: 
                     29:        sizalign(q, &size, &align, &mask);
                     30:        s->strsize = evenoff(s->strsize, align);
                     31:        q->voffset = mkint(s->strsize);
                     32:        /* sloppy formula */
                     33:        nelt = 1;
                     34:        if(t = q->vdim)
                     35:            for(t = t->datap ; t ; t = t->nextp)
                     36:                {
                     37:                if(t->upperb == 0) continue;
                     38:                n = conval(t->upperb);
                     39:                if(t->lowerb)
                     40:                        n -= conval(t->lowerb)-1;
                     41:                nelt *= n;
                     42:                }
                     43:        if(q->vtype==TYFIELD && q->vdim==0 &&
                     44:             (n=conval(q->vtypep->frange))*rshift<=fieldmax && rshift>0)
                     45:                {
                     46:                prevp->vtypep->fanymore = 1;
                     47:                q->vtypep->frshift = mkint( (int) rshift );
                     48:                rshift *= n;
                     49:                cfree(q->voffset);
                     50:                q->voffset = mkint(s->strsize - tailor.ftnsize[FTNINT]);
                     51:                }
                     52:        else    {
                     53:                if(q->vdim!=0 && q->vtype==TYFIELD)
                     54:                        q->vtype = TYINT;
                     55:                rshift = (q->vtype==TYFIELD ? n : 0);
                     56:                s->strsize +=  nelt * evenoff(size,align);
                     57:                s->stralign = lcm(s->stralign, align);
                     58:                s->basetypes |= mask;
                     59:                }
                     60:        prevp = q;
                     61:        }
                     62: }
                     63: 
                     64: 
                     65: lcm(a,b)
                     66: int a,b;
                     67: {
                     68: int ab, c;
                     69: 
                     70: if( (ab = a*b) == 0) return(0);
                     71: 
                     72: while(b)
                     73:        {
                     74:        c = a%b;
                     75:        a = b;
                     76:        b = c;
                     77:        }
                     78: 
                     79: return(ab/a);
                     80: }
                     81: 
                     82: 
                     83: 
                     84: 
                     85: 
                     86: sizalign(p, s, a, m)
                     87: register ptr p;
                     88: int *s;
                     89: int *a;
                     90: int *m;
                     91: {
                     92: register int k, t;
                     93: 
                     94: if(p->tag == TERROR)
                     95:        return;
                     96: if(p->tag!=TNAME && p->tag!=TTEMP && p->tag!=TFTNBLOCK)
                     97:        badtag("sizalign", p->tag);
                     98: switch(t = p->vtype)
                     99:        {
                    100:        case TYFIELD:
                    101:        case TYINT:
                    102:        case TYREAL:
                    103:        case TYLREAL:
                    104:        case TYCOMPLEX:
                    105:        case TYLOG:
                    106:                k = eflftn[t];
                    107:                *s = tailor.ftnsize[k];
                    108:                *a = tailor.ftnalign[k];
                    109:                *m = ftnmask[k];
                    110:                return;
                    111: 
                    112:        case TYLCOMPLEX:
                    113:                if(tailor.lngcxtype)
                    114:                        {
                    115:                        k = FTNDCOMPLEX;
                    116:                        *s = tailor.ftnsize[FTNDCOMPLEX];
                    117:                        }
                    118:                else
                    119:                        {
                    120:                        k = FTNDOUBLE;
                    121:                        *s = 2*tailor.ftnsize[k];
                    122:                        }
                    123:                *a = tailor.ftnalign[k];
                    124:                *m = ftnmask[k];
                    125:                return;
                    126: 
                    127:        case TYSTRUCT:
                    128:                *s = p->vtypep->strsize;
                    129:                *a = p->vtypep->stralign;
                    130:                *m = p->vtypep->basetypes;
                    131:                return;
                    132: 
                    133:        case TYCHAR:
                    134:                *s = tailor.ftnsize[FTNINT] *
                    135:                        ceil(conval(p->vtypep), tailor.ftnchwd);
                    136:                *a = tailor.ftnalign[FTNINT];
                    137:                *m = ftnmask[FTNINT];
                    138:                return;
                    139: 
                    140:        case TYSUBR:
                    141:                *s = 1;
                    142:                *a = 1;
                    143:                *m = 1;
                    144:                dclerr("subroutine name as variable", p->sthead->namep);
                    145:                return;
                    146: 
                    147:        default:
                    148:                fatal1("sizalign: invalid type %d", t);
                    149:        }
                    150: }
                    151: 
                    152: 
                    153: 
                    154: evenoff(a,b)   /* round a up to a multiple of b */
                    155: int a,b;
                    156: {
                    157: return(b * ceil(a,b));
                    158: }
                    159: 
                    160: 
                    161: ceil(a,b)
                    162: int a,b;
                    163: {
                    164: return( (a+b-1)/b );
                    165: }
                    166: 
                    167: 
                    168: 
                    169: 
                    170: ptr esizeof(type, typep, dim)
                    171: register int type;
                    172: register ptr typep;
                    173: ptr dim;
                    174: {
                    175: register int k;
                    176: 
                    177: switch(type)
                    178:        {
                    179:        case TYFIELD:
                    180:        case TYINT:
                    181:        case TYREAL:
                    182:        case TYLREAL:
                    183:        case TYCOMPLEX:
                    184:        case TYLCOMPLEX:
                    185:        case TYLOG:
                    186:                k = tailor.ftnsize[ eflftn[type] ];
                    187:                break;
                    188: 
                    189:        case TYSTRUCT:
                    190:                k = typep->strsize;
                    191:                break;
                    192: 
                    193:        case TYCHAR:
                    194:                k = tailor.ftnsize[FTNINT] * ceil(conval(typep), tailor.ftnchwd);
                    195:                break;
                    196: 
                    197:        default:
                    198:                exprerr("invalid sizeof", "");
                    199:                k = 0;
                    200:        }
                    201: /* debug version.  should multiply by dimension */
                    202: return( mkint(k) );
                    203: }
                    204: 
                    205: 
                    206: 
                    207: ptr elenof(type, typep, dim)
                    208: register int type;
                    209: register ptr typep;
                    210: ptr dim;
                    211: {
                    212: if(type == TYCHAR)
                    213:        return( mkint( conval(typep) ) );
                    214: exprerr("invalid lengthof", "");
                    215: return( mkint(0) );
                    216: /* debug version.  should multiply by dimension */
                    217: }

unix.superglobalmegacorp.com

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