From 6d7d4b3bf789c7b314ae6335c20f00d991a400df Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 21 Mar 2015 21:48:55 +0000 Subject: [PATCH] Update composites logic. --- src/libmime/filter.c | 27 +++++++++++++++++++++++++-- src/libmime/filter.h | 5 +++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/libmime/filter.c b/src/libmime/filter.c index 5ad162163..32e63f6a0 100644 --- a/src/libmime/filter.c +++ b/src/libmime/filter.c @@ -459,6 +459,12 @@ rspamd_composite_expr_process (gpointer input, rspamd_expression_atom_t *atom) gint ret = 0, rc = 0; gchar t; + if (isset (cd->checked, cd->composite->id * 2)) { + /* We have already checked this composite, so just return its value */ + rc = isset (cd->checked, cd->composite->id * 2 + 1); + return rc; + } + if (*sym == '~' || *sym == '-') { t = *sym ++; } @@ -513,6 +519,8 @@ rspamd_composite_expr_process (gpointer input, rspamd_expression_atom_t *atom) rd); } } + + return rc; } /* @@ -527,7 +535,7 @@ rspamd_composite_expr_priority (rspamd_expression_atom_t *atom) static void rspamd_composite_expr_destroy (rspamd_expression_atom_t *atom) { - + /* Composite atoms are destroyed just with the pool */ } static gint @@ -541,9 +549,24 @@ remove_compare_data (gconstpointer a, gconstpointer b) static void composites_foreach_callback (gpointer key, gpointer value, void *data) { + struct composites_data *cd = data; + struct rspamd_composite *comp = value; + gint rc; -} + cd->composite = comp; + rc = rspamd_process_expression (comp->expr, cd); + + /* Checked bit */ + setbit (cd->checked, comp->id * 2); + /* Result bit */ + if (rc) { + setbit (cd->checked, comp->id * 2 + 1); + } + else { + clrbit (cd->checked, comp->id * 2 + 1); + } +} static gboolean diff --git a/src/libmime/filter.h b/src/libmime/filter.h index 41093b05d..3eef17525 100644 --- a/src/libmime/filter.h +++ b/src/libmime/filter.h @@ -71,6 +71,11 @@ struct metric_result { double grow_factor; /**< current grow factor */ }; + +/** + * Subr for composite expressions + */ +extern const struct rspamd_atom_subr composite_expr_subr; /** * Composite structure */ -- 2.39.5