struct bt_ctf_field *bt_ctf_field_enumeration_get_container( struct bt_ctf_field *field) { struct bt_ctf_field *container = NULL; struct bt_ctf_field_enumeration *enumeration; if (!field || bt_ctf_field_type_get_type_id(field->type) != CTF_TYPE_ENUM) { goto end; } enumeration = container_of(field, struct bt_ctf_field_enumeration, parent); if (!enumeration->payload) { struct bt_ctf_field_type_enumeration *enumeration_type = container_of(field->type, struct bt_ctf_field_type_enumeration, parent); enumeration->payload = bt_ctf_field_create(enumeration_type->container); } container = enumeration->payload; bt_ctf_field_get(container); end: return container; }
struct bt_ctf_field *bt_ctf_field_sequence_get_field(struct bt_ctf_field *field, uint64_t index) { struct bt_ctf_field *new_field = NULL; struct bt_ctf_field_type *field_type = NULL; struct bt_ctf_field_sequence *sequence; if (!field || bt_ctf_field_type_get_type_id(field->type) != CTF_TYPE_SEQUENCE) { goto end; } sequence = container_of(field, struct bt_ctf_field_sequence, parent); if (!sequence->elements || sequence->elements->len <= index) { goto end; } field_type = bt_ctf_field_type_sequence_get_element_type(field->type); if (sequence->elements->pdata[(size_t)index]) { new_field = sequence->elements->pdata[(size_t)index]; goto end; } new_field = bt_ctf_field_create(field_type); bt_ctf_field_get(new_field); sequence->elements->pdata[(size_t)index] = new_field; end: if (field_type) { bt_ctf_field_type_put(field_type); } return new_field; }
struct bt_ctf_field *bt_ctf_field_array_get_field(struct bt_ctf_field *field, uint64_t index) { struct bt_ctf_field *new_field = NULL; struct bt_ctf_field_type *field_type = NULL; struct bt_ctf_field_array *array; if (!field || bt_ctf_field_type_get_type_id(field->type) != CTF_TYPE_ARRAY) { goto end; } array = container_of(field, struct bt_ctf_field_array, parent); if (index >= array->elements->len) { goto end; } field_type = bt_ctf_field_type_array_get_element_type(field->type); if (array->elements->pdata[(size_t)index]) { new_field = array->elements->pdata[(size_t)index]; goto end; } new_field = bt_ctf_field_create(field_type); bt_ctf_field_get(new_field); array->elements->pdata[(size_t)index] = new_field; end: if (field_type) { bt_ctf_field_type_put(field_type); } return new_field; }
static int bt_ctf_field_string_serialize(struct bt_ctf_field *field, struct ctf_stream_pos *pos) { size_t i; int ret = 0; struct bt_ctf_field_string *string = container_of(field, struct bt_ctf_field_string, parent); struct bt_ctf_field_type *character_type = get_field_type(FIELD_TYPE_ALIAS_UINT8_T); struct bt_ctf_field *character = bt_ctf_field_create(character_type); for (i = 0; i < string->payload->len + 1; i++) { ret = bt_ctf_field_unsigned_integer_set_value(character, (uint64_t) string->payload->str[i]); if (ret) { goto end; } ret = bt_ctf_field_integer_serialize(character, pos); if (ret) { goto end; } } end: bt_ctf_field_put(character); bt_ctf_field_type_put(character_type); return ret; }
static __maybe_unused int value_set_string(struct ctf_writer *cw, struct bt_ctf_event *event, const char *name, const char *string) { struct bt_ctf_field_type *type = cw->data.string; struct bt_ctf_field *field; int ret = 0; field = bt_ctf_field_create(type); if (!field) { pr_err("failed to create a field %s\n", name); return -1; } ret = string_set_value(field, string); if (ret) { pr_err("failed to set value %s\n", name); goto err_put_field; } ret = bt_ctf_event_set_payload(event, name, field); if (ret) pr_err("failed to set payload %s\n", name); err_put_field: bt_ctf_field_put(field); return ret; }
struct bt_ctf_field *bt_ctf_field_variant_get_field(struct bt_ctf_field *field, struct bt_ctf_field *tag_field) { struct bt_ctf_field *new_field = NULL; struct bt_ctf_field_variant *variant; struct bt_ctf_field_type_variant *variant_type; struct bt_ctf_field_type *field_type; struct bt_ctf_field *tag_enum = NULL; struct bt_ctf_field_integer *tag_enum_integer; int64_t tag_enum_value; if (!field || !tag_field || bt_ctf_field_type_get_type_id(field->type) != CTF_TYPE_VARIANT || bt_ctf_field_type_get_type_id(tag_field->type) != CTF_TYPE_ENUM) { goto end; } variant = container_of(field, struct bt_ctf_field_variant, parent); variant_type = container_of(field->type, struct bt_ctf_field_type_variant, parent); tag_enum = bt_ctf_field_enumeration_get_container(tag_field); if (!tag_enum) { goto end; } tag_enum_integer = container_of(tag_enum, struct bt_ctf_field_integer, parent); if (!bt_ctf_field_validate(variant->tag)) { goto end; } tag_enum_value = tag_enum_integer->definition.value._signed; field_type = bt_ctf_field_type_variant_get_field_type_signed( variant_type, tag_enum_value); if (!field_type) { goto end; } new_field = bt_ctf_field_create(field_type); if (!new_field) { goto end; } bt_ctf_field_put(variant->tag); bt_ctf_field_put(variant->payload); bt_ctf_field_get(new_field); bt_ctf_field_get(tag_field); variant->tag = tag_field; variant->payload = new_field; end: bt_ctf_field_put(tag_enum); return new_field; }