static void nextinit(int brace) { if (!brace) { if (initstk->i_type == NULL && !issclt(initstk->i_subt->t_tspec)) { /* {}-enclosed initializer required */ error(181); } /* * Make sure an entry with a scalar type is at the top * of the stack. */ if (!initerr) testinit(); while (!initerr && (initstk->i_type == NULL || !issclt(initstk->i_type->t_tspec))) { if (!initerr) pushinit(); } } else { if (initstk->i_type != NULL && issclt(initstk->i_type->t_tspec)) { /* invalid initializer */ error(176); initerr = 1; } if (!initerr) testinit(); if (!initerr) pushinit(); if (!initerr) initstk->i_brace = 1; } }
static int strginit(tnode_t *tn) { tspec_t t; istk_t *istk; int len; strg_t *strg; if (tn->tn_op != STRING) return (0); istk = initstk; strg = tn->tn_strg; /* * Check if we have an array type which can be initialized by * the string. */ if (istk->i_subt->t_tspec == ARRAY) { t = istk->i_subt->t_subt->t_tspec; if (!((strg->st_tspec == CHAR && (t == CHAR || t == UCHAR || t == SCHAR)) || (strg->st_tspec == WCHAR && t == WCHAR))) { return (0); } /* Put the array at top of stack */ pushinit(); istk = initstk; } else if (istk->i_type != NULL && istk->i_type->t_tspec == ARRAY) { t = istk->i_type->t_subt->t_tspec; if (!((strg->st_tspec == CHAR && (t == CHAR || t == UCHAR || t == SCHAR)) || (strg->st_tspec == WCHAR && t == WCHAR))) { return (0); } /* * If the array is already partly initialized, we are * wrong here. */ if (istk->i_cnt != istk->i_type->t_dim) return (0); } else { return (0); } /* Get length without trailing NUL character. */ len = strg->st_len; if (istk->i_nolimit) { istk->i_nolimit = 0; istk->i_type->t_dim = len + 1; /* from now complete type */ setcompl(istk->i_type, 0); } else { if (istk->i_type->t_dim < len) { /* non-null byte ignored in string initializer */ warning(187); } } /* In every case the array is initialized completely. */ istk->i_cnt = 0; return (1); }