Annotation of coherent/d/bin/cc/c/n0/init.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * C compiler.
        !             3:  * Initializers.
        !             4:  * (All storage classes).
        !             5:  */
        !             6: #ifdef   vax
        !             7: #include "INC$LIB:cc0.h"
        !             8: #else
        !             9: #include "cc0.h"
        !            10: #endif
        !            11: 
        !            12: init(sp, dp, bo, flex)
        !            13: register SYM   *sp;
        !            14: register DIM   *dp;
        !            15: sizeof_t       bo;
        !            16: int            flex;
        !            17: {
        !            18:        register int    t;
        !            19:        DIM             *ndp;
        !            20:        TREE            *tp;
        !            21:        sizeof_t        width, nbe, nel, ninit;
        !            22:        int             brace, c, adj;
        !            23: 
        !            24:        t  = sp->s_type;
        !            25:        width = sdsize(sp, dp);
        !            26:        ndp = dp;
        !            27:        if (dp!=NULL && dp->d_type==D_ARRAY) {
        !            28:                if (dp->d_bound != 0)
        !            29:                        flex = 0;
        !            30:                ndp = dp->d_dp;
        !            31:                if (width==0 && !flex)
        !            32:                        cerror("array row has 0 length");
        !            33:        } else
        !            34:                flex = 0;
        !            35:        nel = 0;
        !            36:        nbe = sdsize(sp, ndp);
        !            37:        if (nbe != 0)
        !            38:                nel = width/nbe;
        !            39:        brace = 0;
        !            40:        if (s==LBRACE && (dp!=NULL || !istruct(t))) {
        !            41:                ++brace;
        !            42:                lex();
        !            43:        } else if (s!=LBRACE && (dp!=NULL || istruct(t)))
        !            44:                notbook();
        !            45:        ninit = 0;
        !            46:        while (s != RBRACE) {
        !            47:                if (ndp==NULL && istruct(t))
        !            48:                        sinit(sp, bo);
        !            49:                else if (ndp!=NULL && ndp->d_type==D_ARRAY)
        !            50:                        init(sp, ndp, bo, 0);
        !            51:                else {
        !            52:                        adj = 0;
        !            53:                        if (s==STRING && t<T_INT && ndp==NULL) {
        !            54: again:                         while ((c = getmap('\"')) >= 0) {
        !            55:                                        newtree(sizeof(TREE));
        !            56:                                        icollect(bicon(c), bo, sp, ndp);
        !            57:                                        ++ninit;
        !            58:                                        ++bo;
        !            59:                                }
        !            60:                                if (lex() == STRING) {
        !            61:                                        ++adj;
        !            62:                                        goto again;
        !            63:                                }
        !            64:                                if (adj)
        !            65:                                        notbook();
        !            66:                                if (!flex && ninit==nel) {
        !            67:                                        cwarn("string initializer not terminated by NUL");
        !            68:                                        break;
        !            69:                                }
        !            70:                                newtree(sizeof(TREE));
        !            71:                                icollect(bicon(0), bo, sp, ndp);
        !            72:                                ++ninit;
        !            73:                                break;
        !            74:                        }
        !            75:                        newtree(sizeof(TREE));
        !            76:                        ++ininit;
        !            77:                        tp = expr();
        !            78:                        --ininit;
        !            79:                        icollect(tp, bo, sp, ndp);
        !            80:                }
        !            81:                ++ninit;
        !            82:                bo += nbe;
        !            83:                if (s != COMMA)
        !            84:                        break;
        !            85:                if (ninit>=nel && !flex) {
        !            86:                        if (brace) {
        !            87:                                lex();
        !            88:                                if (s == RBRACE)
        !            89:                                        cwarn("trailing ',' in initialization list");
        !            90:                                else {
        !            91:                                        cerror("too many initializers");
        !            92:                                        iskip();
        !            93:                                }
        !            94:                        }
        !            95:                        break;
        !            96:                }
        !            97:                itrail();
        !            98:        }
        !            99:        if (brace)
        !           100:                mustbe(RBRACE);
        !           101:        if (ninit < nel) {
        !           102:                c = sp->s_class;
        !           103:                if (c==C_GDEF || c==C_SIN || c==C_SEX) {
        !           104:                        bput(BLOCK);
        !           105:                        zput(nbe*(nel-ninit));
        !           106:                }
        !           107:        }
        !           108:        if (ninit > nel) {
        !           109:                if (!flex)
        !           110:                        cerror("too many initializers");
        !           111:                if (dp != NULL)
        !           112:                        dp->d_bound = ninit;
        !           113:        }
        !           114: }
        !           115: 
        !           116: /*
        !           117:  * Initialize a structure.
        !           118:  * Create a fake variable for each member;
        !           119:  * this is necessary for the call to build() in iassign()
        !           120:  * to do the correct things.
        !           121:  */
        !           122: sinit(sp, bo)
        !           123: SYM    *sp;
        !           124: sizeof_t bo;
        !           125: {
        !           126:        register SYM    *mp;
        !           127:        register INFO   *ip;
        !           128:        register int    n;
        !           129:        int             brace, c, t, f;
        !           130:        sizeof_t        mo, lo;
        !           131:        SYM             sym;
        !           132: 
        !           133:        c = sp->s_class;
        !           134:        t = sp->s_type;
        !           135:        if (t==T_UNION || t==T_FUNION)
        !           136:                cerror("cannot initialize unions");
        !           137:        if (t==T_FSTRUCT || t==T_FUNION)
        !           138:                return;
        !           139:        ip = sp->s_ip;
        !           140:        sym.s_class = c;
        !           141:        sym.s_value = sp->s_value;
        !           142:        brace = 0;
        !           143:        if (s == LBRACE) {
        !           144:                ++brace;
        !           145:                lex();
        !           146:        }
        !           147:        lo = n = f = 0;
        !           148:        while (s != RBRACE) {
        !           149:                if (n >= ip->i_nsp) {
        !           150:                        if (f == 0) {
        !           151:                                cerror("too many structure initializers");
        !           152:                                ++f;
        !           153:                        }
        !           154:                        sym.s_type = T_INT;
        !           155:                        sym.s_dp = sym.s_ip = NULL;
        !           156:                        mo = 0;
        !           157:                } else {
        !           158:                        mp = ip->i_sp[n++];
        !           159:                        sym.s_type = mp->s_type;
        !           160:                        sym.s_dp   = mp->s_dp;
        !           161:                        sym.s_ip   = mp->s_ip;
        !           162:                        mo = mp->s_value;
        !           163:                        if (mp->s_width != 0)
        !           164:                                cerror("cannot initialize fields");
        !           165:                        if (!isauto(&sym) && lo!=mo) {
        !           166:                                bput(BLOCK);
        !           167:                                zput(mo-lo);
        !           168:                                lo = mo;
        !           169:                        }
        !           170:                }
        !           171:                init(&sym, sym.s_dp, bo+mo, 0);
        !           172:                lo += ssize(&sym);
        !           173:                if (s != COMMA || (n>=ip->i_nsp && !brace))
        !           174:                        break;
        !           175:                itrail();
        !           176:        }
        !           177:        if (brace)
        !           178:                mustbe(RBRACE);
        !           179:        if (t==T_STRUCT && (c==C_GDEF || c==C_SIN || c==C_SEX)) {
        !           180:                if ((mo = ip->i_size-lo) > 0) {
        !           181:                        bput(BLOCK);
        !           182:                        zput(mo);
        !           183:                }
        !           184:        }
        !           185: }
        !           186: 
        !           187: /*
        !           188:  * Fetch the next symbol.
        !           189:  * The current symbol is a COMMA.
        !           190:  * If the new symbol is '}', the program has said ", }"; this is legal.
        !           191:  * If you pull the comments here, it becomes not quite so legal.
        !           192:  */
        !           193: static
        !           194: itrail()
        !           195: {
        !           196:        lex();
        !           197:        if (s == RBRACE)
        !           198:                cwarn("trailing ',' in initialization list");
        !           199: }
        !           200: 
        !           201: /*
        !           202:  * An initialization starting with '{' contains too many initializers.
        !           203:  * Skip initializers to the matching '}' or EOF.
        !           204:  */
        !           205: static
        !           206: iskip()
        !           207: {
        !           208:        register int braces;
        !           209: 
        !           210:        braces = 0;
        !           211:        for(;;) {
        !           212:                if (s == LBRACE)
        !           213:                        ++braces;
        !           214:                else if (s == RBRACE) {
        !           215:                        if (braces == 0)
        !           216:                                return;
        !           217:                        else
        !           218:                                --braces;
        !           219:                }
        !           220:                else if (s == EOF)
        !           221:                        return;
        !           222:                lex();
        !           223:        }
        !           224: }
        !           225: 
        !           226: /*
        !           227:  * Return true if symbol "sp" is an automatic,
        !           228:  * in the sense that an assigment statement must be generated
        !           229:  * for the initialization item.
        !           230:  * Registers are considered auto.
        !           231:  */
        !           232: isauto(sp)
        !           233: register SYM   *sp;
        !           234: {
        !           235:        register int    c;
        !           236: 
        !           237:        c = sp->s_class;
        !           238:        if (c==C_AUTO || c==C_PAUTO || c==C_REG)
        !           239:                return (1);
        !           240:        return (0);
        !           241: }
        !           242: 
        !           243: /*
        !           244:  * This routine actually performs the initialization.
        !           245:  * Either an assignment node is built up and evaluated for effect,
        !           246:  * or an initialization tree is output.
        !           247:  */
        !           248: icollect(tp, bo, sp, dp)
        !           249: register TREE  *tp;
        !           250: sizeof_t       bo;
        !           251: register SYM   *sp;
        !           252: DIM            *dp;
        !           253: {
        !           254:        register TREE   *ip;
        !           255: 
        !           256:        if (isauto(sp)) {
        !           257:                iassign(sp, dp, bo, tp);
        !           258:                return;
        !           259:        }
        !           260:        ip = talloc();
        !           261:        ip->t_op = INIT;
        !           262:        ip->t_type = sp->s_type;
        !           263:        ip->t_dp = dp;
        !           264:        ip->t_ip = sp->s_ip;
        !           265:        ip->t_lp = tp;
        !           266:        tput(IEXPR, 0, ip);
        !           267: }
        !           268: 
        !           269: /*
        !           270:  * Actually do the assignment for an automatic initialization thing.
        !           271:  */
        !           272: iassign(sp, dp, bo, tp)
        !           273: register SYM   *sp;
        !           274: register TREE  *tp;
        !           275: sizeof_t       bo;
        !           276: DIM            *dp;
        !           277: {
        !           278:        register TREE   *ip;
        !           279:        DIM             *ssdp;
        !           280: 
        !           281:        ssdp = sp->s_dp;
        !           282:        sp->s_dp = dp;
        !           283:        ip = bid(sp);
        !           284:        sp->s_dp = ssdp;
        !           285:        if (sp->s_class != C_REG)
        !           286:                ip->t_offs += bo;
        !           287:        tp = build(ASSIGN, ip, tp);
        !           288:        tput(EEXPR, 0, tp);
        !           289: }

unix.superglobalmegacorp.com

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