summaryrefslogtreecommitdiff
path: root/include/mailutils/sieve.h
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2016-12-02 17:11:01 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2016-12-02 17:11:01 +0200
commit15f6dbf66eed6bed5c084d97077e7cc5f8e192a7 (patch)
tree1debcb9960f990af390cf3930c539736d0179960 /include/mailutils/sieve.h
parented04bc837e353e61e4c43f6bdbd9a67859c61f61 (diff)
downloadmailutils-15f6dbf66eed6bed5c084d97077e7cc5f8e192a7.tar.gz
mailutils-15f6dbf66eed6bed5c084d97077e7cc5f8e192a7.tar.bz2
sieve: change string allocation and argument passing convention
Strings are allocated in a per-machine string space. String and argument lists form contiguous arrays of structures. Regular ex- pressions are compiled when they are needed. Compiled expressions are cached for eventual reuse.
Diffstat (limited to 'include/mailutils/sieve.h')
-rw-r--r--include/mailutils/sieve.h78
1 files changed, 46 insertions, 32 deletions
diff --git a/include/mailutils/sieve.h b/include/mailutils/sieve.h
index 20ad24eec..7227abad8 100644
--- a/include/mailutils/sieve.h
+++ b/include/mailutils/sieve.h
@@ -33,6 +33,13 @@ extern "C" {
typedef struct mu_sieve_machine *mu_sieve_machine_t;
+typedef struct mu_sieve_string
+{
+ char *orig;
+ char *exp;
+ void *rx;
+} mu_sieve_string_t;
+
typedef int (*mu_sieve_handler_t) (mu_sieve_machine_t mach);
typedef void (*mu_sieve_action_log_t) (mu_sieve_machine_t mach,
const char *action,
@@ -40,13 +47,12 @@ typedef void (*mu_sieve_action_log_t) (mu_sieve_machine_t mach,
typedef int (*mu_sieve_relcmp_t) (int, int);
typedef int (*mu_sieve_relcmpn_t) (size_t, size_t);
-typedef int (*mu_sieve_comparator_t) (const char *, const char *);
+typedef int (*mu_sieve_comparator_t) (mu_sieve_machine_t mach,
+ mu_sieve_string_t *, const char *);
typedef int (*mu_sieve_retrieve_t) (void *item, void *data, int idx,
char **pval);
typedef void (*mu_sieve_destructor_t) (void *data);
-typedef int (*mu_sieve_tag_checker_t) (mu_sieve_machine_t mach,
- const char *name,
- mu_list_t tags, mu_list_t args);
+typedef int (*mu_sieve_tag_checker_t) (mu_sieve_machine_t mach);
typedef enum
{
@@ -55,24 +61,29 @@ typedef enum
SVT_STRING,
SVT_STRING_LIST,
SVT_TAG,
- SVT_IDENT,
- SVT_POINTER
+ SVT_IDENT
}
mu_sieve_data_type;
-typedef struct mu_sieve_runtime_tag mu_sieve_runtime_tag_t;
+struct mu_sieve_slice
+{
+ size_t first;
+ size_t count;
+};
+
+typedef struct mu_sieve_slice *mu_sieve_slice_t;
union mu_sieve_value_storage
{
char *string;
size_t number;
- mu_list_t list;
- void *ptr;
+ struct mu_sieve_slice list;
};
typedef struct
{
mu_sieve_data_type type;
+ char *tag;
union mu_sieve_value_storage v;
} mu_sieve_value_t;
@@ -88,12 +99,6 @@ typedef struct
mu_sieve_tag_checker_t checker;
} mu_sieve_tag_group_t;
-struct mu_sieve_runtime_tag
-{
- char *tag;
- mu_sieve_value_t *arg;
-};
-
typedef struct
{
const char *name;
@@ -135,11 +140,9 @@ void *mu_sieve_realloc (mu_sieve_machine_t mach, void *ptr, size_t size);
void mu_sieve_reclaim_default (void *p);
void mu_sieve_reclaim_list (void *p);
void mu_sieve_reclaim_value (void *p);
-void mu_sieve_reclaim_tag (void *p);
-mu_sieve_value_t *mu_sieve_value_create (mu_sieve_machine_t mach,
- mu_sieve_data_type type, void *data);
-void mu_sieve_slist_destroy (mu_list_t *plist);
+size_t mu_sieve_value_create (mu_sieve_machine_t mach,
+ mu_sieve_data_type type, void *data);
/* Symbol space functions */
mu_sieve_register_t *mu_sieve_test_lookup (mu_sieve_machine_t mach,
@@ -185,30 +188,41 @@ int mu_sieve_str_to_relcmp (const char *str, mu_sieve_relcmp_t *test,
mu_sieve_relcmpn_t *stest);
mu_sieve_relcmp_t mu_sieve_get_relcmp (mu_sieve_machine_t mach);
-void mu_sieve_require (mu_sieve_machine_t mach, mu_list_t slist);
+void mu_sieve_require (mu_sieve_machine_t mach, mu_sieve_slice_t list);
+void mu_sieve_value_get (mu_sieve_machine_t mach, mu_sieve_value_t *val,
+ mu_sieve_data_type type, void *ret);
+
int mu_sieve_get_tag (mu_sieve_machine_t mach, char *name,
mu_sieve_data_type type, void *ret);
-int mu_sieve_get_tag_untyped (mu_sieve_machine_t mach,
- char *name, mu_sieve_value_t **ret);
+mu_sieve_value_t *mu_sieve_get_tag_untyped (mu_sieve_machine_t mach,
+ char const *name);
+mu_sieve_value_t *mu_sieve_get_tag_n (mu_sieve_machine_t mach, size_t n);
int mu_sieve_load_ext (mu_sieve_machine_t mach, const char *name);
-int mu_sieve_match_part_checker (mu_sieve_machine_t mach,
- const char *name, mu_list_t tags,
- mu_list_t args);
-int mu_sieve_match_part_checker (mu_sieve_machine_t mach,
- const char *name, mu_list_t tags,
- mu_list_t args);
+int mu_sieve_match_part_checker (mu_sieve_machine_t mach);
+
/* Operations on value lists */
mu_sieve_value_t *mu_sieve_get_arg_optional (mu_sieve_machine_t mach,
size_t index);
mu_sieve_value_t *mu_sieve_get_arg_untyped (mu_sieve_machine_t mach,
size_t index);
-int mu_sieve_get_arg (mu_sieve_machine_t mach, size_t index,
- mu_sieve_data_type type, void *ret);
-int mu_sieve_vlist_do (mu_sieve_value_t *val, mu_list_action_t ac,
+void mu_sieve_get_arg (mu_sieve_machine_t mach, size_t index,
+ mu_sieve_data_type type, void *ret);
+
+char *mu_sieve_string (mu_sieve_machine_t mach,
+ mu_sieve_slice_t slice,
+ size_t i);
+struct mu_sieve_string *mu_sieve_string_raw (mu_sieve_machine_t mach,
+ mu_sieve_slice_t slice,
+ size_t i);
+
+
+int mu_sieve_vlist_do (mu_sieve_machine_t mach,
+ mu_sieve_value_t *val, mu_list_action_t ac,
void *data);
-int mu_sieve_vlist_compare (mu_sieve_value_t *a, mu_sieve_value_t *b,
+int mu_sieve_vlist_compare (mu_sieve_machine_t mach,
+ mu_sieve_value_t *a, mu_sieve_value_t *b,
mu_sieve_comparator_t comp,
mu_sieve_relcmp_t test, mu_sieve_retrieve_t ac,
void *data, size_t *count);

Return to:

Send suggestions and report system problems to the System administrator.