ir: support optional parameters in bt_ctf_field_type_variant_get_field
[babeltrace.git] / formats / ctf / ir / event-types.c
index 9a8ce8965b4cbaa9e8548db367c0986c305bdcaf..fabaea51ca769c23dcebea2bd5baaef5df684ae3 100644 (file)
@@ -1207,8 +1207,7 @@ int bt_ctf_field_type_structure_get_field(struct bt_ctf_field_type *type,
        struct structure_field *field;
        int ret = 0;
 
-       if (!type || index < 0 || !field_name || !field_type ||
-               (type->declaration->id != CTF_TYPE_STRUCT)) {
+       if (!type || index < 0 || (type->declaration->id != CTF_TYPE_STRUCT)) {
                ret = -1;
                goto end;
        }
@@ -1221,9 +1220,13 @@ int bt_ctf_field_type_structure_get_field(struct bt_ctf_field_type *type,
        }
 
        field = g_ptr_array_index(structure->fields, index);
-       *field_type = field->type;
-       bt_ctf_field_type_get(field->type);
-       *field_name = g_quark_to_string(field->name);
+       if (field_type) {
+               *field_type = field->type;
+               bt_ctf_field_type_get(field->type);
+       }
+       if (field_name) {
+               *field_name = g_quark_to_string(field->name);
+       }
 end:
        return ret;
 }
@@ -1484,8 +1487,7 @@ int bt_ctf_field_type_variant_get_field(struct bt_ctf_field_type *type,
        struct structure_field *field;
        int ret = 0;
 
-       if (!type || index < 0 || !field_name || !field_type ||
-               (type->declaration->id != CTF_TYPE_VARIANT)) {
+       if (!type || index < 0 || (type->declaration->id != CTF_TYPE_VARIANT)) {
                ret = -1;
                goto end;
        }
@@ -1498,9 +1500,13 @@ int bt_ctf_field_type_variant_get_field(struct bt_ctf_field_type *type,
        }
 
        field = g_ptr_array_index(variant->fields, index);
-       *field_type = field->type;
-       bt_ctf_field_type_get(field->type);
-       *field_name = g_quark_to_string(field->name);
+       if (field_type) {
+               *field_type = field->type;
+               bt_ctf_field_type_get(field->type);
+       }
+       if (field_name) {
+               *field_name = g_quark_to_string(field->name);
+       }
 end:
        return ret;
 }
@@ -2071,6 +2077,77 @@ int bt_ctf_field_type_variant_get_field_name_index(
 end:
        return ret;
 }
+
+BT_HIDDEN
+int bt_ctf_field_type_sequence_set_length_field_path(
+               struct bt_ctf_field_type *type,
+               struct bt_ctf_field_path *path)
+{
+       int ret = 0;
+       struct bt_ctf_field_type_sequence *sequence;
+
+       if (!type || bt_ctf_field_type_get_type_id(type) != CTF_TYPE_SEQUENCE) {
+               ret = -1;
+               goto end;
+       }
+
+       sequence = container_of(type, struct bt_ctf_field_type_sequence,
+               parent);
+       if (sequence->length_field_path) {
+               bt_ctf_field_path_destroy(sequence->length_field_path);
+       }
+       sequence->length_field_path = path;
+end:
+       return ret;
+}
+
+BT_HIDDEN
+int bt_ctf_field_type_variant_set_tag_field_path(struct bt_ctf_field_type *type,
+               struct bt_ctf_field_path *path)
+{
+       int ret = 0;
+       struct bt_ctf_field_type_variant *variant;
+
+       if (!type || bt_ctf_field_type_get_type_id(type) != CTF_TYPE_VARIANT) {
+               ret = -1;
+               goto end;
+       }
+
+       variant = container_of(type, struct bt_ctf_field_type_variant,
+               parent);
+       if (variant->tag_path) {
+               bt_ctf_field_path_destroy(variant->tag_path);
+       }
+       variant->tag_path = path;
+end:
+       return ret;
+}
+
+BT_HIDDEN
+int bt_ctf_field_type_variant_set_tag(struct bt_ctf_field_type *type,
+               struct bt_ctf_field_type *tag)
+{
+       int ret = 0;
+       struct bt_ctf_field_type_variant *variant;
+
+       if (!type || !tag || type->frozen ||
+               bt_ctf_field_type_get_type_id(tag) != CTF_TYPE_ENUM) {
+               ret = -1;
+               goto end;
+       }
+
+       variant = container_of(type, struct bt_ctf_field_type_variant,
+               parent);
+       bt_ctf_field_type_get(tag);
+       if (variant->tag) {
+               bt_ctf_field_type_put(&variant->tag->parent);
+       }
+       variant->tag = container_of(tag, struct bt_ctf_field_type_enumeration,
+               parent);
+end:
+       return ret;
+}
+
 static
 void bt_ctf_field_type_integer_destroy(struct bt_ctf_ref *ref)
 {
@@ -2154,6 +2231,7 @@ void bt_ctf_field_type_variant_destroy(struct bt_ctf_ref *ref)
        g_hash_table_destroy(variant->field_name_to_index);
        g_string_free(variant->tag_name, TRUE);
        bt_ctf_field_type_put(&variant->tag->parent);
+       bt_ctf_field_path_destroy(variant->tag_path);
        g_free(variant);
 }
 
@@ -2187,6 +2265,7 @@ void bt_ctf_field_type_sequence_destroy(struct bt_ctf_ref *ref)
                struct bt_ctf_field_type_sequence, parent);
        bt_ctf_field_type_put(sequence->element_type);
        g_string_free(sequence->length_field_name, TRUE);
+       bt_ctf_field_path_destroy(sequence->length_field_path);
        g_free(sequence);
 }
 
@@ -2970,6 +3049,13 @@ struct bt_ctf_field_type *bt_ctf_field_type_variant_copy(
        }
 
        copy_variant->declaration = variant->declaration;
+       if (variant->tag_path) {
+               copy_variant->tag_path = bt_ctf_field_path_copy(
+                       variant->tag_path);
+               if (!copy_variant->tag_path) {
+                       goto error;
+               }
+       }
 end:
        if (copy_tag) {
                bt_ctf_field_type_put(copy_tag);
@@ -3039,12 +3125,25 @@ struct bt_ctf_field_type *bt_ctf_field_type_sequence_copy(
        copy_sequence = container_of(copy, struct bt_ctf_field_type_sequence,
                parent);
        copy_sequence->declaration = sequence->declaration;
+       if (sequence->length_field_path) {
+               copy_sequence->length_field_path = bt_ctf_field_path_copy(
+                       sequence->length_field_path);
+               if (!copy_sequence->length_field_path) {
+                       goto error;
+               }
+       }
 end:
        if (copy_element) {
                bt_ctf_field_type_put(copy_element);
        }
 
        return copy;
+error:
+       if (copy) {
+               bt_ctf_field_type_put(copy);
+               copy = NULL;
+       }
+       goto end;
 }
 
 static
This page took 0.025946 seconds and 4 git commands to generate.