]> source.dussan.org Git - rspamd.git/commitdiff
Add flags to expressions processing and noopt flag.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 28 Mar 2015 23:00:11 +0000 (23:00 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 28 Mar 2015 23:00:11 +0000 (23:00 +0000)
src/libutil/expression.c
src/libutil/expression.h

index d9f1a12601aa7208f229594e30f59b9dd4694866..b2655b518471d32a67e9d7bc113c9e87d74fa51e 100644 (file)
@@ -806,7 +806,7 @@ rspamd_ast_do_op (struct rspamd_expression_elt *elt, gint val, gint acc)
 }
 
 static gint
-rspamd_ast_process_node (struct rspamd_expression *expr, GNode *node,
+rspamd_ast_process_node (struct rspamd_expression *expr, gint flags, GNode *node,
                gpointer data)
 {
        struct rspamd_expression_elt *elt, *celt, *parelt;
@@ -846,7 +846,7 @@ rspamd_ast_process_node (struct rspamd_expression *expr, GNode *node,
                        celt = cld->data;
 
                        /* Save limit if we've found it */
-                       val = rspamd_ast_process_node (expr, cld, data);
+                       val = rspamd_ast_process_node (expr, flags, cld, data);
 
                        if (acc == G_MININT) {
                                acc = val;
@@ -854,8 +854,10 @@ rspamd_ast_process_node (struct rspamd_expression *expr, GNode *node,
 
                        acc = rspamd_ast_do_op (elt, val, acc);
 
-                       if (rspamd_ast_node_done (elt, parelt, acc, lim)) {
-                               return acc;
+                       if (!(flags & RSPAMD_EXPRESSION_FLAG_NOOPT)) {
+                               if (rspamd_ast_node_done (elt, parelt, acc, lim)) {
+                                       return acc;
+                               }
                        }
                }
                break;
@@ -876,7 +878,8 @@ rspamd_ast_cleanup_traverse (GNode *n, gpointer d)
 }
 
 gint
-rspamd_process_expression (struct rspamd_expression *expr, gpointer data)
+rspamd_process_expression (struct rspamd_expression *expr, gint flags,
+               gpointer data)
 {
        gint ret = 0;
 
@@ -884,7 +887,7 @@ rspamd_process_expression (struct rspamd_expression *expr, gpointer data)
        /* Ensure that stack is empty at this point */
        g_assert (expr->expression_stack->len == 0);
 
-       ret = rspamd_ast_process_node (expr, expr->ast, data);
+       ret = rspamd_ast_process_node (expr, flags, expr->ast, data);
 
        /* Cleanup */
        g_node_traverse (expr->ast, G_IN_ORDER, G_TRAVERSE_ALL, -1,
index 924dbb45b4286dbfa5cc1c9939c323b3e553f05d..866542165f8a96fbb0062479e649c42866ef8310 100644 (file)
@@ -30,6 +30,8 @@
 
 #define RSPAMD_EXPRESSION_MAX_PRIORITY 1024
 
+#define RSPAMD_EXPRESSION_FLAG_NOOPT (1 << 0)
+
 typedef struct rspamd_expression_atom_s {
        /* Opaque userdata */
        gpointer data;
@@ -77,7 +79,8 @@ gboolean rspamd_parse_expression (const gchar *line, gsize len,
  * @param data opaque data pointer for all the atoms
  * @return the value of expression
  */
-gint rspamd_process_expression (struct rspamd_expression *expr, gpointer data);
+gint rspamd_process_expression (struct rspamd_expression *expr, gint flags,
+               gpointer data);
 
 /**
  * Shows string representation of an expression