struct bt_definition *field;
field = bt_variant_get_current_field(variant_definition);
+ if (!field) {
+ return -EINVAL;
+ }
return generic_rw(ppos, field);
}
field->declaration = field_declaration;
/* Keep index in hash rather than pointer, because array can relocate */
g_hash_table_insert(untagged_variant_declaration->fields_by_tag,
- (gpointer) (unsigned long) field->name,
- (gpointer) index);
+ GUINT_TO_POINTER(field->name),
+ GUINT_TO_POINTER(index));
/*
* Alignment of variant is based on the alignment of its currently
* selected choice, so we leave variant alignment as-is (statically
found = g_hash_table_lookup_extended(
untagged_variant_declaration->fields_by_tag,
- (gconstpointer) (unsigned long) tag, NULL, &index);
+ (gconstpointer) GUINT_TO_POINTER(tag), NULL, &index);
if (!found) {
return NULL;
}
- return &g_array_index(untagged_variant_declaration->fields, struct declaration_field, (unsigned long)index);
+ return &g_array_index(untagged_variant_declaration->fields, struct declaration_field, GPOINTER_TO_UINT(index));
}
/*
unsigned long index;
GArray *tag_array;
GQuark tag;
+ gpointer orig_key, value;
tag_array = _enum->value;
+ if (!tag_array) {
+ /* Enumeration has unknown tag. */
+ fprintf(stderr, "[error] Enumeration used for variant has unknown tag.\n");
+ return NULL;
+ }
/*
* The 1 to 1 mapping from enumeration to value should have been already
* checked. (see TODO above)
*/
assert(tag_array->len == 1);
tag = g_array_index(tag_array, GQuark, 0);
- index = (unsigned long) g_hash_table_lookup(variant_declaration->untagged_variant->fields_by_tag,
- (gconstpointer) (unsigned long) tag);
+ if (!g_hash_table_lookup_extended(variant_declaration->untagged_variant->fields_by_tag,
+ (gconstpointer) GUINT_TO_POINTER(tag),
+ &orig_key,
+ &value)) {
+ /* Cannot find matching field. */
+ fprintf(stderr, "[error] Cannot find matching field for enum field \"%s\" in variant.\n",
+ g_quark_to_string(tag));
+ return NULL;
+ }
+ index = GPOINTER_TO_UINT(value);
variant->current_field = g_ptr_array_index(variant->fields, index);
return variant->current_field;
}