diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/datatype.c | 8 | ||||
-rw-r--r-- | src/evaluate.c | 6 |
2 files changed, 9 insertions, 5 deletions
diff --git a/src/datatype.c b/src/datatype.c index 807b0f18..8583531f 100644 --- a/src/datatype.c +++ b/src/datatype.c @@ -929,10 +929,10 @@ const struct datatype *concat_type_alloc(const struct expr *expr) struct expr *i; char desc[256] = "concatenation of ("; char name[256] = ""; - unsigned int type = 0, size = 0; + unsigned int type = 0, size = 0, subtypes = 0; list_for_each_entry(i, &expr->expressions, list) { - if (size != 0) { + if (subtypes != 0) { strncat(desc, ", ", sizeof(desc) - strlen(desc) - 1); strncat(name, " . ", sizeof(name) - strlen(name) - 1); } @@ -941,13 +941,15 @@ const struct datatype *concat_type_alloc(const struct expr *expr) type <<= 8; type |= i->dtype->type; - size++; + size += i->dtype->size; + subtypes++; } strncat(desc, ")", sizeof(desc) - strlen(desc) - 1); dtype = dtype_alloc(); dtype->type = type; dtype->size = size; + dtype->subtypes = subtypes; dtype->name = xstrdup(name); dtype->desc = xstrdup(desc); dtype->parse = concat_type_parse; diff --git a/src/evaluate.c b/src/evaluate.c index 07326607..79edf021 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -605,10 +605,10 @@ static int expr_evaluate_concat(struct eval_ctx *ctx, struct expr **expr) { const struct datatype *dtype = ctx->ectx.dtype, *tmp; unsigned int type = dtype ? dtype->type : 0; - int off = dtype ? dtype->size: 0; + int off = dtype ? dtype->subtypes : 0; unsigned int flags = EXPR_F_CONSTANT | EXPR_F_SINGLETON; struct expr *i, *next; - unsigned int n; + unsigned int n, len = 0; n = 1; list_for_each_entry_safe(i, next, &(*expr)->expressions, list) { @@ -624,11 +624,13 @@ static int expr_evaluate_concat(struct eval_ctx *ctx, struct expr **expr) return -1; flags &= i->flags; + len += i->len; n++; } (*expr)->flags |= flags; (*expr)->dtype = concat_type_alloc(*expr); + (*expr)->len = len; if (off > 0) return expr_error(ctx->msgs, *expr, |