]> source.dussan.org Git - rspamd.git/commitdiff
Allow storage of auxiliary userdata inside regexp structure.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 7 Mar 2015 22:43:23 +0000 (22:43 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 7 Mar 2015 22:43:23 +0000 (22:43 +0000)
src/libutil/regexp.c
src/libutil/regexp.h

index 3b76d15e0ba501cd37ddab9d01ebcc4c8a6298a4..9151066f79558c53228222779fc64b3b2be2c9e2 100644 (file)
@@ -51,6 +51,7 @@ struct rspamd_regexp_s {
        pcre_extra *raw_extra;
        regexp_id_t id;
        ref_entry_t ref;
+       gpointer ud;
        gint flags;
 };
 
@@ -418,6 +419,22 @@ rspamd_regexp_unref (rspamd_regexp_t *re)
        REF_RELEASE (re);
 }
 
+void
+rspamd_regexp_set_ud (rspamd_regexp_t *re, gpointer ud)
+{
+       g_assert (re != NULL);
+
+       re->ud = ud;
+}
+
+gpointer
+rspamd_regexp_get_ud (rspamd_regexp_t *re)
+{
+       g_assert (re != NULL);
+
+       return re->ud;
+}
+
 static gboolean
 rspamd_regexp_equal (gconstpointer a, gconstpointer b)
 {
@@ -499,6 +516,25 @@ rspamd_regexp_cache_create (struct rspamd_regexp_cache *cache,
        return res;
 }
 
+void rspamd_regexp_cache_insert (struct rspamd_regexp_cache* cache,
+               const gchar *pattern,
+               const gchar *flags, rspamd_regexp_t *re)
+{
+       g_assert (re != NULL);
+       g_assert (pattern != NULL);
+
+       if (cache == NULL) {
+               cache = global_re_cache;
+       }
+
+       g_assert (cache != NULL);
+       /* Generate custom id */
+       rspamd_regexp_generate_id (pattern, flags, re->id);
+
+       REF_RETAIN (re);
+       g_hash_table_insert (cache->tbl, re->id, re);
+}
+
 gboolean
 rspamd_regexp_cache_remove (struct rspamd_regexp_cache *cache,
                rspamd_regexp_t *re)
index 41835af84d79e7d4c5281b03ab3f7a728d73d769..3c08de71a88fb21a2f125ff651627271cb7f85b7 100644 (file)
@@ -75,6 +75,20 @@ rspamd_regexp_t* rspamd_regexp_ref (rspamd_regexp_t *re);
  */
 void rspamd_regexp_unref (rspamd_regexp_t *re);
 
+/**
+ * Set auxiliary userdata for the specified regexp
+ * @param re regexp object
+ * @param ud opaque pointer
+ */
+void rspamd_regexp_set_ud (rspamd_regexp_t *re, gpointer ud);
+
+/**
+ * Get userdata for a regexp object
+ * @param re regexp object
+ * @return opaque pointer
+ */
+gpointer rspamd_regexp_get_ud (rspamd_regexp_t *re);
+
 /**
  * Get pattern for the specified regexp object
  * @param re
@@ -99,6 +113,17 @@ rspamd_regexp_t* rspamd_regexp_cache_query (struct rspamd_regexp_cache* cache,
                const gchar *pattern,
                const gchar *flags);
 
+/**
+ * Insert item to the cache using custom pattern and flags
+ * @param cache
+ * @param pattern
+ * @param flags
+ * @param re
+ */
+void rspamd_regexp_cache_insert (struct rspamd_regexp_cache* cache,
+               const gchar *pattern,
+               const gchar *flags, rspamd_regexp_t *re);
+
 /**
  * Create or get cached regexp from the specified cache
  * @param cache regexp cache. if NULL, the superglobal cache is used (*not* thread-safe)