Implement support for brackets in filter expressions
[lttng-tools.git] / src / lib / lttng-ctl / filter / filter-visitor-xml.c
index 1d14f2eab40fbbdb564a51bae821346bec065635..c293ad15ef59617933dc9adb698d2937773d47b3 100644 (file)
@@ -29,6 +29,8 @@
 #include "filter-ast.h"
 #include "filter-parser.h"
 
+#include <common/macros.h>
+
 #define fprintf_dbg(fd, fmt, args...)  fprintf(fd, "%s: " fmt, __func__, ## args)
 
 static
@@ -47,6 +49,8 @@ static
 int recursive_visit_print_expression(struct filter_node *node,
                FILE *stream, int indent)
 {
+       struct filter_node *iter_node;
+
        if (!node) {
                fprintf(stderr, "[error] %s: NULL child\n", __func__);
                return -EINVAL;
@@ -71,37 +75,25 @@ int recursive_visit_print_expression(struct filter_node *node,
                fprintf(stream, "<float_constant value=\"%lg\"/>\n",
                        node->u.expression.u.float_constant);
                break;
-       case AST_EXP_IDENTIFIER:
+       case AST_EXP_IDENTIFIER:                /* fall-through */
+       case AST_EXP_GLOBAL_IDENTIFIER:
                print_tabs(stream, indent);
-               fprintf(stream, "<identifier value=\"%s\"/>\n",
+               fprintf(stream, "<%s value=\"%s\"/>\n",
+                       node->u.expression.type == AST_EXP_IDENTIFIER ?
+                               "identifier" : "global_identifier",
                        node->u.expression.u.identifier);
-               while (node->u.expression.next) {
+               iter_node = node->u.expression.next;
+               while (iter_node) {
                        print_tabs(stream, indent);
-                       fprintf(stream, "<link type=\"");
-                       switch (node->u.expression.pre_op) {
-                       case AST_LINK_UNKNOWN:
-                       default:
-                               fprintf(stderr, "[error] %s: unknown link\n", __func__);
+                       fprintf(stream, "<bracket>\n");
+                       if (recursive_visit_print_expression(iter_node,
+                                       stream, indent + 1)) {
                                return -EINVAL;
-                       case AST_LINK_DOT:
-                               fprintf(stream, ".");
-                               break;
-                       case AST_LINK_RARROW:
-                               fprintf(stream, "->");
-                               break;
                        }
-                       fprintf(stream, "\"/>\n");
-
-                       node = node->u.expression.next;
-                       if (node->type != NODE_EXPRESSION ||
-                               node->u.expression.type != AST_EXP_IDENTIFIER) {
-                               fprintf(stderr, "[error] %s: expecting identifier before link\n", __func__);
-                               return -EINVAL;
-                       }
-
                        print_tabs(stream, indent);
-                       fprintf(stream, "<identifier value=\"%s\"/>\n",
-                               node->u.expression.u.identifier);
+                       fprintf(stream, "</bracket>\n");
+                       iter_node = iter_node->u.expression.next;
+
                }
                break;
        case AST_EXP_NESTED:
@@ -249,7 +241,7 @@ int recursive_visit_print(struct filter_node *node, FILE *stream, int indent)
        return 0;
 }
 
-__attribute__((visibility("hidden")))
+LTTNG_HIDDEN
 int filter_visitor_print_xml(struct filter_parser_ctx *ctx, FILE *stream,
                        int indent)
 {
This page took 0.024154 seconds and 4 git commands to generate.