From 015e729112d0529c45d7ac82db13b00aec066968 Mon Sep 17 00:00:00 2001 From: shifter Date: Wed, 6 Dec 2023 14:32:39 +0100 Subject: [PATCH] wip --- lib/filterx/Makefile.am | 3 +++ lib/filterx/expr-function.c | 49 +++++++++++++++++++++++++++------- lib/filterx/expr-function.h | 21 +++++++++++++++ lib/filterx/filterx-grammar.ym | 20 +++++++++----- 4 files changed, 78 insertions(+), 15 deletions(-) create mode 100644 lib/filterx/expr-function.h diff --git a/lib/filterx/Makefile.am b/lib/filterx/Makefile.am index c2d8c9d095b..cab73ca35f6 100644 --- a/lib/filterx/Makefile.am +++ b/lib/filterx/Makefile.am @@ -27,6 +27,8 @@ filterxinclude_HEADERS = \ lib/filterx/filterx-config.h \ lib/filterx/expr-builtin.h \ lib/filterx/filterx-pipe.h + lib/filterx/filterx-pipe.h \ + lib/filterx/expr-function.h filterx_sources = \ @@ -56,6 +58,7 @@ filterx_sources = \ lib/filterx/filterx-config.c \ lib/filterx/filterx-pipe.c \ lib/filterx/expr-builtin.c \ + lib/filterx/expr-function.c \ lib/filterx/filterx-grammar.y BUILT_SOURCES += \ diff --git a/lib/filterx/expr-function.c b/lib/filterx/expr-function.c index 231dc46c92a..3c58502eb67 100644 --- a/lib/filterx/expr-function.c +++ b/lib/filterx/expr-function.c @@ -1,21 +1,39 @@ #include "filterx/expr-function.h" +#include "scratch-buffers.h" -typedef struct _FilterXFunction +static FilterXObject * +echo(FilterXObject *obj) { - FilterXExpr super; - gchar *function_name; - GList *argument_expressions; -} FilterXFunction; + GString *buf = scratch_buffers_alloc(); + LogMessageValueType t; + + if (!filterx_object_marshal(obj, buf, &t)) + goto exit; + msg_debug("FILTERX2", + evt_tag_str("value", buf->str), + evt_tag_str("type", log_msg_value_type_to_str(t))); + exit: + return NULL; +} static FilterXObject * _eval(FilterXExpr *s) { FilterXFunction *self = (FilterXFunction *) s; - // lookup self->function_name + // lookup self->function_name // TODO // eval arguments filterx_expr_eval(FilterXExpr *self) // call function implementation with Object list as argument, which returns a FilterXObject -exit: + + FilterXExpr *expr; + for (GList *l = self->argument_expressions; l; l = l->next) + { + expr = l->data; + break; + } + + // FilterXObject *res = + echo(filterx_expr_eval(expr)); return NULL; } @@ -23,8 +41,20 @@ static void _free(FilterXExpr *s) { FilterXFunction *self = (FilterXFunction *) s; - g_free(self->function_name); -// g_list_free_all(self->argument_expressions); + // g_free(self->function_name); + + // g_list_free_full(self->argument_expressions, (GDestroyNotify) filterx_expr_unref); + // filterx_expr_free_method(s); + filterx_function_free(self); +} + +void +filterx_function_free(FilterXFunction *s) +{ + g_free(s->function_name); + g_list_free_full(s->argument_expressions, (GDestroyNotify) filterx_expr_unref); + // s->super.free_fn(&(s->super)); + filterx_expr_free_method(s->super); } /* NOTE: takes the object reference */ @@ -37,5 +67,6 @@ filterx_function_new(const gchar *function_name, GList *arguments) self->super.eval = _eval; self->super.free_fn = _free; self->function_name = g_strdup(function_name); + self->argument_expressions = arguments; return &self->super; } diff --git a/lib/filterx/expr-function.h b/lib/filterx/expr-function.h new file mode 100644 index 00000000000..c6da801d37b --- /dev/null +++ b/lib/filterx/expr-function.h @@ -0,0 +1,21 @@ +#ifndef FILTERX_EXPR_FUNCTION_H_INCLUDED +#define FILTERX_EXPR_FUNCTION_H_INCLUDED + +#include "filterx/filterx-expr.h" +#include "filterx-object.h" + +typedef struct _FilterXFunction +{ + FilterXExpr super; + gchar *function_name; + GList *argument_expressions; +} FilterXFunction; + +// typedef *FilterXObject (*FilterXFunctionProto)(int, ...); +// typedef *FilterXObject (*FilterXFunctionProto)(GList *filterx_objects); +// typedef *FilterXObject (*FilterXFunctionProto)(GPointer[]); + +FilterXExpr *filterx_function_new(const gchar *function_name, GList *arguments); +void filterx_function_free(FilterXFunction *s); + +#endif diff --git a/lib/filterx/filterx-grammar.ym b/lib/filterx/filterx-grammar.ym index 4ae5e53dbbb..c49880f0b0e 100644 --- a/lib/filterx/filterx-grammar.ym +++ b/lib/filterx/filterx-grammar.ym @@ -45,6 +45,7 @@ #include "filterx/object-null.h" #include "filterx/object-string.h" #include "filterx/filterx-config.h" +#include "filterx/expr-function.h" /* legacy filters */ #include "filter/filter-netmask.h" @@ -86,7 +87,9 @@ construct_template_expr(LogTemplate *template) %type expr %type expr_value %type function_call -%type argument_list +%type function_add +%type argument +%type arguments %type literal %type literal_object %type builtin @@ -110,6 +113,7 @@ stmts stmt : expr ';' { $$ = $1; } + ; expr : expr_value { $$ = $1; } @@ -146,15 +150,19 @@ expr_value ; function_call - : LL_IDENTIFIER '(' argument_list ')' { $$ = NULL; /* filterx_function_new($1, $3); */ } + : LL_IDENTIFIER '(' arguments ')' { $$ = filterx_function_new($1, $3); } + ; + +arguments + : argument arguments { $$ = g_list_prepend($2, $1); } + | { $$ = NULL; } ; -argument_list - : expr ',' argument_list - | +argument + : expr ; -literal: literal_object { $$ = filterx_literal_new(filterx_config_freeze_object(configuration, $1)); } +literal: literal_object { $$ = filterx_literal_new(filterx_config_freeze_object(configuration, $1)); } literal_object : LL_NUMBER { $$ = filterx_integer_new($1); }