};
static struct rspamd_stat_tokenizer stat_tokenizers[] = {
- {"osb-text", rspamd_tokenizer_osb},
- {"osb", rspamd_tokenizer_osb}
+ {
+ .name = "osb-text",
+ .get_config = rspamd_tokenizer_osb_get_config,
+ .compatible_config = rspamd_tokenizer_osb_compatible_config,
+ .tokenize_func = rspamd_tokenizer_osb
+ },
+ {
+ .name = "osb",
+ .get_config = rspamd_tokenizer_osb_get_config,
+ .compatible_config = rspamd_tokenizer_osb_compatible_config,
+ .tokenize_func = rspamd_tokenizer_osb
+ },
};
static struct rspamd_stat_backend stat_backends[] = {
guchar *key = NULL;
gsize keylen;
+
+ if (pool != NULL) {
+ cf = rspamd_mempool_alloc (pool, sizeof (*cf));
+ }
+ else {
+ cf = g_slice_alloc (sizeof (*cf));
+ }
+
/* Use default config */
- cf = rspamd_mempool_alloc (pool, sizeof (*cf));
def = rspamd_tokenizer_osb_default_config ();
memcpy (cf, def, sizeof (*cf));
return cf;
}
-int
+gpointer
+rspamd_tokenizer_osb_get_config (struct rspamd_tokenizer_config *cf,
+ gsize *len)
+{
+ struct rspamd_osb_tokenizer_config *osb_cf, *def;
+
+ if (cf != NULL && cf->opts != NULL) {
+ osb_cf = rspamd_tokenizer_osb_config_from_ucl (NULL, cf->opts);
+ }
+ else {
+ def = rspamd_tokenizer_osb_default_config ();
+ osb_cf = g_slice_alloc (sizeof (*osb_cf));
+ memcpy (osb_cf, def, sizeof (*osb_cf));
+ }
+
+ if (len != NULL) {
+ *len = sizeof (*osb_cf);
+ }
+
+ return osb_cf;
+}
+
+gboolean
+rspamd_tokenizer_osb_compatible_config (struct rspamd_tokenizer_config *cf,
+ gpointer ptr, gsize len)
+{
+ struct rspamd_osb_tokenizer_config *osb_cf, *test_cf;
+ gboolean ret = FALSE;
+
+ test_cf = rspamd_tokenizer_osb_get_config (cf, NULL);
+
+ if (len == sizeof (*osb_cf)) {
+ osb_cf = ptr;
+
+ if (memcmp (osb_cf, osb_tokenizer_magic, sizeof (osb_tokenizer_magic)) != 0) {
+ ret = test_cf->ht == RSPAMD_OSB_HASH_COMPAT;
+ }
+ else {
+ if (osb_cf->version == DEFAULT_OSB_VERSION) {
+ /* We can compare them directly now */
+ ret = memcmp (osb_cf, test_cf, sizeof (*osb_cf)) == 0;
+ }
+ }
+ }
+ else {
+ /* We are compatible now merely with fallback config */
+ if (test_cf->ht == RSPAMD_OSB_HASH_COMPAT) {
+ ret = TRUE;
+ }
+ }
+
+ return ret;
+}
+
+gint
rspamd_tokenizer_osb (struct rspamd_tokenizer_config *cf,
rspamd_mempool_t * pool,
GArray * input,
0, 0, 0, 0, 0
};
-int
+gint
token_node_compare_func (gconstpointer a, gconstpointer b)
{
const rspamd_token_t *aa = a, *bb = b;
/* Common tokenizer structure */
struct rspamd_stat_tokenizer {
gchar *name;
+ gpointer (*get_config) (struct rspamd_tokenizer_config *cf, gsize *len);
+ gboolean (*compatible_config) (struct rspamd_tokenizer_config *cf,
+ gpointer ptr, gsize len);
gint (*tokenize_func)(struct rspamd_tokenizer_config *cf,
rspamd_mempool_t *pool,
GArray *words,
};
/* Compare two token nodes */
-int token_node_compare_func (gconstpointer a, gconstpointer b);
+gint token_node_compare_func (gconstpointer a, gconstpointer b);
/* Tokenize text into array of words (rspamd_fstring_t type) */
gsize min_len, GList **exceptions);
/* OSB tokenize function */
-int rspamd_tokenizer_osb (struct rspamd_tokenizer_config *cf,
+gint rspamd_tokenizer_osb (struct rspamd_tokenizer_config *cf,
rspamd_mempool_t *pool,
GArray *input,
GTree *tokens,
gboolean is_utf);
+gpointer rspamd_tokenizer_osb_get_config (struct rspamd_tokenizer_config *cf,
+ gsize *len);
+
+gboolean
+rspamd_tokenizer_osb_compatible_config (struct rspamd_tokenizer_config *cf,
+ gpointer ptr, gsize len);
+
#endif
/*
* vi:ts=4