From: Vsevolod Stakhov Date: Tue, 5 May 2015 18:02:21 +0000 (+0100) Subject: Rework composites processing. X-Git-Tag: 0.9.0~88 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=53282bc59b9c7252c2a8e559f9fbbe801f913840;p=rspamd.git Rework composites processing. --- diff --git a/src/libmime/filter.c b/src/libmime/filter.c index 7562cee94..ed5b2ec8f 100644 --- a/src/libmime/filter.c +++ b/src/libmime/filter.c @@ -481,26 +481,14 @@ rspamd_composite_expr_parse (const gchar *line, gsize len, return res; } + static gint -rspamd_composite_expr_process (gpointer input, rspamd_expression_atom_t *atom) +rspamd_composite_process_single_symbol (struct composites_data *cd, + const gchar *sym, struct symbol **pms) { - struct composites_data *cd = (struct composites_data *)input; - const gchar *sym = atom->data; - struct rspamd_composite *ncomp; - struct symbol_remove_data *rd; - struct symbol *ms; + struct symbol *ms = NULL; gint rc = 0; - gchar t = '\0'; - - 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 ++; - } + struct rspamd_composite *ncomp; if ((ms = g_hash_table_lookup (cd->metric_res->symbols, sym)) == NULL) { if ((ncomp = @@ -526,6 +514,32 @@ rspamd_composite_expr_process (gpointer input, rspamd_expression_atom_t *atom) rc = 1; } + *pms = ms; + return rc; +} + +static gint +rspamd_composite_expr_process (gpointer input, rspamd_expression_atom_t *atom) +{ + struct composites_data *cd = (struct composites_data *)input; + const gchar *sym = atom->data; + struct symbol_remove_data *rd; + struct symbol *ms; + gint rc = 0; + gchar t = '\0'; + + 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 ++; + } + + rc = rspamd_composite_process_single_symbol (cd, sym, &ms); + if (rc && ms) { /* * At this point we know that we need to do something about this symbol,