Split CTF IR and CTF writer APIs and implementations
[babeltrace.git] / lib / ctf-ir / validation.c
index dd9a7afdb6e437a3081f2b7b3e55774657058c82..a17ef4af7a1de4b9bc53cb06b447fd13ff0c38a2 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Babeltrace - CTF IR: Validation of trace, stream class, and event class
  *
- * Copyright 2016 Philippe Proulx <pproulx@efficios.com>
+ * Copyright 2016-2018 Philippe Proulx <pproulx@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
 #define BT_LOG_TAG "VALIDATION"
 #include <babeltrace/lib-logging-internal.h>
 
+#include <babeltrace/assert-pre-internal.h>
 #include <babeltrace/ctf-ir/validation-internal.h>
 #include <babeltrace/ctf-ir/resolve-internal.h>
 #include <babeltrace/ctf-ir/trace-internal.h>
 #include <babeltrace/ctf-ir/stream-class-internal.h>
 #include <babeltrace/ctf-ir/field-types-internal.h>
 #include <babeltrace/ctf-ir/event-class-internal.h>
+#include <babeltrace/ctf-ir/field-types-internal.h>
 #include <babeltrace/values.h>
 #include <babeltrace/babeltrace-internal.h>
 #include <babeltrace/ref.h>
  */
 static
 int validate_event_class_types(struct bt_value *environment,
-               struct bt_field_type *packet_header_type,
-               struct bt_field_type *packet_context_type,
-               struct bt_field_type *event_header_type,
-               struct bt_field_type *stream_event_ctx_type,
-               struct bt_field_type *event_context_type,
-               struct bt_field_type *event_payload_type)
+               struct bt_field_type_common *packet_header_type,
+               struct bt_field_type_common *packet_context_type,
+               struct bt_field_type_common *event_header_type,
+               struct bt_field_type_common *stream_event_ctx_type,
+               struct bt_field_type_common *event_context_type,
+               struct bt_field_type_common *event_payload_type)
 {
        int ret = 0;
 
@@ -80,7 +82,7 @@ int validate_event_class_types(struct bt_value *environment,
 
        /* Validate field types individually */
        if (event_context_type) {
-               ret = bt_field_type_validate(event_context_type);
+               ret = bt_field_type_common_validate(event_context_type);
                if (ret) {
                        BT_LOGW("Invalid event class's context field type: "
                                "ret=%d", ret);
@@ -89,7 +91,7 @@ int validate_event_class_types(struct bt_value *environment,
        }
 
        if (event_payload_type) {
-               ret = bt_field_type_validate(event_payload_type);
+               ret = bt_field_type_common_validate(event_payload_type);
                if (ret) {
                        BT_LOGW("Invalid event class's payload field type: "
                                "ret=%d", ret);
@@ -111,10 +113,10 @@ end:
  */
 static
 int validate_stream_class_types(struct bt_value *environment,
-               struct bt_field_type *packet_header_type,
-               struct bt_field_type *packet_context_type,
-               struct bt_field_type *event_header_type,
-               struct bt_field_type *stream_event_ctx_type)
+               struct bt_field_type_common *packet_header_type,
+               struct bt_field_type_common *packet_context_type,
+               struct bt_field_type_common *event_header_type,
+               struct bt_field_type_common *stream_event_ctx_type)
 {
        int ret = 0;
 
@@ -141,7 +143,7 @@ int validate_stream_class_types(struct bt_value *environment,
 
        /* Validate field types individually */
        if (packet_context_type) {
-               ret = bt_field_type_validate(packet_context_type);
+               ret = bt_field_type_common_validate(packet_context_type);
                if (ret) {
                        BT_LOGW("Invalid stream class's packet context field type: "
                                "ret=%d", ret);
@@ -150,7 +152,7 @@ int validate_stream_class_types(struct bt_value *environment,
        }
 
        if (event_header_type) {
-               ret = bt_field_type_validate(event_header_type);
+               ret = bt_field_type_common_validate(event_header_type);
                if (ret) {
                        BT_LOGW("Invalid stream class's event header field type: "
                                "ret=%d", ret);
@@ -159,7 +161,7 @@ int validate_stream_class_types(struct bt_value *environment,
        }
 
        if (stream_event_ctx_type) {
-               ret = bt_field_type_validate(
+               ret = bt_field_type_common_validate(
                        stream_event_ctx_type);
                if (ret) {
                        BT_LOGW("Invalid stream class's event context field type: "
@@ -179,7 +181,7 @@ end:
  */
 static
 int validate_trace_types(struct bt_value *environment,
-               struct bt_field_type *packet_header_type)
+               struct bt_field_type_common *packet_header_type)
 {
        int ret = 0;
 
@@ -198,7 +200,7 @@ int validate_trace_types(struct bt_value *environment,
 
        /* Validate field types individually */
        if (packet_header_type) {
-               ret = bt_field_type_validate(packet_header_type);
+               ret = bt_field_type_common_validate(packet_header_type);
                if (ret) {
                        BT_LOGW("Invalid trace's packet header field type: "
                                "ret=%d", ret);
@@ -217,10 +219,10 @@ end:
  * `field_type` is owned by the caller.
  */
 static
-int field_type_contains_sequence_or_variant_ft(struct bt_field_type *type)
+int field_type_contains_sequence_or_variant_ft(struct bt_field_type_common *type)
 {
        int ret = 0;
-       enum bt_field_type_id type_id = bt_field_type_get_type_id(type);
+       enum bt_field_type_id type_id = bt_field_type_common_get_type_id(type);
 
        switch (type_id) {
        case BT_FIELD_TYPE_ID_SEQUENCE:
@@ -231,7 +233,7 @@ int field_type_contains_sequence_or_variant_ft(struct bt_field_type *type)
        case BT_FIELD_TYPE_ID_STRUCT:
        {
                int i;
-               int field_count = bt_field_type_get_field_count(type);
+               int field_count = bt_field_type_common_get_field_count(type);
 
                if (field_count < 0) {
                        ret = -1;
@@ -239,8 +241,8 @@ int field_type_contains_sequence_or_variant_ft(struct bt_field_type *type)
                }
 
                for (i = 0; i < field_count; ++i) {
-                       struct bt_field_type *child_type =
-                               bt_field_type_get_field_at_index(type, i);
+                       struct bt_field_type_common *child_type =
+                               bt_field_type_common_get_field_at_index(type, i);
 
                        ret = field_type_contains_sequence_or_variant_ft(
                                child_type);
@@ -261,15 +263,16 @@ end:
 
 BT_HIDDEN
 int bt_validate_class_types(struct bt_value *environment,
-               struct bt_field_type *packet_header_type,
-               struct bt_field_type *packet_context_type,
-               struct bt_field_type *event_header_type,
-               struct bt_field_type *stream_event_ctx_type,
-               struct bt_field_type *event_context_type,
-               struct bt_field_type *event_payload_type,
+               struct bt_field_type_common *packet_header_type,
+               struct bt_field_type_common *packet_context_type,
+               struct bt_field_type_common *event_header_type,
+               struct bt_field_type_common *stream_event_ctx_type,
+               struct bt_field_type_common *event_context_type,
+               struct bt_field_type_common *event_payload_type,
                int trace_valid, int stream_class_valid, int event_class_valid,
                struct bt_validation_output *output,
-               enum bt_validation_flag validate_flags)
+               enum bt_validation_flag validate_flags,
+               bt_validation_flag_copy_field_type_func copy_field_type_func)
 {
        int ret = 0;
        int contains_seq_var;
@@ -315,7 +318,7 @@ int bt_validate_class_types(struct bt_value *environment,
 
        /* Validate trace */
        if ((validate_flags & BT_VALIDATION_FLAG_TRACE) && !trace_valid) {
-               struct bt_field_type *packet_header_type_copy = NULL;
+               struct bt_field_type_common *packet_header_type_copy = NULL;
 
                /* Create field type copies */
                if (packet_header_type) {
@@ -334,7 +337,7 @@ int bt_validate_class_types(struct bt_value *environment,
 
                        BT_LOGV_STR("Copying packet header field type because it contains at least one sequence or variant field type.");
                        packet_header_type_copy =
-                               bt_field_type_copy(packet_header_type);
+                               copy_field_type_func(packet_header_type);
                        if (!packet_header_type_copy) {
                                ret = -1;
                                BT_LOGE_STR("Cannot copy packet header field type.");
@@ -346,7 +349,7 @@ int bt_validate_class_types(struct bt_value *environment,
                         * caller, it cannot be modified any way since
                         * it will be resolved.
                         */
-                       bt_field_type_freeze(packet_header_type_copy);
+                       bt_field_type_common_freeze(packet_header_type_copy);
                }
 
 skip_packet_header_type_copy:
@@ -365,9 +368,9 @@ skip_packet_header_type_copy:
        /* Validate stream class */
        if ((validate_flags & BT_VALIDATION_FLAG_STREAM) &&
                        !stream_class_valid) {
-               struct bt_field_type *packet_context_type_copy = NULL;
-               struct bt_field_type *event_header_type_copy = NULL;
-               struct bt_field_type *stream_event_ctx_type_copy = NULL;
+               struct bt_field_type_common *packet_context_type_copy = NULL;
+               struct bt_field_type_common *event_header_type_copy = NULL;
+               struct bt_field_type_common *stream_event_ctx_type_copy = NULL;
 
                if (packet_context_type) {
                        contains_seq_var =
@@ -385,7 +388,7 @@ skip_packet_header_type_copy:
 
                        BT_LOGV_STR("Copying packet context field type because it contains at least one sequence or variant field type.");
                        packet_context_type_copy =
-                               bt_field_type_copy(packet_context_type);
+                               copy_field_type_func(packet_context_type);
                        if (!packet_context_type_copy) {
                                BT_LOGE_STR("Cannot copy packet context field type.");
                                goto sc_validation_error;
@@ -396,7 +399,7 @@ skip_packet_header_type_copy:
                         * caller, it cannot be modified any way since
                         * it will be resolved.
                         */
-                       bt_field_type_freeze(packet_context_type_copy);
+                       bt_field_type_common_freeze(packet_context_type_copy);
                }
 
 skip_packet_context_type_copy:
@@ -416,7 +419,7 @@ skip_packet_context_type_copy:
 
                        BT_LOGV_STR("Copying event header field type because it contains at least one sequence or variant field type.");
                        event_header_type_copy =
-                               bt_field_type_copy(event_header_type);
+                               copy_field_type_func(event_header_type);
                        if (!event_header_type_copy) {
                                BT_LOGE_STR("Cannot copy event header field type.");
                                goto sc_validation_error;
@@ -427,7 +430,7 @@ skip_packet_context_type_copy:
                         * caller, it cannot be modified any way since
                         * it will be resolved.
                         */
-                       bt_field_type_freeze(event_header_type_copy);
+                       bt_field_type_common_freeze(event_header_type_copy);
                }
 
 skip_event_header_type_copy:
@@ -448,7 +451,7 @@ skip_event_header_type_copy:
 
                        BT_LOGV_STR("Copying stream event context field type because it contains at least one sequence or variant field type.");
                        stream_event_ctx_type_copy =
-                               bt_field_type_copy(stream_event_ctx_type);
+                               copy_field_type_func(stream_event_ctx_type);
                        if (!stream_event_ctx_type_copy) {
                                BT_LOGE_STR("Cannot copy stream event context field type.");
                                goto sc_validation_error;
@@ -459,7 +462,7 @@ skip_event_header_type_copy:
                         * caller, it cannot be modified any way since
                         * it will be resolved.
                         */
-                       bt_field_type_freeze(stream_event_ctx_type_copy);
+                       bt_field_type_common_freeze(stream_event_ctx_type_copy);
                }
 
 skip_stream_event_ctx_type_copy:
@@ -491,8 +494,8 @@ sc_validation_done:
        /* Validate event class */
        if ((validate_flags & BT_VALIDATION_FLAG_EVENT) &&
                        !event_class_valid) {
-               struct bt_field_type *event_context_type_copy = NULL;
-               struct bt_field_type *event_payload_type_copy = NULL;
+               struct bt_field_type_common *event_context_type_copy = NULL;
+               struct bt_field_type_common *event_payload_type_copy = NULL;
 
                if (event_context_type) {
                        contains_seq_var =
@@ -510,7 +513,7 @@ sc_validation_done:
 
                        BT_LOGV_STR("Copying event context field type because it contains at least one sequence or variant field type.");
                        event_context_type_copy =
-                               bt_field_type_copy(event_context_type);
+                               copy_field_type_func(event_context_type);
                        if (!event_context_type_copy) {
                                BT_LOGE_STR("Cannot copy event context field type.");
                                goto ec_validation_error;
@@ -521,7 +524,7 @@ sc_validation_done:
                         * caller, it cannot be modified any way since
                         * it will be resolved.
                         */
-                       bt_field_type_freeze(event_context_type_copy);
+                       bt_field_type_common_freeze(event_context_type_copy);
                }
 
 skip_event_context_type_copy:
@@ -541,7 +544,7 @@ skip_event_context_type_copy:
 
                        BT_LOGV_STR("Copying event payload field type because it contains at least one sequence or variant field type.");
                        event_payload_type_copy =
-                               bt_field_type_copy(event_payload_type);
+                               copy_field_type_func(event_payload_type);
                        if (!event_payload_type_copy) {
                                BT_LOGE_STR("Cannot copy event payload field type.");
                                goto ec_validation_error;
@@ -552,7 +555,7 @@ skip_event_context_type_copy:
                         * caller, it cannot be modified any way since
                         * it will be resolved.
                         */
-                       bt_field_type_freeze(event_payload_type_copy);
+                       bt_field_type_common_freeze(event_payload_type_copy);
                }
 
 skip_event_payload_type_copy:
@@ -604,34 +607,35 @@ error:
 }
 
 BT_HIDDEN
-void bt_validation_replace_types(struct bt_trace *trace,
-               struct bt_stream_class *stream_class,
-               struct bt_event_class *event_class,
+void bt_validation_replace_types(struct bt_trace_common *trace,
+               struct bt_stream_class_common *stream_class,
+               struct bt_event_class_common *event_class,
                struct bt_validation_output *output,
                enum bt_validation_flag replace_flags)
 {
        if ((replace_flags & BT_VALIDATION_FLAG_TRACE) && trace) {
-               bt_field_type_freeze(trace->packet_header_type);
-               BT_MOVE(trace->packet_header_type, output->packet_header_type);
+               bt_field_type_common_freeze(trace->packet_header_field_type);
+               BT_MOVE(trace->packet_header_field_type,
+                       output->packet_header_type);
        }
 
        if ((replace_flags & BT_VALIDATION_FLAG_STREAM) && stream_class) {
-               bt_field_type_freeze(stream_class->packet_context_type);
-               bt_field_type_freeze(stream_class->event_header_type);
-               bt_field_type_freeze(stream_class->event_context_type);
-               BT_MOVE(stream_class->packet_context_type,
+               bt_field_type_common_freeze(stream_class->packet_context_field_type);
+               bt_field_type_common_freeze(stream_class->event_header_field_type);
+               bt_field_type_common_freeze(stream_class->event_context_field_type);
+               BT_MOVE(stream_class->packet_context_field_type,
                        output->packet_context_type);
-               BT_MOVE(stream_class->event_header_type,
+               BT_MOVE(stream_class->event_header_field_type,
                        output->event_header_type);
-               BT_MOVE(stream_class->event_context_type,
+               BT_MOVE(stream_class->event_context_field_type,
                        output->stream_event_ctx_type);
        }
 
        if ((replace_flags & BT_VALIDATION_FLAG_EVENT) && event_class) {
-               bt_field_type_freeze(event_class->context);
-               bt_field_type_freeze(event_class->fields);
-               BT_MOVE(event_class->context, output->event_context_type);
-               BT_MOVE(event_class->fields, output->event_payload_type);
+               bt_field_type_common_freeze(event_class->context_field_type);
+               bt_field_type_common_freeze(event_class->payload_field_type);
+               BT_MOVE(event_class->context_field_type, output->event_context_type);
+               BT_MOVE(event_class->payload_field_type, output->event_payload_type);
        }
 }
 
This page took 0.030819 seconds and 4 git commands to generate.