From 25b19818c46d6fea81f3b951223f4ec7fa86ed55 Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Sat, 13 Dec 2014 07:50:35 +0000 Subject: datatype: change concat_type_alloc() to construct type from id The kernel only stored the id so we need to be able to reconstruct the datatype from the id only. Signed-off-by: Patrick McHardy --- src/datatype.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'src/datatype.c') diff --git a/src/datatype.c b/src/datatype.c index 91e5ed6d..2a9fcdb0 100644 --- a/src/datatype.c +++ b/src/datatype.c @@ -924,25 +924,28 @@ static struct datatype *dtype_alloc(void) return dtype; } -const struct datatype *concat_type_alloc(const struct expr *expr) +const struct datatype *concat_type_alloc(uint32_t type) { + const struct datatype *i; struct datatype *dtype; - struct expr *i; char desc[256] = "concatenation of ("; char name[256] = ""; - unsigned int type = 0, size = 0, subtypes = 0; + unsigned int size = 0, subtypes = 0, n; + + n = div_round_up(fls(type), TYPE_BITS); + while ((type >> TYPE_BITS * --n) & TYPE_MASK) { + i = datatype_lookup((type >> TYPE_BITS * n) & TYPE_MASK); + if (i == NULL) + return NULL; - list_for_each_entry(i, &expr->expressions, list) { if (subtypes != 0) { strncat(desc, ", ", sizeof(desc) - strlen(desc) - 1); strncat(name, " . ", sizeof(name) - strlen(name) - 1); } - strncat(desc, i->dtype->desc, sizeof(desc) - strlen(desc) - 1); - strncat(name, i->dtype->name, sizeof(name) - strlen(name) - 1); + strncat(desc, i->desc, sizeof(desc) - strlen(desc) - 1); + strncat(name, i->name, sizeof(name) - strlen(name) - 1); - type <<= TYPE_BITS; - type |= i->dtype->type; - size += i->dtype->size; + size += i->size; subtypes++; } strncat(desc, ")", sizeof(desc) - strlen(desc) - 1); -- cgit v1.2.3