Browse Source

Add function to traverse AST atoms

tags/1.0.8
Vsevolod Stakhov 8 years ago
parent
commit
e74409e4f5
2 changed files with 53 additions and 0 deletions
  1. 36
    0
      src/libutil/expression.c
  2. 17
    0
      src/libutil/expression.h

+ 36
- 0
src/libutil/expression.c View File

@@ -1091,3 +1091,39 @@ rspamd_expression_tostring (struct rspamd_expression *expr)

return res;
}

struct atom_foreach_cbdata {
rspamd_expression_atom_foreach_cb cb;
gpointer cbdata;
};

static gboolean
rspamd_ast_atom_traverse (GNode *n, gpointer d)
{
struct atom_foreach_cbdata *data = d;
struct rspamd_expression_elt *elt = n->data;
rspamd_ftok_t tok;

if (elt->type == ELT_ATOM) {
tok.begin = elt->p.atom->str;
tok.len = elt->p.atom->len;

data->cb (&tok, data->cbdata);
}

return FALSE;
}

void
rspamd_expression_atom_foreach (struct rspamd_expression *expr,
rspamd_expression_atom_foreach_cb cb, gpointer cbdata)
{
struct atom_foreach_cbdata data;

g_assert (expr != NULL);

data.cb = cb;
data.cbdata = cbdata;
g_node_traverse (expr->ast, G_POST_ORDER, G_TRAVERSE_ALL, -1,
rspamd_ast_atom_traverse, &data);
}

+ 17
- 0
src/libutil/expression.h View File

@@ -27,6 +27,7 @@

#include "config.h"
#include "mem_pool.h"
#include "fstring.h"

#define RSPAMD_EXPRESSION_MAX_PRIORITY 1024

@@ -93,4 +94,20 @@ gint rspamd_process_expression (struct rspamd_expression *expr, gint flags,
*/
GString *rspamd_expression_tostring (struct rspamd_expression *expr);

/**
* Callback that is called on @see rspamd_expression_atom_foreach, atom is ephemeral
* and should not be modified within callback
*/
typedef void (*rspamd_expression_atom_foreach_cb) (const rspamd_ftok_t *atom,
gpointer ud);

/**
* Traverse over all atoms in the expression
* @param expr expression
* @param cb callback to be called
* @param ud opaque data passed to `cb`
*/
void rspamd_expression_atom_foreach (struct rspamd_expression *expr,
rspamd_expression_atom_foreach_cb cb, gpointer cbdata);

#endif /* SRC_LIBUTIL_EXPRESSION_H_ */

Loading…
Cancel
Save