--- /dev/null
+/*
+ * 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;
+}