X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Ftypes%2Fenum.c;h=37859f03a5afb040cc90abfeab9ebbd674a9ce0e;hp=507d0c35e9ef0d26bffcbe1cb9a3eedaa04858e5;hb=7fe001942cc8ece60d945cbfbd1d135ff548dc7d;hpb=7172902caa455601e0d7429378e898eb12bbb2ba diff --git a/formats/ctf/types/enum.c b/formats/ctf/types/enum.c index 507d0c35..37859f03 100644 --- a/formats/ctf/types/enum.c +++ b/formats/ctf/types/enum.c @@ -20,155 +20,43 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include +#include #include #include -struct enum_table { - GHashTable *value_to_quark; /* Tuples (value, GQuark) */ - GHashTable *quark_to_value; /* Tuples (GQuark, value) */ -}; - -#if (__WORDSIZE == 32) -GQuark enum_uint_to_quark(const struct enum_table *table, uint64_t v) -{ - gconstpointer q = g_hash_table_lookup(table->value_to_quark, &v); - return (GQuark) (unsigned long) q; -} - -GQuark enum_int_to_quark(const struct enum_table *table, uint64_t v) -{ - gconstpointer q = g_hash_table_lookup(table->value_to_quark, &v); - return (GQuark) (unsigned long) q; -} - -uint64_t enum_quark_to_uint(size_t len, int byte_order, GQuark q) +GQuark ctf_enum_read(struct stream_pos *pos, + const struct type_class_enum *src) { - gconstpointer v = g_hash_table_lookup(table->quark_to_value, - (gconstpointer) q); - return *(const uint64_t *) v; -} + struct type_class_integer *int_class = &src->p; -int64_t enum_quark_to_int(size_t len, int byte_order, GQuark q) -{ - gconstpointer v = g_hash_table_lookup(table->quark_to_value, - (gconstpointer) q); - return *(const int64_t *) v; -} + if (!int_class->signedness) { + uint64_t v; -guint enum_val_hash(gconstpointer key) -{ - int64_t ukey = *(const int64_t *)key; + v = ctf_uint_read(pos, int_class); + return enum_uint_to_quark(src, v); + } else { + int64_t v; - return (guint)ukey ^ (guint)(ukey >> 32); + v = fsrc->ctf_int_read(pos, int_class); + return enum_int_to_quark(src, v); + } } -gboolean enum_val_equal(gconstpointer a, gconstpointer b) +size_t ctf_enum_write(struct stream_pos *pos, + const struct type_class_enum *dest, + GQuark q) { - int64_t ua = *(const int64_t *)a; - int64_t ub = *(const int64_t *)b; + struct type_class_integer *int_class = &dest->p; - return ua == ub; -} + if (!int_class->signedness) { + uint64_t v; -void enum_val_free(void *ptr) -{ - g_free(ptr); -} - -void enum_signed_insert(struct enum_table *table, int64_t v, GQuark q) -{ - int64_t *valuep = g_new(int64_t, 1); - - g_hash_table_insert(table->value_to_quark, valuep, - (gpointer) (unsigned long) q); - g_hash_table_insert(table->quark_to_value, (gpointer) (unsigned long) q, - valuep); -} - -void enum_unsigned_insert(struct enum_table *table, uint64_t v, GQuark q) -{ - uint64_t *valuep = g_new(uint64_t, 1); - - g_hash_table_insert(table->value_to_quark, valuep, - (gpointer) (unsigned long) q); - g_hash_table_insert(table->quark_to_value, (gpointer) (unsigned long) q, - valuep); -} -#else /* __WORDSIZE != 32 */ -GQuark enum_uint_to_quark(const struct enum_table *table, uint64_t v) -{ - gconstpointer q = g_hash_table_lookup(table->value_to_quark, - (gconstpointer) v); - return (GQuark) (unsigned long) q; -} - -GQuark enum_int_to_quark(const struct enum_table *table, uint64_t v) -{ - gconstpointer q = g_hash_table_lookup(table->value_to_quark, - (gconstpointer) v); - return (GQuark) (unsigned long) q; -} + v = enum_quark_to_uint(dest, q); + return ctf_uint_write(pos, int_class, v); + } else { + int64_t v; -uint64_t enum_quark_to_uint(size_t len, int byte_order, GQuark q) -{ - gconstpointer v = g_hash_table_lookup(table->quark_to_value, - (gconstpointer) (unsigned long) q); - return *(const uint64_t *) v; -} - -int64_t enum_quark_to_int(size_t len, int byte_order, GQuark q) -{ - gconstpointer v = g_hash_table_lookup(table->quark_to_value, - (gconstpointer) (unsigned long) q); - return *(const int64_t *) v; -} - -guint enum_val_hash(gconstpointer key) -{ - return g_direct_hash(key); -} - -gboolean enum_val_equal(gconstpointer a, gconstpointer b) -{ - return g_direct_equal(a, b); -} - -void enum_val_free(void *ptr) -{ -} - -void enum_signed_insert(struct enum_table *table, int64_t v, GQuark q) -{ - g_hash_table_insert(table->value_to_quark, (gpointer) v, - (gpointer) (unsigned long) q); - g_hash_table_insert(table->quark_to_value, (gpointer) (unsigned long) q, - valuep); -} - -void enum_unsigned_insert(struct enum_table *table, uint64_t v, GQuark q) -{ - g_hash_table_insert(table->value_to_quark, (gpointer) v, - (gpointer) (unsigned long) q); - g_hash_table_insert(table->quark_to_value, (gpointer) (unsigned long) q, - valuep); -} -#endif /* __WORDSIZE != 32 */ - -struct enum_table *enum_new(void) -{ - struct enum_table *table; - - table = g_new(struct enum_table, 1); - table->value_to_quark = g_hash_table(enum_val_hash, enum_val_equal); - table->quark_to_value = g_hash_table_new_full(g_direct_hash, - g_direct_equal, - NULL, enum_val_free); -} - -void enum_destroy(struct enum_table *table) -{ - g_hash_table_destroy(table->value_to_quark); - g_hash_table_destroy(table->quark_to_value); - g_free(table); + v = enum_quark_to_int(dest, q); + return ctf_int_write(pos, int_class, v); + } }