diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-12-07 09:46:57 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-12-07 13:03:42 +0200 |
commit | 799519539556b38fc9f84d44927861cb9239d14c (patch) | |
tree | 304982f21416f837c8b5a678b85ba99edce62d40 /include | |
parent | cab2fd5c0479d16a3dcd746c98de8be771a8963d (diff) | |
download | mailutils-799519539556b38fc9f84d44927861cb9239d14c.tar.gz mailutils-799519539556b38fc9f84d44927861cb9239d14c.tar.bz2 |
Implement the "variables" Sieve extension (RFC 5229)
* include/mailutils/sieve.h (mu_sieve_string): New fields
"constant" and "changed".
(mu_sieve_match_part_tags): New extern.
(mu_sieve_relational_count)
(mu_sieve_require_variables)
(mu_sieve_has_variables)
(mu_sieve_string_get): New functions.
* libmu_sieve/variables.c: New file.
* libmu_sieve/Makefile.am: Add variables.c
* libmu_sieve/comparator.c: Use mu_sieve_string_get to obtain
the actual value of the string.
* libmu_sieve/require.c: Support the "variables" extension.
* libmu_sieve/sieve-priv.h (mu_sieve_machine): New fields
vartab, match_string, match_buf, match_count, match_max.
(mu_i_sv_copy_variables)
(mu_i_sv_expand_variables): New protos.
* libmu_sieve/sieve.l (line_add): zero length means add entire
asciiz string.
* libmu_sieve/sieve.y (mu_sieve_machine_reset): Reset the new
fields.
(mu_sieve_machine_clone): Copy variables and initialize new
fields.
(string_rescan): New function.
(sieve_parse): Rescan string to determine their properties.
* libmu_sieve/strexp.c (update_len): Allow for NULL replacement
values.
* libmu_sieve/string.c (mu_sieve_string_get): New function.
(mu_sieve_string): Use it.
* libmu_sieve/tests.c (do_count): Rename to mu_sieve_relational_count,
make global. All uses changed.
(match_part_tags): Rename to mu_sieve_match_part_tags, make global.
All uses changed.
* sieve/tests/variables.at: New file.
* sieve/tests/Makefile.am: Add new testcases.
* sieve/tests/testsuite.at: Likewise.
Diffstat (limited to 'include')
-rw-r--r-- | include/mailutils/sieve.h | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/include/mailutils/sieve.h b/include/mailutils/sieve.h index 6316332b8..8dfa3814f 100644 --- a/include/mailutils/sieve.h +++ b/include/mailutils/sieve.h @@ -35,9 +35,11 @@ typedef struct mu_sieve_machine *mu_sieve_machine_t; typedef struct mu_sieve_string { - char *orig; - char *exp; - void *rx; + unsigned constant:1; /* String is constant */ + unsigned changed:1; /* String value has changed */ + char *orig; /* String original value */ + char *exp; /* Actual string value after expansion */ + void *rx; /* Pointer to the corresponding regular expr */ } mu_sieve_string_t; typedef int (*mu_sieve_handler_t) (mu_sieve_machine_t mach); @@ -141,7 +143,9 @@ extern mu_debug_handle_t mu_sieve_debug_handle; extern mu_list_t mu_sieve_include_path; extern mu_list_t mu_sieve_library_path; extern mu_list_t mu_sieve_library_path_prefix; - + +extern mu_sieve_tag_def_t mu_sieve_match_part_tags[]; + /* Memory allocation functions */ typedef void (*mu_sieve_reclaim_t) (void *); void mu_sieve_register_memory (mu_sieve_machine_t mach, void *ptr, @@ -197,6 +201,11 @@ void mu_sieve_register_comparator (mu_sieve_machine_t mach, const char *name, mu_sieve_comparator_t eq); int mu_sieve_require_relational (mu_sieve_machine_t mach, const char *name); +int mu_sieve_relational_count (mu_sieve_machine_t mach, size_t count, + int retval); + +int mu_sieve_require_variables (mu_sieve_machine_t mach); +int mu_sieve_has_variables (mu_sieve_machine_t mach); void *mu_sieve_load_ext (mu_sieve_machine_t mach, const char *name); void mu_sieve_unload_ext (void *handle); @@ -234,9 +243,10 @@ void mu_sieve_get_arg (mu_sieve_machine_t mach, size_t index, 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); +mu_sieve_string_t *mu_sieve_string_raw (mu_sieve_machine_t mach, + mu_sieve_slice_t slice, + size_t i); +char *mu_sieve_string_get (mu_sieve_machine_t mach, mu_sieve_string_t *string); /* Operations on value lists */ int mu_sieve_vlist_do (mu_sieve_machine_t mach, |