Print other fields
[babeltrace.git] / plugins / ctf / common / metadata / visitor-generate-ir.c
index ec406bab4573dda7eb1649487eb4c7dde8f8cd68..2e175e75d7d967cb2ef66cdbef69380bcc4d43e7 100644 (file)
@@ -120,6 +120,25 @@ enum {
        _EVENT_FIELDS_SET =             _BV(6),
 };
 
+enum loglevel {
+        LOGLEVEL_EMERG                  = 0,
+        LOGLEVEL_ALERT                  = 1,
+        LOGLEVEL_CRIT                   = 2,
+        LOGLEVEL_ERR                    = 3,
+        LOGLEVEL_WARNING                = 4,
+        LOGLEVEL_NOTICE                 = 5,
+        LOGLEVEL_INFO                   = 6,
+        LOGLEVEL_DEBUG_SYSTEM           = 7,
+        LOGLEVEL_DEBUG_PROGRAM          = 8,
+        LOGLEVEL_DEBUG_PROCESS          = 9,
+        LOGLEVEL_DEBUG_MODULE           = 10,
+        LOGLEVEL_DEBUG_UNIT             = 11,
+        LOGLEVEL_DEBUG_FUNCTION         = 12,
+        LOGLEVEL_DEBUG_LINE             = 13,
+        LOGLEVEL_DEBUG                  = 14,
+       _NR_LOGLEVELS                   = 15,
+};
+
 /* Prefixes of type aliases */
 #define _PREFIX_ALIAS                  'a'
 #define _PREFIX_ENUM                   'e'
@@ -210,6 +229,37 @@ struct ctx {
        GHashTable *stream_classes;
 };
 
+static
+const char *loglevel_str [] = {
+       [ LOGLEVEL_EMERG ] = "TRACE_EMERG",
+       [ LOGLEVEL_ALERT ] = "TRACE_ALERT",
+       [ LOGLEVEL_CRIT ] = "TRACE_CRIT",
+       [ LOGLEVEL_ERR ] = "TRACE_ERR",
+       [ LOGLEVEL_WARNING ] = "TRACE_WARNING",
+       [ LOGLEVEL_NOTICE ] = "TRACE_NOTICE",
+       [ LOGLEVEL_INFO ] = "TRACE_INFO",
+       [ LOGLEVEL_DEBUG_SYSTEM ] = "TRACE_DEBUG_SYSTEM",
+       [ LOGLEVEL_DEBUG_PROGRAM ] = "TRACE_DEBUG_PROGRAM",
+       [ LOGLEVEL_DEBUG_PROCESS ] = "TRACE_DEBUG_PROCESS",
+       [ LOGLEVEL_DEBUG_MODULE ] = "TRACE_DEBUG_MODULE",
+       [ LOGLEVEL_DEBUG_UNIT ] = "TRACE_DEBUG_UNIT",
+       [ LOGLEVEL_DEBUG_FUNCTION ] = "TRACE_DEBUG_FUNCTION",
+       [ LOGLEVEL_DEBUG_LINE ] = "TRACE_DEBUG_LINE",
+       [ LOGLEVEL_DEBUG ] = "TRACE_DEBUG",
+};
+
+static
+const char *print_loglevel(int64_t value)
+{
+       if (value < 0) {
+               return NULL;
+       }
+       if (value >= _NR_LOGLEVELS) {
+               return "<<UNKNOWN>>";
+       }
+       return loglevel_str[value];
+}
+
 /**
  * Creates a new declaration scope.
  *
@@ -3047,7 +3097,9 @@ int visit_event_decl_entry(struct ctx *ctx, struct ctf_node *node,
 
                        _SET(set, _EVENT_FIELDS_SET);
                } else if (!strcmp(left, "loglevel")) {
-                       uint64_t loglevel;
+                       uint64_t loglevel_value;
+                       const char *loglevel_str;
+                       struct bt_value *value_obj, *str_obj;
 
                        if (_IS_SET(set, _EVENT_LOGLEVEL_SET)) {
                                _PERROR_DUP_ATTR("loglevel",
@@ -3057,15 +3109,38 @@ int visit_event_decl_entry(struct ctx *ctx, struct ctf_node *node,
                        }
 
                        ret = get_unary_unsigned(&node->u.ctf_expression.right,
-                               &loglevel);
+                               &loglevel_value);
                        if (ret) {
                                _PERROR("%s", "unexpected unary expression for event declaration's \"loglevel\" attribute");
                                ret = -EINVAL;
                                goto error;
                        }
-
-                       // TODO: FIXME: set log level here
-
+                       value_obj = bt_value_integer_create_init(loglevel_value);
+                       if (!value_obj) {
+                               _PERROR("%s", "cannot allocate memory for loglevel value object");
+                               ret = -ENOMEM;
+                               goto error;
+                       }
+                       if (bt_ctf_event_class_set_attribute(event_class,
+                               "loglevel", value_obj) != BT_VALUE_STATUS_OK) {
+                               _PERROR("%s", "cannot set loglevel value");
+                               ret = -EINVAL;
+                               bt_put(value_obj);
+                               goto error;
+                       }
+                       loglevel_str = print_loglevel(loglevel_value);
+                       if (loglevel_str) {
+                               str_obj = bt_value_string_create_init(loglevel_str);
+                               if (bt_ctf_event_class_set_attribute(event_class,
+                                               "loglevel_string", str_obj) != BT_VALUE_STATUS_OK) {
+                                       _PERROR("%s", "cannot set loglevel string");
+                                       ret = -EINVAL;
+                                       bt_put(str_obj);
+                                       goto error;
+                               }
+                               bt_put(str_obj);
+                       }
+                       bt_put(value_obj);
                        _SET(set, _EVENT_LOGLEVEL_SET);
                } else if (!strcmp(left, "model.emf.uri")) {
                        char *right;
@@ -3163,43 +3238,21 @@ int reset_event_decl_types(struct ctx *ctx,
        struct bt_ctf_event_class *event_class)
 {
        int ret = 0;
-       _BT_CTF_FIELD_TYPE_INIT(decl);
 
-       /* Event context */
-       decl = bt_ctf_field_type_structure_create();
-       if (!decl) {
-               _PERROR("%s", "cannot create initial, empty event context structure");
-               ret = -ENOMEM;
-               goto error;
-       }
-
-       ret = bt_ctf_event_class_set_context_type(event_class, decl);
-       BT_PUT(decl);
+       /* Context type. */
+       ret = bt_ctf_event_class_set_context_type(event_class, NULL);
        if (ret) {
-               _PERROR("%s", "cannot set initial, empty event context structure");
-               goto error;
-       }
-
-       /* Event payload */
-       decl = bt_ctf_field_type_structure_create();
-       if (!decl) {
-               _PERROR("%s", "cannot create initial, empty event payload structure");
-               ret = -ENOMEM;
-               goto error;
+               _PERROR("%s", "cannot set initial NULL event context");
+               goto end;
        }
 
-       ret = bt_ctf_event_class_set_payload_type(event_class, decl);
-       BT_PUT(decl);
+       /* Event payload. */
+       ret = bt_ctf_event_class_set_payload_type(event_class, NULL);
        if (ret) {
-               _PERROR("%s", "cannot set initial, empty event payload structure");
-               goto error;
+               _PERROR("%s", "cannot set initial NULL event payload");
+               goto end;
        }
-
-       return 0;
-
-error:
-       BT_PUT(decl);
-
+end:
        return ret;
 }
 
@@ -3208,58 +3261,28 @@ int reset_stream_decl_types(struct ctx *ctx,
        struct bt_ctf_stream_class *stream_class)
 {
        int ret = 0;
-       _BT_CTF_FIELD_TYPE_INIT(decl);
 
-       /* Packet context */
-       decl = bt_ctf_field_type_structure_create();
-       if (!decl) {
-               _PERROR("%s", "cannot create initial, empty packet context structure");
-               ret = -ENOMEM;
-               goto error;
-       }
-
-       ret = bt_ctf_stream_class_set_packet_context_type(stream_class, decl);
-       BT_PUT(decl);
+       /* Packet context. */
+       ret = bt_ctf_stream_class_set_packet_context_type(stream_class, NULL);
        if (ret) {
-               _PERROR("%s", "cannot set initial, empty packet context structure");
-               goto error;
-       }
-
-       /* Event header */
-       decl = bt_ctf_field_type_structure_create();
-       if (!decl) {
-               _PERROR("%s", "cannot create initial, empty event header structure");
-               ret = -ENOMEM;
-               goto error;
+               _PERROR("%s", "cannot set initial empty packet context");
+               goto end;
        }
 
-       ret = bt_ctf_stream_class_set_event_header_type(stream_class, decl);
-       BT_PUT(decl);
+       /* Event header. */
+       ret = bt_ctf_stream_class_set_event_header_type(stream_class, NULL);
        if (ret) {
-               _PERROR("%s", "cannot set initial, empty event header structure");
-               goto error;
-       }
-
-       /* Event context */
-       decl = bt_ctf_field_type_structure_create();
-       if (!decl) {
-               _PERROR("%s", "cannot create initial, empty stream event context structure");
-               ret = -ENOMEM;
-               goto error;
+               _PERROR("%s", "cannot set initial empty event header");
+               goto end;
        }
 
-       ret = bt_ctf_stream_class_set_event_context_type(stream_class, decl);
-       BT_PUT(decl);
+       /* Event context. */
+       ret = bt_ctf_stream_class_set_event_context_type(stream_class, NULL);
        if (ret) {
-               _PERROR("%s", "cannot set initial, empty stream event context structure");
-               goto error;
+               _PERROR("%s", "cannot set initial empty stream event context");
+               goto end;
        }
-
-       return 0;
-
-error:
-       BT_PUT(decl);
-
+end:
        return ret;
 }
 
@@ -3276,8 +3299,8 @@ struct bt_ctf_stream_class *create_reset_stream_class(struct ctx *ctx)
        }
 
        /*
-        * Set packet context, event header, and event context to empty
-        * structures to override the default ones.
+        * Set packet context, event header, and event context to NULL to
+        * override the default ones.
         */
        ret = reset_stream_decl_types(ctx, stream_class);
        if (ret) {
@@ -3322,8 +3345,7 @@ int visit_event_decl(struct ctx *ctx, struct ctf_node *node)
        event_class = bt_ctf_event_class_create(event_name);
 
        /*
-        * Set context and fields to empty structures to override the
-        * default ones.
+        * Unset context and fields to override the default ones.
         */
        ret = reset_event_decl_types(ctx, event_class);
        if (ret) {
@@ -4489,7 +4511,6 @@ int ctf_visitor_generate_ir(FILE *efd, struct ctf_node *node,
 {
        int ret = 0;
        struct ctx *ctx = NULL;
-       _BT_CTF_FIELD_TYPE_INIT(packet_header_decl);
 
        printf_verbose("CTF visitor: AST -> CTF IR...\n");
 
@@ -4500,19 +4521,8 @@ int ctf_visitor_generate_ir(FILE *efd, struct ctf_node *node,
                goto error;
        }
 
-       /* Set packet header to an empty struct tu override the default one */
-       packet_header_decl = bt_ctf_field_type_structure_create();
-
-       if (!packet_header_decl) {
-               _FPERROR(efd,
-                       "%s",
-                       "cannot create initial, empty packet header structure");
-               ret = -ENOMEM;
-               goto error;
-       }
-
-       ret = bt_ctf_trace_set_packet_header_type(*trace, packet_header_decl);
-       BT_PUT(packet_header_decl);
+       /* Set packet header to NULL to override the default one */
+       ret = bt_ctf_trace_set_packet_header_type(*trace, NULL);
        if (ret) {
                _FPERROR(efd,
                        "%s",
@@ -4654,7 +4664,6 @@ int ctf_visitor_generate_ir(FILE *efd, struct ctf_node *node,
        return ret;
 
 error:
-       BT_PUT(packet_header_decl);
        ctx_destroy(ctx);
        BT_PUT(*trace);
 
This page took 0.027401 seconds and 4 git commands to generate.