X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Ftypes%2Fenum.c;fp=formats%2Fctf%2Ftypes%2Fenum.c;h=256807a7f0e2c30e0ba60980494f6e9aad905167;hp=5e0fda7dc25d5eb310c5c33c15af49a76f40bc7c;hb=448d3cc7640830015850cc6287532d4c194fe690;hpb=0a46062b3916eda6f871b5d80c4b97dcb3804d37 diff --git a/formats/ctf/types/enum.c b/formats/ctf/types/enum.c index 5e0fda7d..256807a7 100644 --- a/formats/ctf/types/enum.c +++ b/formats/ctf/types/enum.c @@ -24,151 +24,52 @@ #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) -{ - gconstpointer v = g_hash_table_lookup(table->quark_to_value, - (gconstpointer) 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) q); - return *(const int64_t *) v; -} - -guint enum_val_hash(gconstpointer key) -{ - int64_t ukey = *(const int64_t *)key; - - return (guint)ukey ^ (guint)(ukey >> 32); -} - -gboolean enum_val_equal(gconstpointer a, gconstpointer b) -{ - int64_t ua = *(const int64_t *)a; - int64_t ub = *(const int64_t *)b; - - return ua == ub; -} - -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; -} - -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); +GQuark ctf_enum_read(const unsigned char *ptr, + const struct type_class_enum *src) +{ + struct type_class_bitfield *bitfield_class = &src->p; + struct type_class_integer *int_class = &bitfield_class->p; + + if (!int_class->signedness) { + uint64_t v; + + v = ctf_bitfield_unsigned_read(src, + bitfield_class->start_offset, + int_class->len, + int_class->byte_order); + return enum_uint_to_quark(src, v); + } else { + int64_t v; + + v = fsrc->bitfield_signed_read(src, + bitfield_class->start_offset, + int_class->len, + int_class->byte_order); + return enum_int_to_quark(src, v); + } +} + +size_t ctf_enum_write(unsigned char *ptr, const struct type_class_enum *dest, + GQuark q) +{ + struct type_class_bitfield *bitfield_class = &dest->p; + struct type_class_integer *int_class = &bitfield_class->p; + + if (!int_class->signedness) { + uint64_t v; + + v = enum_quark_to_uint(dest, q); + return ctf_bitfield_unsigned_write(src, + bitfield_class->start_offset, + int_class->len, + int_class->byte_order, v); + } else { + int64_t v; + + v = enum_quark_to_int(dest, q); + return ctf_bitfield_signed_write(src, + bitfield_class->start_offset, + int_class->len, + int_class->byte_order, v); + } }