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;
}
}
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;
}
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;
}
}
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;
}
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)
{
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);
}
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);
}
}
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);
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