}
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;
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;
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;
}
gint
-rspamd_process_expression (struct rspamd_expression *expr, gpointer data)
+rspamd_process_expression (struct rspamd_expression *expr, gint flags,
+ gpointer data)
{
gint ret = 0;
/* 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,
#define RSPAMD_EXPRESSION_MAX_PRIORITY 1024
+#define RSPAMD_EXPRESSION_FLAG_NOOPT (1 << 0)
+
typedef struct rspamd_expression_atom_s {
/* Opaque userdata */
gpointer data;
* @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