summaryrefslogtreecommitdiffstats
path: root/src/libutil/map_helpers.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-04-25 14:07:31 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-04-25 14:07:31 +0100
commiteb44a88a9405e9500e94c32395d69ab6460c4a9d (patch)
tree1432a42bd22020f35567ceaf6fbbc1ad207911ff /src/libutil/map_helpers.c
parent4fa0f48fddd66eadc0b7717717d06db1781db032 (diff)
downloadrspamd-eb44a88a9405e9500e94c32395d69ab6460c4a9d.tar.gz
rspamd-eb44a88a9405e9500e94c32395d69ab6460c4a9d.zip
[Minor] Add basic traversal helpers
Diffstat (limited to 'src/libutil/map_helpers.c')
-rw-r--r--src/libutil/map_helpers.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/libutil/map_helpers.c b/src/libutil/map_helpers.c
index 7bb442a97..b7d6acb49 100644
--- a/src/libutil/map_helpers.c
+++ b/src/libutil/map_helpers.c
@@ -568,6 +568,26 @@ rspamd_map_helper_insert_re (gpointer st, gconstpointer key, gconstpointer value
g_ptr_array_add (re_map->values, val);
}
+static void
+rspamd_map_helper_traverse_regexp (void *data,
+ rspamd_map_traverse_cb cb,
+ gpointer cbdata,
+ gboolean reset_hits)
+{
+ gconstpointer k;
+ struct rspamd_map_helper_value *val;
+ struct rspamd_regexp_map_helper *re_map = data;
+
+ kh_foreach (re_map->htb, k, val, {
+ if (!cb (k, val->value, val->hits, cbdata)) {
+ break;
+ }
+
+ if (reset_hits) {
+ val->hits = 0;
+ }
+ });
+}
struct rspamd_hash_map_helper *
rspamd_map_helper_new_hash (struct rspamd_map *map)
@@ -602,6 +622,27 @@ rspamd_map_helper_destroy_hash (struct rspamd_hash_map_helper *r)
rspamd_mempool_delete (r->pool);
}
+static void
+rspamd_map_helper_traverse_hash (void *data,
+ rspamd_map_traverse_cb cb,
+ gpointer cbdata,
+ gboolean reset_hits)
+{
+ gconstpointer k;
+ struct rspamd_map_helper_value *val;
+ struct rspamd_hash_map_helper *ht = data;
+
+ kh_foreach (ht->htb, k, val, {
+ if (!cb (k, val->value, val->hits, cbdata)) {
+ break;
+ }
+
+ if (reset_hits) {
+ val->hits = 0;
+ }
+ });
+}
+
struct rspamd_radix_map_helper *
rspamd_map_helper_new_radix (struct rspamd_map *map)
{
@@ -636,6 +677,27 @@ rspamd_map_helper_destroy_radix (struct rspamd_radix_map_helper *r)
rspamd_mempool_delete (r->pool);
}
+static void
+rspamd_map_helper_traverse_radix (void *data,
+ rspamd_map_traverse_cb cb,
+ gpointer cbdata,
+ gboolean reset_hits)
+{
+ gconstpointer k;
+ struct rspamd_map_helper_value *val;
+ struct rspamd_radix_map_helper *r = data;
+
+ kh_foreach (r->htb, k, val, {
+ if (!cb (k, val->value, val->hits, cbdata)) {
+ break;
+ }
+
+ if (reset_hits) {
+ val->hits = 0;
+ }
+ });
+}
+
struct rspamd_regexp_map_helper *
rspamd_map_helper_new_regexp (struct rspamd_map *map,
enum rspamd_regexp_map_flags flags)
@@ -732,6 +794,7 @@ rspamd_kv_list_fin (struct map_cb_data *data)
if (data->cur_data) {
htb = (struct rspamd_hash_map_helper *)data->cur_data;
msg_info_map ("read hash of %d elements", kh_size (htb->htb));
+ data->map->traverse_function = rspamd_map_helper_traverse_hash;
}
}
@@ -774,6 +837,7 @@ rspamd_radix_fin (struct map_cb_data *data)
r = (struct rspamd_radix_map_helper *)data->cur_data;
msg_info_map ("read radix trie of %z elements: %s",
radix_get_size (r->trie), radix_get_info (r->trie));
+ data->map->traverse_function = rspamd_map_helper_traverse_radix;
}
}
@@ -951,6 +1015,7 @@ rspamd_regexp_list_fin (struct map_cb_data *data)
rspamd_re_map_finalize (re_map);
msg_info_map ("read regexp list of %ud elements",
re_map->regexps->len);
+ data->map->traverse_function = rspamd_map_helper_traverse_regexp;
}
}