Fix: ir: bt_ctf_field_copy(): copy payload_set
[babeltrace.git] / formats / ctf / ir / event-fields.c
index f9288f2b98f58d963345d27299f9b7cd4dfcf711..f524d5dbb8ce2fef86b935a5d4e69226e4c1999d 100644 (file)
@@ -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)
 {
@@ -1006,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);
@@ -1289,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);
 }
 
@@ -1770,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));
@@ -1824,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(
@@ -1845,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;
@@ -1889,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));
@@ -1898,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;
@@ -1914,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(
@@ -1924,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;
This page took 0.026171 seconds and 4 git commands to generate.