src/plugins/ctf/common: restructure subtree
[babeltrace.git] / src / plugins / ctf / common / src / metadata / tsdl / ctf-meta-update-meanings.cpp
diff --git a/src/plugins/ctf/common/src/metadata/tsdl/ctf-meta-update-meanings.cpp b/src/plugins/ctf/common/src/metadata/tsdl/ctf-meta-update-meanings.cpp
new file mode 100644 (file)
index 0000000..23c6574
--- /dev/null
@@ -0,0 +1,204 @@
+/*
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright 2018 Philippe Proulx <pproulx@efficios.com>
+ */
+
+#include <stdint.h>
+#include <string.h>
+
+#include "ctf-meta-visitors.hpp"
+
+static int set_int_field_class_meaning_by_name(struct ctf_field_class *fc, const char *field_name,
+                                               const char *id_name,
+                                               enum ctf_field_class_meaning meaning)
+{
+    int ret = 0;
+    uint64_t i;
+
+    if (!fc) {
+        goto end;
+    }
+
+    switch (fc->type) {
+    case CTF_FIELD_CLASS_TYPE_INT:
+    case CTF_FIELD_CLASS_TYPE_ENUM:
+    {
+        struct ctf_field_class_int *int_fc = ctf_field_class_as_int(fc);
+
+        if (field_name && strcmp(field_name, id_name) == 0) {
+            int_fc->meaning = meaning;
+        }
+
+        break;
+    }
+    case CTF_FIELD_CLASS_TYPE_STRUCT:
+    {
+        struct ctf_field_class_struct *struct_fc = ctf_field_class_as_struct(fc);
+
+        for (i = 0; i < struct_fc->members->len; i++) {
+            struct ctf_named_field_class *named_fc =
+                ctf_field_class_struct_borrow_member_by_index(struct_fc, i);
+
+            ret = set_int_field_class_meaning_by_name(named_fc->fc, named_fc->name->str, id_name,
+                                                      meaning);
+            if (ret) {
+                goto end;
+            }
+        }
+
+        break;
+    }
+    case CTF_FIELD_CLASS_TYPE_VARIANT:
+    {
+        struct ctf_field_class_variant *var_fc = ctf_field_class_as_variant(fc);
+
+        for (i = 0; i < var_fc->options->len; i++) {
+            struct ctf_named_field_class *named_fc =
+                ctf_field_class_variant_borrow_option_by_index(var_fc, i);
+
+            ret = set_int_field_class_meaning_by_name(named_fc->fc, NULL, id_name, meaning);
+            if (ret) {
+                goto end;
+            }
+        }
+
+        break;
+    }
+    case CTF_FIELD_CLASS_TYPE_ARRAY:
+    case CTF_FIELD_CLASS_TYPE_SEQUENCE:
+    {
+        struct ctf_field_class_array_base *array_fc = ctf_field_class_as_array_base(fc);
+
+        ret = set_int_field_class_meaning_by_name(array_fc->elem_fc, NULL, id_name, meaning);
+        if (ret) {
+            goto end;
+        }
+
+        break;
+    }
+    default:
+        break;
+    }
+
+end:
+    return ret;
+}
+
+static int update_stream_class_meanings(struct ctf_stream_class *sc)
+{
+    int ret = 0;
+    struct ctf_field_class_int *int_fc;
+    uint64_t i;
+
+    if (!sc->is_translated) {
+        if (sc->packet_context_fc) {
+            int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
+                ctf_field_class_as_struct(sc->packet_context_fc), "timestamp_begin");
+            if (int_fc) {
+                int_fc->meaning = CTF_FIELD_CLASS_MEANING_PACKET_BEGINNING_TIME;
+            }
+
+            int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
+                ctf_field_class_as_struct(sc->packet_context_fc), "timestamp_end");
+            if (int_fc) {
+                int_fc->meaning = CTF_FIELD_CLASS_MEANING_PACKET_END_TIME;
+
+                /*
+                 * Remove mapped clock class to avoid updating
+                 * the clock immediately when decoding.
+                 */
+                int_fc->mapped_clock_class = NULL;
+            }
+
+            int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
+                ctf_field_class_as_struct(sc->packet_context_fc), "events_discarded");
+            if (int_fc) {
+                int_fc->meaning = CTF_FIELD_CLASS_MEANING_DISC_EV_REC_COUNTER_SNAPSHOT;
+            }
+
+            int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
+                ctf_field_class_as_struct(sc->packet_context_fc), "packet_seq_num");
+            if (int_fc) {
+                int_fc->meaning = CTF_FIELD_CLASS_MEANING_PACKET_COUNTER_SNAPSHOT;
+            }
+
+            int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
+                ctf_field_class_as_struct(sc->packet_context_fc), "packet_size");
+            if (int_fc) {
+                int_fc->meaning = CTF_FIELD_CLASS_MEANING_EXP_PACKET_TOTAL_SIZE;
+            }
+
+            int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
+                ctf_field_class_as_struct(sc->packet_context_fc), "content_size");
+            if (int_fc) {
+                int_fc->meaning = CTF_FIELD_CLASS_MEANING_EXP_PACKET_CONTENT_SIZE;
+            }
+        }
+
+        if (sc->event_header_fc) {
+            ret = set_int_field_class_meaning_by_name(sc->event_header_fc, NULL, "id",
+                                                      CTF_FIELD_CLASS_MEANING_EVENT_CLASS_ID);
+            if (ret) {
+                goto end;
+            }
+        }
+    }
+
+    for (i = 0; i < sc->event_classes->len; i++) {
+        struct ctf_event_class *ec = (ctf_event_class *) sc->event_classes->pdata[i];
+
+        if (ec->is_translated) {
+            continue;
+        }
+    }
+
+end:
+    return ret;
+}
+
+int ctf_trace_class_update_meanings(struct ctf_trace_class *ctf_tc)
+{
+    int ret = 0;
+    struct ctf_field_class_int *int_fc;
+    struct ctf_named_field_class *named_fc;
+    uint64_t i;
+
+    if (!ctf_tc->is_translated && ctf_tc->packet_header_fc) {
+        int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
+            ctf_field_class_as_struct(ctf_tc->packet_header_fc), "magic");
+        if (int_fc) {
+            int_fc->meaning = CTF_FIELD_CLASS_MEANING_MAGIC;
+        }
+
+        int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
+            ctf_field_class_as_struct(ctf_tc->packet_header_fc), "stream_id");
+        if (int_fc) {
+            int_fc->meaning = CTF_FIELD_CLASS_MEANING_STREAM_CLASS_ID;
+        }
+
+        int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
+            ctf_field_class_as_struct(ctf_tc->packet_header_fc), "stream_instance_id");
+        if (int_fc) {
+            int_fc->meaning = CTF_FIELD_CLASS_MEANING_DATA_STREAM_ID;
+        }
+
+        named_fc = ctf_field_class_struct_borrow_member_by_name(
+            ctf_field_class_as_struct(ctf_tc->packet_header_fc), "uuid");
+        if (named_fc && named_fc->fc->type == CTF_FIELD_CLASS_TYPE_ARRAY) {
+            struct ctf_field_class_array *array_fc = ctf_field_class_as_array(named_fc->fc);
+
+            array_fc->meaning = CTF_FIELD_CLASS_MEANING_UUID;
+        }
+    }
+
+    for (i = 0; i < ctf_tc->stream_classes->len; i++) {
+        ret = update_stream_class_meanings((ctf_stream_class *) ctf_tc->stream_classes->pdata[i]);
+        if (ret) {
+            goto end;
+        }
+    }
+
+end:
+    return ret;
+}
This page took 0.025708 seconds and 4 git commands to generate.