/* Size for features pipe */
#define FEATURE_WINDOW_SIZE 5
+#define MAX_DATA_LEN 64
+#define MAX_VALUES 32
-typedef struct token_node_s {
- guint32 h1;
- guint32 h2;
+struct token_result {
double value;
- uintptr_t extra;
+ struct rspamd_statfile_config *st;
+};
+
+typedef struct token_node_s {
+ guchar data[MAX_DATA_LEN];
+ guint datalen;
+ struct token_result *results;
+ guint results_len;
} token_node_t;
/* Common tokenizer structure */
h2 = hashpipe[0] * primes[1] + hashpipe[i] *
primes[(i << 1) - 1];
new = rspamd_mempool_alloc0 (pool, sizeof (token_node_t));
- new->h1 = h1;
- new->h2 = h2;
- if (save_token) {
- new->extra =
- (uintptr_t)rspamd_mempool_fstrdup (pool, token);
- }
+ new->datalen = sizeof(gint32) * 2;
+ memcpy(new->data, &h1, sizeof(h1));
+ memcpy(new->data + sizeof(h1), &h2, sizeof(h2));
if (g_tree_lookup (*tree, new) == NULL) {
g_tree_insert (*tree, new, new);
h1 = hashpipe[0] * primes[0] + hashpipe[i] * primes[i << 1];
h2 = hashpipe[0] * primes[1] + hashpipe[i] * primes[(i << 1) - 1];
new = rspamd_mempool_alloc0 (pool, sizeof (token_node_t));
- new->h1 = h1;
- new->h2 = h2;
- if (save_token) {
- new->extra = (uintptr_t)rspamd_mempool_fstrdup (pool, token);
- }
+ new->datalen = sizeof(gint32) * 2;
+ memcpy(new->data, &h1, sizeof(h1));
+ memcpy(new->data + sizeof(h1), &h2, sizeof(h2));
if (g_tree_lookup (*tree, new) == NULL) {
g_tree_insert (*tree, new, new);
{
const token_node_t *aa = a, *bb = b;
- if (aa->h1 == bb->h1) {
- return aa->h2 - bb->h2;
+ if (aa->datalen != bb->datalen) {
+ return aa->datalen - bb->datalen;
}
- return aa->h1 - bb->h1;
+ return memcmp (aa->data, bb->data, aa->datalen);
}
/* Get next word from specified f_str_t buf */