Add utility function to validate CTF identifiers
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 23 Jan 2015 21:24:52 +0000 (16:24 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 23 Jan 2015 22:33:07 +0000 (17:33 -0500)
Introduces bt_ctf_validate_identifier() which validates a given
identifier against the list of CTF reserved keywords.

This function may evolve to perform additional validity checks in
the future as the CTF specification moves forward.

Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
formats/ctf/ir/Makefile.am
formats/ctf/ir/clock.c
formats/ctf/ir/event-types.c
formats/ctf/ir/event.c
formats/ctf/ir/stream-class.c
formats/ctf/ir/trace.c
formats/ctf/ir/utils.c [new file with mode: 0644]
include/Makefile.am
include/babeltrace/ctf-ir/trace-internal.h
include/babeltrace/ctf-ir/utils.h [new file with mode: 0644]

index 955efc7426e644420835257cceb0e8f131becb26..b36091763723f30db6c925bf3c04dbb389d47c35 100644 (file)
@@ -9,7 +9,8 @@ libctf_ir_la_SOURCES = \
        event-types.c \
        stream.c \
        stream-class.c \
-       trace.c
+       trace.c \
+       utils.c
 
 libctf_ir_la_LIBADD = \
        $(top_builddir)/lib/libbabeltrace.la
index fa073073f17095462baddde1f65d5e9ae5de3bac..d1f435d50ae567ed6d879b32ce8647ca962bb2ac 100644 (file)
@@ -27,6 +27,7 @@
  */
 
 #include <babeltrace/ctf-ir/clock-internal.h>
+#include <babeltrace/ctf-ir/utils.h>
 #include <babeltrace/ctf-writer/writer-internal.h>
 #include <babeltrace/compiler.h>
 #include <inttypes.h>
@@ -57,7 +58,7 @@ int bt_ctf_clock_set_name(struct bt_ctf_clock *clock,
 {
        int ret = 0;
 
-       if (validate_identifier(name)) {
+       if (bt_ctf_validate_identifier(name)) {
                ret = -1;
                goto end;
        }
index 1d5f0909a16213894925711cf6d568f97ffae11d..a57aaf5a5c5556c5be12204afc9b2c9e705b8ff4 100644 (file)
@@ -28,6 +28,7 @@
 
 #include <babeltrace/ctf-writer/event-types.h>
 #include <babeltrace/ctf-ir/event-types-internal.h>
+#include <babeltrace/ctf-ir/utils.h>
 #include <babeltrace/ctf-writer/writer-internal.h>
 #include <babeltrace/compiler.h>
 #include <babeltrace/endian.h>
@@ -1032,7 +1033,7 @@ int bt_ctf_field_type_structure_add_field(struct bt_ctf_field_type *type,
        struct bt_ctf_field_type_structure *structure;
 
        if (!type || !field_type || type->frozen ||
-               validate_identifier(field_name) ||
+               bt_ctf_validate_identifier(field_name) ||
                (type->declaration->id != CTF_TYPE_STRUCT) ||
                bt_ctf_field_type_validate(field_type)) {
                ret = -1;
@@ -1140,7 +1141,7 @@ struct bt_ctf_field_type *bt_ctf_field_type_variant_create(
 {
        struct bt_ctf_field_type_variant *variant = NULL;
 
-       if (!enum_tag || validate_identifier(tag_name) ||
+       if (!enum_tag || bt_ctf_validate_identifier(tag_name) ||
                (enum_tag->declaration->id != CTF_TYPE_ENUM)) {
                goto error;
        }
@@ -1209,7 +1210,7 @@ int bt_ctf_field_type_variant_add_field(struct bt_ctf_field_type *type,
        GQuark field_name_quark = g_quark_from_string(field_name);
 
        if (!type || !field_type || type->frozen ||
-               validate_identifier(field_name) ||
+               bt_ctf_validate_identifier(field_name) ||
                (type->declaration->id != CTF_TYPE_VARIANT) ||
                bt_ctf_field_type_validate(field_type)) {
                ret = -1;
@@ -1407,7 +1408,7 @@ struct bt_ctf_field_type *bt_ctf_field_type_sequence_create(
 {
        struct bt_ctf_field_type_sequence *sequence = NULL;
 
-       if (!element_type || validate_identifier(length_field_name) ||
+       if (!element_type || bt_ctf_validate_identifier(length_field_name) ||
                bt_ctf_field_type_validate(element_type)) {
                goto error;
        }
index 943295cb5e0d845615b9a68a405913cbb028961e..000f5f7c7461b21b3db0e2a465c2cf3d347d573a 100644 (file)
@@ -34,6 +34,7 @@
 #include <babeltrace/ctf-ir/event-internal.h>
 #include <babeltrace/ctf-ir/stream-class.h>
 #include <babeltrace/ctf-ir/trace-internal.h>
+#include <babeltrace/ctf-ir/utils.h>
 #include <babeltrace/compiler.h>
 
 static
@@ -45,7 +46,7 @@ struct bt_ctf_event_class *bt_ctf_event_class_create(const char *name)
 {
        struct bt_ctf_event_class *event_class = NULL;
 
-       if (validate_identifier(name)) {
+       if (bt_ctf_validate_identifier(name)) {
                goto end;
        }
 
@@ -133,7 +134,7 @@ int bt_ctf_event_class_add_field(struct bt_ctf_event_class *event_class,
 {
        int ret = 0;
 
-       if (!event_class || !type || validate_identifier(name) ||
+       if (!event_class || !type || bt_ctf_validate_identifier(name) ||
                event_class->frozen) {
                ret = -1;
                goto end;
@@ -346,7 +347,7 @@ int bt_ctf_event_set_payload(struct bt_ctf_event *event,
 {
        int ret = 0;
 
-       if (!event || !value || validate_identifier(name)) {
+       if (!event || !value || bt_ctf_validate_identifier(name)) {
                ret = -1;
                goto end;
        }
index 058f4b29ecd1765f6a7d0521d58c02eb559a73c5..d034340da2df756e6e20e4704f59250fe815eb3c 100644 (file)
@@ -35,6 +35,7 @@
 #include <babeltrace/ctf-writer/stream.h>
 #include <babeltrace/ctf-ir/stream-class-internal.h>
 #include <babeltrace/ctf-writer/functor-internal.h>
+#include <babeltrace/ctf-ir/utils.h>
 #include <babeltrace/compiler.h>
 #include <babeltrace/align.h>
 
@@ -52,7 +53,7 @@ struct bt_ctf_stream_class *bt_ctf_stream_class_create(const char *name)
        int ret;
        struct bt_ctf_stream_class *stream_class = NULL;
 
-       if (!name || !strlen(name)) {
+       if (!name || !strlen(name) || bt_ctf_validate_identifier(name)) {
                goto error;
        }
 
index 6ffef05bea62b9297b132deae50f0eab833c6c00..68bfd67afdab8e71ad38189ac104c397a2a5c98e 100644 (file)
@@ -32,6 +32,7 @@
 #include <babeltrace/ctf-ir/stream-class-internal.h>
 #include <babeltrace/ctf-writer/functor-internal.h>
 #include <babeltrace/ctf-ir/event-types-internal.h>
+#include <babeltrace/ctf-ir/utils.h>
 #include <babeltrace/compiler.h>
 
 #define DEFAULT_IDENTIFIER_SIZE 128
@@ -44,13 +45,6 @@ void bt_ctf_trace_destroy(struct bt_ctf_ref *ref);
 static
 int init_trace_packet_header(struct bt_ctf_trace *trace);
 
-static
-const char * const reserved_keywords_str[] = {"align", "callsite",
-       "const", "char", "clock", "double", "enum", "env", "event",
-       "floating_point", "float", "integer", "int", "long", "short", "signed",
-       "stream", "string", "struct", "trace", "typealias", "typedef",
-       "unsigned", "variant", "void" "_Bool", "_Complex", "_Imaginary"};
-
 static
 const unsigned int field_type_aliases_alignments[] = {
        [FIELD_TYPE_ALIAS_UINT5_T] = 1,
@@ -69,10 +63,6 @@ const unsigned int field_type_aliases_sizes[] = {
        [FIELD_TYPE_ALIAS_UINT64_T] = 64,
 };
 
-static GHashTable *reserved_keywords_set;
-static int init_done;
-static int global_data_refcount;
-
 struct bt_ctf_trace *bt_ctf_trace_create(void)
 {
        struct bt_ctf_trace *trace = NULL;
@@ -211,7 +201,7 @@ int bt_ctf_trace_add_environment_field(struct bt_ctf_trace *trace,
        char *escaped_value = NULL;
        int ret = 0;
 
-       if (!trace || !name || !value || validate_identifier(name)) {
+       if (!trace || !name || !value || bt_ctf_validate_identifier(name)) {
                ret = -1;
                goto error;
        }
@@ -523,40 +513,6 @@ void bt_ctf_trace_put(struct bt_ctf_trace *trace)
        bt_ctf_ref_put(&trace->ref_count, bt_ctf_trace_destroy);
 }
 
-BT_HIDDEN
-int validate_identifier(const char *input_string)
-{
-       int ret = 0;
-       char *string = NULL;
-       char *save_ptr, *token;
-
-       if (!input_string || input_string[0] == '\0') {
-               ret = -1;
-               goto end;
-       }
-
-       string = strdup(input_string);
-       if (!string) {
-               ret = -1;
-               goto end;
-       }
-
-       token = strtok_r(string, " ", &save_ptr);
-       while (token) {
-               if (g_hash_table_lookup_extended(reserved_keywords_set,
-                       GINT_TO_POINTER(g_quark_from_string(token)),
-                       NULL, NULL)) {
-                       ret = -1;
-                       goto end;
-               }
-
-               token = strtok_r(NULL, " ", &save_ptr);
-       }
-end:
-       free(string);
-       return ret;
-}
-
 BT_HIDDEN
 struct bt_ctf_field_type *get_field_type(enum field_type_alias alias)
 {
@@ -641,34 +597,3 @@ void environment_variable_destroy(struct environment_variable *var)
        g_string_free(var->value, TRUE);
        g_free(var);
 }
-
-static __attribute__((constructor))
-void trace_init(void)
-{
-       size_t i;
-       const size_t reserved_keywords_count =
-               sizeof(reserved_keywords_str) / sizeof(char *);
-
-       global_data_refcount++;
-       if (init_done) {
-               return;
-       }
-
-       reserved_keywords_set = g_hash_table_new(g_direct_hash, g_direct_equal);
-       for (i = 0; i < reserved_keywords_count; i++) {
-               gpointer quark = GINT_TO_POINTER(g_quark_from_string(
-                       reserved_keywords_str[i]));
-
-               g_hash_table_insert(reserved_keywords_set, quark, quark);
-       }
-
-       init_done = 1;
-}
-
-static __attribute__((destructor))
-void trace_finalize(void)
-{
-       if (--global_data_refcount == 0) {
-               g_hash_table_destroy(reserved_keywords_set);
-       }
-}
diff --git a/formats/ctf/ir/utils.c b/formats/ctf/ir/utils.c
new file mode 100644 (file)
index 0000000..318b12d
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * utils.c
+ *
+ * Babeltrace CTF IR - Utilities
+ *
+ * Copyright 2015 Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ *
+ * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include <glib.h>
+
+static
+const char * const reserved_keywords_str[] = {"align", "callsite",
+       "const", "char", "clock", "double", "enum", "env", "event",
+       "floating_point", "float", "integer", "int", "long", "short", "signed",
+       "stream", "string", "struct", "trace", "typealias", "typedef",
+       "unsigned", "variant", "void" "_Bool", "_Complex", "_Imaginary"};
+
+static GHashTable *reserved_keywords_set;
+static int init_done;
+static int global_data_refcount;
+
+static __attribute__((constructor))
+void trace_init(void)
+{
+       size_t i;
+       const size_t reserved_keywords_count =
+               sizeof(reserved_keywords_str) / sizeof(char *);
+
+       global_data_refcount++;
+       if (init_done) {
+               return;
+       }
+
+       reserved_keywords_set = g_hash_table_new(g_direct_hash, g_direct_equal);
+       for (i = 0; i < reserved_keywords_count; i++) {
+               gpointer quark = GINT_TO_POINTER(g_quark_from_string(
+                       reserved_keywords_str[i]));
+
+               g_hash_table_insert(reserved_keywords_set, quark, quark);
+       }
+
+       init_done = 1;
+}
+
+static __attribute__((destructor))
+void trace_finalize(void)
+{
+       if (--global_data_refcount == 0) {
+               g_hash_table_destroy(reserved_keywords_set);
+       }
+}
+
+int bt_ctf_validate_identifier(const char *input_string)
+{
+       int ret = 0;
+       char *string = NULL;
+       char *save_ptr, *token;
+
+       if (!input_string || input_string[0] == '\0') {
+               ret = -1;
+               goto end;
+       }
+
+       string = strdup(input_string);
+       if (!string) {
+               ret = -1;
+               goto end;
+       }
+
+       token = strtok_r(string, " ", &save_ptr);
+       while (token) {
+               if (g_hash_table_lookup_extended(reserved_keywords_set,
+                       GINT_TO_POINTER(g_quark_from_string(token)),
+                       NULL, NULL)) {
+                       ret = -1;
+                       goto end;
+               }
+
+               token = strtok_r(NULL, " ", &save_ptr);
+       }
+end:
+       free(string);
+       return ret;
+}
index 3f7f098750d81a1b6e8d6a81136d0e478e550e5d..9f106c967096911682517f177d90b2b2c632aaf4 100644 (file)
@@ -28,7 +28,8 @@ babeltracectfirinclude_HEADERS = \
        babeltrace/ctf-ir/event.h \
        babeltrace/ctf-ir/stream.h \
        babeltrace/ctf-ir/stream-class.h \
-       babeltrace/ctf-ir/trace.h
+       babeltrace/ctf-ir/trace.h \
+       babeltrace/ctf-ir/utils.h
 
 noinst_HEADERS = \
        babeltrace/align.h \
index dc0b7069e196f39457049ac66031eea703f411dd..125b554b49b90f4d23a62f50b61fa91a5fca8aa3 100644 (file)
@@ -69,10 +69,6 @@ struct metadata_context {
        unsigned int current_indentation_level;
 };
 
-/* Checks that the string does not contain a reserved keyword */
-BT_HIDDEN
-int validate_identifier(const char *string);
-
 BT_HIDDEN
 const char *get_byte_order_string(int byte_order);
 
diff --git a/include/babeltrace/ctf-ir/utils.h b/include/babeltrace/ctf-ir/utils.h
new file mode 100644 (file)
index 0000000..d661ed8
--- /dev/null
@@ -0,0 +1,56 @@
+#ifndef BABELTRACE_CTF_IR_UTILS_H
+#define BABELTRACE_CTF_IR_UTILS_H
+
+/*
+ * BabelTrace - CTF IR: Utilities
+ *
+ * Copyright 2015 Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ *
+ * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * The Common Trace Format (CTF) Specification is available at
+ * http://www.efficios.com/ctf
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * bt_ctf_validate_identifier: validate an identifier against the CTF spec.
+ *
+ * Validate that an identifier meets the CTF specification's restrictions on
+ * identifiers. An identifier will be rejected if it is a keyword defined
+ * in the CTF specification or if it does not meet any other requirement imposed
+ * on identifiers.
+ *
+ * Note that this will not check whether or not the identifier clashes with
+ * identifiers used in a given trace.
+ *
+ * Returns 0 if the identifier is valid, a negative value on error.
+ */
+extern int bt_ctf_validate_identifier(const char *identifier);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BABELTRACE_CTF_IR_UTILS_H */
This page took 0.034535 seconds and 4 git commands to generate.