[syslog-ng] [PATCH] basicfuncs: Implement a few numeric template functions.

Gergely Nagy algernon at balabit.hu
Mon May 2 21:47:06 CEST 2011


From: Gergely Nagy <algernon at madhouse-project.org>

Implement addition, substraction, multiplication, division and modulus
template functions: $(+ N M), $(- N M), $(* N M), $(/ N M) and $(% N
M), respectively.

All of them take two numeric arguments, and log an error, if they
receive less or more, or in case the number cannot be fully parsed as
a number.

Signed-off-by: Gergely Nagy <algernon at madhouse-project.org>
---
 modules/basicfuncs/basic-funcs.c |  106 ++++++++++++++++++++++++++++++++++++-
 1 files changed, 103 insertions(+), 3 deletions(-)

diff --git a/modules/basicfuncs/basic-funcs.c b/modules/basicfuncs/basic-funcs.c
index a03e221..2be4584 100644
--- a/modules/basicfuncs/basic-funcs.c
+++ b/modules/basicfuncs/basic-funcs.c
@@ -23,7 +23,7 @@ tf_echo(LogMessage *msg, gint argc, GString *argv[], GString *result)
 TEMPLATE_FUNCTION_SIMPLE(tf_echo);
 
 static gboolean
-tf_substr_parse_int(const gchar *s, long *d)
+tf_parse_int(const gchar *s, long *d)
 {
   gchar *endptr;
   glong val;
@@ -42,6 +42,101 @@ tf_substr_parse_int(const gchar *s, long *d)
   return TRUE;
 }
 
+static gboolean
+tf_num_parse(gint argc, GString *argv[],
+	     const gchar *func_name, glong *n, glong *m)
+{
+  if (argc != 2)
+    {
+      msg_error("Template function requires two arguments.",
+		evt_tag_str("function", func_name), NULL);
+      return FALSE;
+    }
+
+  if (!tf_parse_int(argv[0]->str, n))
+    {
+      msg_error("Parsing failed, template function's first argument is not a number",
+		evt_tag_str("function", func_name),
+		evt_tag_str("arg1", argv[0]->str), NULL);
+      return FALSE;
+    }
+
+  if (!tf_parse_int(argv[1]->str, m))
+    {
+      msg_error("Parsing failed, template function's first argument is not a number",
+		evt_tag_str("function", func_name),
+		evt_tag_str("arg1", argv[1]->str), NULL);
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+static void
+tf_num_plus(LogMessage *msg, gint argc, GString *argv[], GString *result)
+{
+  glong n, m;
+
+  if (!tf_num_parse(argc, argv, "+", &n, &m))
+    return;
+
+  g_string_append_printf(result, "%li", n + m);
+}
+
+TEMPLATE_FUNCTION_SIMPLE(tf_num_plus);
+
+static void
+tf_num_minus(LogMessage *msg, gint argc, GString *argv[], GString *result)
+{
+  glong n, m;
+
+  if (!tf_num_parse(argc, argv, "-", &n, &m))
+    return;
+
+  g_string_append_printf(result, "%li", n - m);
+}
+
+TEMPLATE_FUNCTION_SIMPLE(tf_num_minus);
+
+static void
+tf_num_multi(LogMessage *msg, gint argc, GString *argv[], GString *result)
+{
+  glong n, m;
+
+  if (!tf_num_parse(argc, argv, "*", &n, &m))
+    return;
+
+  g_string_append_printf(result, "%li", n * m);
+}
+
+TEMPLATE_FUNCTION_SIMPLE(tf_num_multi);
+
+static void
+tf_num_div(LogMessage *msg, gint argc, GString *argv[], GString *result)
+{
+  glong n, m;
+
+  if (!tf_num_parse(argc, argv, "/", &n, &m))
+    return;
+
+  g_string_append_printf(result, "%li", (glong)(n / m));
+}
+
+TEMPLATE_FUNCTION_SIMPLE(tf_num_div);
+
+static void
+tf_num_mod(LogMessage *msg, gint argc, GString *argv[], GString *result)
+{
+  glong n, m;
+
+  if (!tf_num_parse(argc, argv, "%", &n, &m))
+    return;
+
+  g_string_append_printf(result, "%li", n % m);
+}
+
+TEMPLATE_FUNCTION_SIMPLE(tf_num_mod);
+
 static void
 tf_substr(LogMessage *msg, gint argc, GString *argv[], GString *result)
 {
@@ -64,14 +159,14 @@ tf_substr(LogMessage *msg, gint argc, GString *argv[], GString *result)
     return;
 
   /* get offset position from second argument */
-  if (!tf_substr_parse_int(argv[1]->str, &start)) {
+  if (!tf_parse_int(argv[1]->str, &start)) {
     msg_error("$(substr) parsing failed, start could not be parsed", evt_tag_str("start", argv[1]->str), NULL);
     return;
   }
 
   /* if we were called with >2 arguments, third was desired length */
   if (argc > 2) {
-    if (!tf_substr_parse_int(argv[2]->str, &len)) {
+    if (!tf_parse_int(argv[2]->str, &len)) {
       msg_error("$(substr) parsing failed, length could not be parsed", evt_tag_str("length", argv[2]->str), NULL);
       return;
     }
@@ -282,6 +377,11 @@ static Plugin basicfuncs_plugins[] =
   TEMPLATE_FUNCTION_PLUGIN(tf_grep, "grep"),
   TEMPLATE_FUNCTION_PLUGIN(tf_if, "if"),
   TEMPLATE_FUNCTION_PLUGIN(tf_substr, "substr"),
+  TEMPLATE_FUNCTION_PLUGIN(tf_num_plus, "+"),
+  TEMPLATE_FUNCTION_PLUGIN(tf_num_minus, "-"),
+  TEMPLATE_FUNCTION_PLUGIN(tf_num_multi, "*"),
+  TEMPLATE_FUNCTION_PLUGIN(tf_num_div, "/"),
+  TEMPLATE_FUNCTION_PLUGIN(tf_num_mod, "%"),
 };
 
 gboolean
-- 
1.7.2.5




More information about the syslog-ng mailing list