*
* LTTng filter XML pretty printer visitor
*
- * Copyright 2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * Copyright 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
*
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License, version 2.1 only,
- * as published by the Free Software Foundation.
+ * SPDX-License-Identifier: LGPL-2.1-only
*
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this library; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
#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
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;
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:
case AST_OP_MINUS:
fprintf(stream, "\"-\"");
break;
- case AST_OP_RSHIFT:
+ case AST_OP_BIT_RSHIFT:
fprintf(stream, "\">>\"");
break;
- case AST_OP_LSHIFT:
+ case AST_OP_BIT_LSHIFT:
fprintf(stream, "\"<<\"");
break;
case AST_OP_AND:
case AST_OP_OR:
fprintf(stream, "\"||\"");
break;
- case AST_OP_BIN_AND:
+ case AST_OP_BIT_AND:
fprintf(stream, "\"&\"");
break;
- case AST_OP_BIN_OR:
+ case AST_OP_BIT_OR:
fprintf(stream, "\"|\"");
break;
- case AST_OP_BIN_XOR:
+ case AST_OP_BIT_XOR:
fprintf(stream, "\"^\"");
break;
case AST_UNARY_NOT:
fprintf(stream, "\"!\"");
break;
+ case AST_UNARY_BIT_NOT:
+ fprintf(stream, "\"~\"");
+ break;
}
fprintf(stream, ">\n");
ret = recursive_visit_print(node->u.unary_op.child,
return 0;
}
-__attribute__((visibility("hidden")))
+LTTNG_HIDDEN
int filter_visitor_print_xml(struct filter_parser_ctx *ctx, FILE *stream,
int indent)
{