From 880fded3c234f271a7437bf055fbefb6aaca2386 Mon Sep 17 00:00:00 2001 From: compudj Date: Mon, 2 Apr 2007 20:24:17 +0000 Subject: [PATCH] fix sparse enums git-svn-id: http://ltt.polymtl.ca/svn@2463 04897980-b3bd-0310-b5e0-8ef037075253 --- ltt/branches/poly/ltt/facility.c | 4 ++++ ltt/branches/poly/ltt/ltt-private.h | 2 ++ ltt/branches/poly/ltt/type.c | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ltt/branches/poly/ltt/facility.c b/ltt/branches/poly/ltt/facility.c index e6573c9d..380689b4 100644 --- a/ltt/branches/poly/ltt/facility.c +++ b/ltt/branches/poly/ltt/facility.c @@ -395,10 +395,14 @@ void construct_fields(LttFacility *fac, { guint i; type->enum_map = g_hash_table_new(g_direct_hash, g_direct_equal); + type->lowest_value = G_MAXINT32; + type->highest_value = G_MININT32; for(i=0; ilabels.position; i++) { GQuark value = g_quark_from_string((char*)td->labels.array[i]); gint key = *(int*)td->labels_values.array[i]; g_hash_table_insert(type->enum_map, (gpointer)key, (gpointer)value); + type->highest_value = max(key, type->highest_value); + type->lowest_value = min(key, type->lowest_value); } } g_assert(type->size != 0); diff --git a/ltt/branches/poly/ltt/ltt-private.h b/ltt/branches/poly/ltt/ltt-private.h index a4801c1c..c4684bc6 100644 --- a/ltt/branches/poly/ltt/ltt-private.h +++ b/ltt/branches/poly/ltt/ltt-private.h @@ -251,6 +251,8 @@ struct _LttType{ guint size; LttTypeEnum type_class; //which type GHashTable *enum_map; //maps enum labels to numbers. + gint32 highest_value; //For enum + gint32 lowest_value; //For enum GArray *fields; // Array of LttFields, for array, sequence, union, struct. GData *fields_by_name; guint network; // Is the type in network byte order ? diff --git a/ltt/branches/poly/ltt/type.c b/ltt/branches/poly/ltt/type.c index 1d1481de..d396d21a 100644 --- a/ltt/branches/poly/ltt/type.c +++ b/ltt/branches/poly/ltt/type.c @@ -251,7 +251,8 @@ unsigned ltt_type_element_number(LttType *t) unsigned ret = 0; if(likely(t->type_class == LTT_ENUM)) - ret = g_hash_table_size(t->enum_map); + // Permits non full enums ret = g_hash_table_size(t->enum_map); + ret = (unsigned)(t->highest_value - t->lowest_value); return ret; } -- 2.34.1