ir: add bt_ctf_field_string_append_len()
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Wed, 15 Apr 2015 21:20:25 +0000 (17:20 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Mon, 20 Apr 2015 14:38:22 +0000 (10:38 -0400)
Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
formats/ctf/ir/event-fields.c
include/babeltrace/ctf-ir/event-fields.h

index 92c06da8b0ec8a7bf58ae3cd76d8e0aea38e2bef..c80c12fe0c02119020e656a32eaf6b6b2fcb7c94 100644 (file)
@@ -946,6 +946,45 @@ 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_insert_len(string_field->payload, -1, 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)
 {
index 489c2bf8ee0a5f9c2722b90dfb4bcf21af409965..b102d6323a51b6b8056655b61e5ec762560099b4 100644 (file)
@@ -304,6 +304,28 @@ extern int bt_ctf_field_string_set_value(struct bt_ctf_field *string_field,
 extern int bt_ctf_field_string_append(struct bt_ctf_field *string_field,
                const char *value);
 
+/*
+ * bt_ctf_field_string_append_len: append a string of a given length to
+ * a string field's current value.
+ *
+ * Append a string of a given length to the current value of a string
+ * field. If the string field was never set using
+ * bt_ctf_field_string_set_value(), it is first set to an empty string,
+ * and then the concatenation happens.
+ *
+ * If a null byte is encountered before the given length, only the
+ * substring before the first null byte is appended.
+ *
+ * @param string_field String field instance.
+ * @param value String to append to the current string field's value.
+ * @param length Length of string value to append.
+ *
+ * Returns 0 on success, a negative value on error.
+ */
+extern int bt_ctf_field_string_append_len(
+               struct bt_ctf_field *string_field, const char *value,
+               unsigned int length);
+
 /*
  * bt_ctf_field_get_type: get a field's type
  *
This page took 0.027191 seconds and 4 git commands to generate.