From 43f9090cab93646a1651720ecc1c52758cae7795 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Thu, 14 Jul 2011 09:40:28 -0400 Subject: [PATCH] Duplicate variant field name check Check that no field with the same name has been defined in the variant. Signed-off-by: Mathieu Desnoyers --- .../ctf/metadata/ctf-visitor-generate-io-struct.c | 7 +++++++ types/variant.c | 15 +++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index 640b8fdf..bdb5c68d 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -468,6 +468,13 @@ int ctf_variant_type_declarators_visit(FILE *fd, int depth, fprintf(fd, "[error] %s: unable to find variant field declaration type\n", __func__); return -EINVAL; } + + if (untagged_variant_declaration_get_field_from_tag(untagged_variant_declaration, field_name) != NULL) { + fprintf(fd, "[error] %s: duplicate field %s in variant\n", __func__, g_quark_to_string(field_name)); + return -EINVAL; + } + + untagged_variant_declaration_add_field(untagged_variant_declaration, g_quark_to_string(field_name), field_declaration); diff --git a/types/variant.c b/types/variant.c index bb4faa17..1229f582 100644 --- a/types/variant.c +++ b/types/variant.c @@ -273,11 +273,18 @@ void untagged_variant_declaration_add_field(struct declaration_untagged_variant struct declaration_field * untagged_variant_declaration_get_field_from_tag(struct declaration_untagged_variant *untagged_variant_declaration, GQuark tag) { - unsigned long index; + gpointer index; + gboolean found; - index = (unsigned long) g_hash_table_lookup(untagged_variant_declaration->fields_by_tag, - (gconstpointer) (unsigned long) tag); - return &g_array_index(untagged_variant_declaration->fields, struct declaration_field, index); + found = g_hash_table_lookup_extended( + untagged_variant_declaration->fields_by_tag, + (gconstpointer) (unsigned long) tag, NULL, &index); + + if (!found) { + return NULL; + } + + return &g_array_index(untagged_variant_declaration->fields, struct declaration_field, (unsigned long)index); } /* -- 2.34.1