From 3f4a108db93fa672654a73aa87b34969c8097eed Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Sun, 24 May 2015 20:24:54 -0400 Subject: [PATCH] ir: add bt_ctf_field_variant_get_current_field() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Philippe Proulx Signed-off-by: Jérémie Galarneau --- formats/ctf/ir/event-fields.c | 25 ++++++++++++++++++++++++ include/babeltrace/ctf-ir/event-fields.h | 16 +++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/formats/ctf/ir/event-fields.c b/formats/ctf/ir/event-fields.c index 29c5397f..00c38c1f 100644 --- a/formats/ctf/ir/event-fields.c +++ b/formats/ctf/ir/event-fields.c @@ -652,6 +652,31 @@ end: return new_field; } +struct bt_ctf_field *bt_ctf_field_variant_get_current_field( + struct bt_ctf_field *variant_field) +{ + struct bt_ctf_field *current_field = NULL; + struct bt_ctf_field_variant *variant; + + if (!variant_field || + bt_ctf_field_type_get_type_id(variant_field->type) != + CTF_TYPE_VARIANT) { + goto end; + } + + variant = container_of(variant_field, struct bt_ctf_field_variant, + parent); + + if (variant->payload) { + current_field = variant->payload; + bt_ctf_field_get(current_field); + goto end; + } + +end: + return current_field; +} + struct bt_ctf_field *bt_ctf_field_enumeration_get_container( struct bt_ctf_field *field) { diff --git a/include/babeltrace/ctf-ir/event-fields.h b/include/babeltrace/ctf-ir/event-fields.h index 1d8f6439..4a55b449 100644 --- a/include/babeltrace/ctf-ir/event-fields.h +++ b/include/babeltrace/ctf-ir/event-fields.h @@ -154,6 +154,22 @@ extern struct bt_ctf_field *bt_ctf_field_sequence_get_field( extern struct bt_ctf_field *bt_ctf_field_variant_get_field( struct bt_ctf_field *variant, struct bt_ctf_field *tag); +/* + * bt_ctf_field_variant_get_current_field: get the current selected field of a + * variant. + * + * Return the variant's current selected field. This function, unlike + * bt_ctf_field_variant_get_field(), does not create any field; it + * returns NULL if there's no current selected field yet. + * + * @param variant Variant field instance. + * + * Returns a field instance on success, NULL on error or when there's no + * current selected field. + */ +extern struct bt_ctf_field *bt_ctf_field_variant_get_current_field( + struct bt_ctf_field *variant); + /* * bt_ctf_field_enumeration_get_container: get an enumeration field's container. * -- 2.34.1