static
void bt_ctf_field_sequence_freeze(struct bt_ctf_field *);
+static
+bool bt_ctf_field_generic_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_structure_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_variant_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_enumeration_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_array_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_sequence_is_set(struct bt_ctf_field *);
+
static
int increase_packet_size(struct ctf_stream_pos *pos);
[BT_CTF_TYPE_ID_SEQUENCE] = bt_ctf_field_sequence_freeze,
};
+static
+bool (* const field_is_set_funcs[])(struct bt_ctf_field *) = {
+ [BT_CTF_TYPE_ID_INTEGER] = bt_ctf_field_generic_is_set,
+ [BT_CTF_TYPE_ID_ENUM] = bt_ctf_field_enumeration_is_set,
+ [BT_CTF_TYPE_ID_FLOAT] = bt_ctf_field_generic_is_set,
+ [BT_CTF_TYPE_ID_STRUCT] = bt_ctf_field_structure_is_set,
+ [BT_CTF_TYPE_ID_VARIANT] = bt_ctf_field_variant_is_set,
+ [BT_CTF_TYPE_ID_ARRAY] = bt_ctf_field_array_is_set,
+ [BT_CTF_TYPE_ID_SEQUENCE] = bt_ctf_field_sequence_is_set,
+ [BT_CTF_TYPE_ID_STRING] = bt_ctf_field_generic_is_set,
+};
+
struct bt_ctf_field *bt_ctf_field_create(struct bt_ctf_field_type *type)
{
struct bt_ctf_field *field = NULL;
return container;
}
-const char *bt_ctf_field_enumeration_get_mapping_name(
- struct bt_ctf_field *field)
+struct bt_ctf_field_type_enumeration_mapping_iterator *
+bt_ctf_field_enumeration_get_mappings(struct bt_ctf_field *field)
{
int ret;
- const char *name = NULL;
struct bt_ctf_field *container = NULL;
struct bt_ctf_field_type *container_type = NULL;
struct bt_ctf_field_type_integer *integer_type = NULL;
- struct bt_ctf_field_type_enumeration *enumeration_type = NULL;
+ struct bt_ctf_field_type_enumeration_mapping_iterator *iter = NULL;
container = bt_ctf_field_enumeration_get_container(field);
if (!container) {
integer_type = container_of(container_type,
struct bt_ctf_field_type_integer, parent);
- enumeration_type = container_of(field->type,
- struct bt_ctf_field_type_enumeration, parent);
if (!integer_type->declaration.signedness) {
uint64_t value;
+
ret = bt_ctf_field_unsigned_integer_get_value(container,
&value);
if (ret) {
goto error_put_container_type;
}
-
- name = bt_ctf_field_type_enumeration_get_mapping_name_unsigned(
- enumeration_type, value);
+ iter = bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value(
+ field->type, value);
} else {
int64_t value;
+
ret = bt_ctf_field_signed_integer_get_value(container,
&value);
if (ret) {
goto error_put_container_type;
}
-
- name = bt_ctf_field_type_enumeration_get_mapping_name_signed(
- enumeration_type, value);
+ iter = bt_ctf_field_type_enumeration_find_mappings_by_signed_value(
+ field->type, value);
}
error_put_container_type:
error_put_container:
bt_put(container);
end:
- return name;
+ return iter;
}
int bt_ctf_field_signed_integer_get_value(struct bt_ctf_field *field,
return ret;
}
+
+BT_HIDDEN
+bool bt_ctf_field_is_set(struct bt_ctf_field *field)
+{
+ bool is_set = false;
+ enum bt_ctf_type_id type_id;
+
+ if (!field) {
+ goto end;
+ }
+
+ type_id = bt_ctf_field_type_get_type_id(field->type);
+ if (type_id <= BT_CTF_TYPE_ID_UNKNOWN || type_id >= BT_CTF_NR_TYPE_IDS) {
+ goto end;
+ }
+
+ is_set = field_is_set_funcs[type_id](field);
+end:
+ return is_set;
+}
+
struct bt_ctf_field *bt_ctf_field_copy(struct bt_ctf_field *field)
{
int ret;
for (i = 0; i < array->elements->len; i++) {
ret = bt_ctf_field_validate(array->elements->pdata[i]);
if (ret) {
- fprintf(stderr, "Failed to validate sequence field #%zu\n", i);
+ fprintf(stderr, "Failed to validate array field #%zu\n", i);
goto end;
}
}
struct bt_ctf_field_integer *integer = container_of(field,
struct bt_ctf_field_integer, parent);
+ if (!bt_ctf_field_generic_is_set(field)) {
+ ret = -1;
+ goto end;
+ }
retry:
ret = ctf_integer_write(&pos->parent, &integer->definition.p);
if (ret == -EFAULT) {
struct bt_ctf_field_floating_point *floating_point = container_of(field,
struct bt_ctf_field_floating_point, parent);
+ if (!bt_ctf_field_generic_is_set(field)) {
+ ret = -1;
+ goto end;
+ }
retry:
ret = ctf_float_write(&pos->parent, &floating_point->definition.p);
if (ret == -EFAULT) {
}
for (i = 0; i < structure->fields->len; i++) {
- struct bt_ctf_field *field = g_ptr_array_index(
+ struct bt_ctf_field *member = g_ptr_array_index(
structure->fields, i);
- ret = bt_ctf_field_serialize(field, pos);
+ ret = bt_ctf_field_serialize(member, pos);
if (ret) {
const char *name;
- struct bt_ctf_field_type *field_type =
+ struct bt_ctf_field_type *structure_type =
bt_ctf_field_get_type(field);
- (void) bt_ctf_field_type_structure_get_field(field_type,
- &name, NULL, i);
+ (void) bt_ctf_field_type_structure_get_field(
+ structure_type, &name, NULL, i);
fprintf(stderr, "Field %s failed to serialize\n",
name ? name : "NULL");
- bt_put(field_type);
+ bt_put(structure_type);
break;
}
}
end:
return;
}
+
+static
+bool bt_ctf_field_generic_is_set(struct bt_ctf_field *field)
+{
+ return field && field->payload_set;
+}
+
+static
+bool bt_ctf_field_enumeration_is_set(struct bt_ctf_field *field)
+{
+ bool is_set = false;
+ struct bt_ctf_field_enumeration *enumeration;
+
+ if (!field) {
+ goto end;
+ }
+
+ enumeration = container_of(field, struct bt_ctf_field_enumeration,
+ parent);
+ if (!enumeration->payload) {
+ goto end;
+ }
+
+ is_set = bt_ctf_field_is_set(enumeration->payload);
+end:
+ return is_set;
+}
+
+static
+bool bt_ctf_field_structure_is_set(struct bt_ctf_field *field)
+{
+ bool is_set = false;
+ size_t i;
+ struct bt_ctf_field_structure *structure;
+
+ if (!field) {
+ goto end;
+ }
+
+ structure = container_of(field, struct bt_ctf_field_structure, parent);
+ for (i = 0; i < structure->fields->len; i++) {
+ is_set = bt_ctf_field_is_set(structure->fields->pdata[i]);
+ if (!is_set) {
+ goto end;
+ }
+ }
+end:
+ return is_set;
+}
+
+static
+bool bt_ctf_field_variant_is_set(struct bt_ctf_field *field)
+{
+ bool is_set = false;
+ struct bt_ctf_field_variant *variant;
+
+ if (!field) {
+ goto end;
+ }
+
+ variant = container_of(field, struct bt_ctf_field_variant, parent);
+ is_set = bt_ctf_field_is_set(variant->payload);
+end:
+ return is_set;
+}
+
+static
+bool bt_ctf_field_array_is_set(struct bt_ctf_field *field)
+{
+ size_t i;
+ bool is_set = false;
+ struct bt_ctf_field_array *array;
+
+ if (!field) {
+ goto end;
+ }
+
+ array = container_of(field, struct bt_ctf_field_array, parent);
+ for (i = 0; i < array->elements->len; i++) {
+ is_set = bt_ctf_field_is_set(array->elements->pdata[i]);
+ if (!is_set) {
+ goto end;
+ }
+ }
+end:
+ return is_set;
+}
+
+static
+bool bt_ctf_field_sequence_is_set(struct bt_ctf_field *field)
+{
+ size_t i;
+ bool is_set = false;
+ struct bt_ctf_field_sequence *sequence;
+
+ if (!field) {
+ goto end;
+ }
+
+ sequence = container_of(field, struct bt_ctf_field_sequence, parent);
+ for (i = 0; i < sequence->elements->len; i++) {
+ is_set = bt_ctf_field_validate(sequence->elements->pdata[i]);
+ if (!is_set) {
+ goto end;
+ }
+ }
+end:
+ return is_set;
+}