X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=formats%2Fctf%2Fir%2Fevent-fields.c;h=f524d5dbb8ce2fef86b935a5d4e69226e4c1999d;hb=70996764ff14d6f6d0710a8a45e23a907a0900f9;hp=e49a17be9b147f732b36e58b739cccef6e33893a;hpb=87d43dc1dc02f178e8b5cbfe2cd3d481752e6007;p=babeltrace.git diff --git a/formats/ctf/ir/event-fields.c b/formats/ctf/ir/event-fields.c index e49a17be..f524d5db 100644 --- a/formats/ctf/ir/event-fields.c +++ b/formats/ctf/ir/event-fields.c @@ -76,32 +76,32 @@ static void bt_ctf_field_string_destroy(struct bt_ctf_field *); static -int bt_ctf_field_generic_validate(struct bt_ctf_field *field); +int bt_ctf_field_generic_validate(struct bt_ctf_field *); static -int bt_ctf_field_structure_validate(struct bt_ctf_field *field); +int bt_ctf_field_structure_validate(struct bt_ctf_field *); static -int bt_ctf_field_variant_validate(struct bt_ctf_field *field); +int bt_ctf_field_variant_validate(struct bt_ctf_field *); static -int bt_ctf_field_enumeration_validate(struct bt_ctf_field *field); +int bt_ctf_field_enumeration_validate(struct bt_ctf_field *); static -int bt_ctf_field_array_validate(struct bt_ctf_field *field); +int bt_ctf_field_array_validate(struct bt_ctf_field *); static -int bt_ctf_field_sequence_validate(struct bt_ctf_field *field); +int bt_ctf_field_sequence_validate(struct bt_ctf_field *); static -int bt_ctf_field_generic_reset(struct bt_ctf_field *field); +int bt_ctf_field_generic_reset(struct bt_ctf_field *); static -int bt_ctf_field_structure_reset(struct bt_ctf_field *field); +int bt_ctf_field_structure_reset(struct bt_ctf_field *); static -int bt_ctf_field_variant_reset(struct bt_ctf_field *field); +int bt_ctf_field_variant_reset(struct bt_ctf_field *); static -int bt_ctf_field_enumeration_reset(struct bt_ctf_field *field); +int bt_ctf_field_enumeration_reset(struct bt_ctf_field *); static -int bt_ctf_field_array_reset(struct bt_ctf_field *field); +int bt_ctf_field_array_reset(struct bt_ctf_field *); static -int bt_ctf_field_sequence_reset(struct bt_ctf_field *field); +int bt_ctf_field_sequence_reset(struct bt_ctf_field *); static -int bt_ctf_field_string_reset(struct bt_ctf_field *field); +int bt_ctf_field_string_reset(struct bt_ctf_field *); static int bt_ctf_field_integer_serialize(struct bt_ctf_field *, @@ -150,7 +150,7 @@ static int increase_packet_size(struct ctf_stream_pos *pos); static -struct bt_ctf_field *(*field_create_funcs[])( +struct bt_ctf_field *(* const field_create_funcs[])( struct bt_ctf_field_type *) = { [CTF_TYPE_INTEGER] = bt_ctf_field_integer_create, [CTF_TYPE_ENUM] = bt_ctf_field_enumeration_create, @@ -164,7 +164,7 @@ struct bt_ctf_field *(*field_create_funcs[])( }; static -void (*field_destroy_funcs[])(struct bt_ctf_field *) = { +void (* const field_destroy_funcs[])(struct bt_ctf_field *) = { [CTF_TYPE_INTEGER] = bt_ctf_field_integer_destroy, [CTF_TYPE_ENUM] = bt_ctf_field_enumeration_destroy, [CTF_TYPE_FLOAT] = @@ -177,7 +177,7 @@ void (*field_destroy_funcs[])(struct bt_ctf_field *) = { }; static -int (*field_validate_funcs[])(struct bt_ctf_field *) = { +int (* const field_validate_funcs[])(struct bt_ctf_field *) = { [CTF_TYPE_INTEGER] = bt_ctf_field_generic_validate, [CTF_TYPE_ENUM] = bt_ctf_field_enumeration_validate, [CTF_TYPE_FLOAT] = bt_ctf_field_generic_validate, @@ -189,7 +189,7 @@ int (*field_validate_funcs[])(struct bt_ctf_field *) = { }; static -int (*field_reset_funcs[])(struct bt_ctf_field *) = { +int (* const field_reset_funcs[])(struct bt_ctf_field *) = { [CTF_TYPE_INTEGER] = bt_ctf_field_generic_reset, [CTF_TYPE_ENUM] = bt_ctf_field_enumeration_reset, [CTF_TYPE_FLOAT] = bt_ctf_field_generic_reset, @@ -201,7 +201,7 @@ int (*field_reset_funcs[])(struct bt_ctf_field *) = { }; static -int (*field_serialize_funcs[])(struct bt_ctf_field *, +int (* const field_serialize_funcs[])(struct bt_ctf_field *, struct ctf_stream_pos *) = { [CTF_TYPE_INTEGER] = bt_ctf_field_integer_serialize, [CTF_TYPE_ENUM] = bt_ctf_field_enumeration_serialize, @@ -215,7 +215,8 @@ int (*field_serialize_funcs[])(struct bt_ctf_field *, }; static -int (*field_copy_funcs[])(struct bt_ctf_field *, struct bt_ctf_field *) = { +int (* const field_copy_funcs[])(struct bt_ctf_field *, + struct bt_ctf_field *) = { [CTF_TYPE_INTEGER] = bt_ctf_field_integer_copy, [CTF_TYPE_ENUM] = bt_ctf_field_enumeration_copy, [CTF_TYPE_FLOAT] = bt_ctf_field_floating_point_copy, @@ -918,6 +919,72 @@ end: return ret; } +int bt_ctf_field_string_append(struct bt_ctf_field *field, + const char *value) +{ + int ret = 0; + struct bt_ctf_field_string *string_field; + + if (!field || !value || + bt_ctf_field_type_get_type_id(field->type) != + CTF_TYPE_STRING) { + ret = -1; + goto end; + } + + string_field = container_of(field, struct bt_ctf_field_string, parent); + + if (string_field->payload) { + g_string_append(string_field->payload, value); + } else { + string_field->payload = g_string_new(value); + } + + string_field->parent.payload_set = 1; + +end: + return ret; +} + +int bt_ctf_field_string_append_len(struct bt_ctf_field *field, + const char *value, unsigned int length) +{ + int i; + int ret = 0; + unsigned int effective_length = length; + struct bt_ctf_field_string *string_field; + + if (!field || !value || + bt_ctf_field_type_get_type_id(field->type) != + CTF_TYPE_STRING) { + ret = -1; + goto end; + } + + string_field = container_of(field, struct bt_ctf_field_string, parent); + + /* make sure no null bytes are appended */ + for (i = 0; i < length; ++i) { + if (value[i] == '\0') { + effective_length = i; + break; + } + } + + if (string_field->payload) { + g_string_append_len(string_field->payload, value, + effective_length); + } else { + string_field->payload = g_string_new_len(value, + effective_length); + } + + string_field->parent.payload_set = 1; + +end: + return ret; +} + BT_HIDDEN int bt_ctf_field_validate(struct bt_ctf_field *field) { @@ -993,13 +1060,11 @@ struct bt_ctf_field *bt_ctf_field_copy(struct bt_ctf_field *field) enum ctf_type_id type_id; if (!field) { - ret = -1; goto end; } type_id = bt_ctf_field_type_get_type_id(field->type); if (type_id <= CTF_TYPE_UNKNOWN || type_id >= NR_CTF_TYPES) { - ret = -1; goto end; } @@ -1008,8 +1073,7 @@ struct bt_ctf_field *bt_ctf_field_copy(struct bt_ctf_field *field) goto end; } - bt_ctf_field_type_get(field->type); - copy->type = field->type; + copy->payload_set = field->payload_set; ret = field_copy_funcs[type_id](field, copy); if (ret) { bt_ctf_field_put(copy); @@ -1291,7 +1355,9 @@ void bt_ctf_field_string_destroy(struct bt_ctf_field *field) } string = container_of(field, struct bt_ctf_field_string, parent); - g_string_free(string->payload, TRUE); + if (string->payload) { + g_string_free(string->payload, TRUE); + } g_free(string); } @@ -1772,7 +1838,7 @@ int bt_ctf_field_integer_copy(struct bt_ctf_field *src, struct bt_ctf_field_integer *integer_src, *integer_dst; integer_src = container_of(src, struct bt_ctf_field_integer, parent); - integer_dst = container_of(src, struct bt_ctf_field_integer, parent); + integer_dst = container_of(dst, struct bt_ctf_field_integer, parent); memcpy(&integer_dst->definition, &integer_src->definition, sizeof(struct definition_integer)); @@ -1826,18 +1892,15 @@ static int bt_ctf_field_structure_copy(struct bt_ctf_field *src, struct bt_ctf_field *dst) { - int ret, i; + int ret = 0, i; struct bt_ctf_field_structure *struct_src, *struct_dst; struct_src = container_of(src, struct bt_ctf_field_structure, parent); struct_dst = container_of(dst, struct bt_ctf_field_structure, parent); + /* This field_name_to_index HT is owned by the structure field type */ struct_dst->field_name_to_index = struct_src->field_name_to_index; - struct_dst->fields = g_ptr_array_sized_new(struct_src->fields->len); - if (!struct_dst->fields) { - ret = -1; - goto end; - } + g_ptr_array_set_size(struct_dst->fields, struct_src->fields->len); for (i = 0; i < struct_src->fields->len; i++) { struct bt_ctf_field *field_copy = bt_ctf_field_copy( @@ -1847,7 +1910,7 @@ int bt_ctf_field_structure_copy(struct bt_ctf_field *src, ret = -1; goto end; } - g_ptr_array_add(struct_dst->fields, field_copy); + g_ptr_array_index(struct_dst->fields, i) = field_copy; } end: return ret; @@ -1891,7 +1954,7 @@ int bt_ctf_field_array_copy(struct bt_ctf_field *src, array_src = container_of(src, struct bt_ctf_field_array, parent); array_dst = container_of(dst, struct bt_ctf_field_array, parent); - array_dst->elements = g_ptr_array_sized_new(array_src->elements->len); + g_ptr_array_set_size(array_dst->elements, array_src->elements->len); for (i = 0; i < array_src->elements->len; i++) { struct bt_ctf_field *field_copy = bt_ctf_field_copy( g_ptr_array_index(array_src->elements, i)); @@ -1900,7 +1963,7 @@ int bt_ctf_field_array_copy(struct bt_ctf_field *src, ret = -1; goto end; } - g_ptr_array_add(array_dst->elements, field_copy); + g_ptr_array_index(array_dst->elements, i) = field_copy; } end: return ret; @@ -1916,7 +1979,7 @@ int bt_ctf_field_sequence_copy(struct bt_ctf_field *src, sequence_src = container_of(src, struct bt_ctf_field_sequence, parent); sequence_dst = container_of(dst, struct bt_ctf_field_sequence, parent); - sequence_dst->elements = g_ptr_array_sized_new( + g_ptr_array_set_size(sequence_dst->elements, sequence_src->elements->len); for (i = 0; i < sequence_src->elements->len; i++) { struct bt_ctf_field *field_copy = bt_ctf_field_copy( @@ -1926,7 +1989,7 @@ int bt_ctf_field_sequence_copy(struct bt_ctf_field *src, ret = -1; goto end; } - g_ptr_array_add(sequence_dst->elements, field_copy); + g_ptr_array_index(sequence_dst->elements, i) = field_copy; } end: return ret;