diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-11-23 13:26:23 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-11-23 13:44:34 +0200 |
commit | 15404d914aec7e80c884fc63dbfa5d3e347b32cb (patch) | |
tree | 5b3c17759d19c8a02ab1bafb722e0c00f5f28e2f /include/mailutils | |
parent | a04c6feb5007aeeb133b15558f13733743dee3e8 (diff) | |
download | mailutils-15404d914aec7e80c884fc63dbfa5d3e347b32cb.tar.gz mailutils-15404d914aec7e80c884fc63dbfa5d3e347b32cb.tar.bz2 |
Rewrite sieve parser.
Three objectives:
1. Simplify code.
2. Produce optimized sieve code.
3. Improve error reporting.
4. Prepare for further extensions
* include/mailutils/sieve.h (mu_sieve_tag_checker_t): Change
signature (take mu_sieve_machine_t as the first arg). All
uses changed.
(mu_sieve_require): Likewise.
(mu_sieve_yydebug): Remove global.
* libmu_sieve/sieve-priv.h (mu_locus_range): New struct.
(YYLTYPE): New define
(mu_sieve_state): New enum.
(mu_sieve_machine): New members: string_pool, state.
(mu_sieve_node_type): New enum.
(mu_sieve_node): New struct.
Remove unused prototypes.
* libmu_sieve/sieve.l: Keep track of code locations. Use opool
for constructing string values.
* libmu_sieve/sieve.y: Rewrite. First build the parse tree. Then
optimize it. Finally, generate code.
* libmu_sieve/tests.c (sieve_test_true,sieve_test_false): Remove.
True and false tests are always optimized away.
* libmu_sieve/util.c (mu_sv_compile_error): Remove.
* libmu_sieve/actions.c: Use mu_diag_at_locus to report errors
and mu_i_sv_error to mark sieve machine as being in error state.
* libmu_sieve/comparator.c: Likewise.
* libmu_sieve/prog.c (mu_sv_code): Replace with mu_i_sv_code.
(mu_sv_code_instr,mu_sv_code_handler)
(mu_sv_code_list,mu_sv_code_number)
(mu_sv_code_string,mu_sv_code_source)
(mu_sv_code_line,mu_sv_change_source)
(mu_sv_code_action,mu_sv_code_test)
(mu_sv_code_anyof,mu_sv_code_allof): Remove.
(mu_i_sv_locus,mu_i_sv_code_action)
(mu_i_sv_code_test): New function.
(mu_sv_code_command): Replace with a static function.
* libmu_sieve/require.c (mu_sieve_require): Take ptr to machine
as the first arg.
* libmu_sieve/runtime.c (mu_sieve_mailbox)
(mu_sieve_message): Refuse to run if the machine is in error state.
* sieve/sieve.c: Update.
* sieve/tests/i-numeric.at: Update expected error message.
* libmailutils/diag/diag.c (mu_diag_at_locus): Don't pass locus
if mu_file is NULL.
* libmu_auth/ldap.c (_mu_entry_to_auth_data): Remove leftover
mu_error.
Diffstat (limited to 'include/mailutils')
-rw-r--r-- | include/mailutils/sieve.h | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/include/mailutils/sieve.h b/include/mailutils/sieve.h index 9aab6c6eb..ccccb462c 100644 --- a/include/mailutils/sieve.h +++ b/include/mailutils/sieve.h @@ -47,7 +47,8 @@ typedef int (*mu_sieve_comparator_t) (const char *, 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) (const char *name, +typedef int (*mu_sieve_tag_checker_t) (mu_sieve_machine_t mach, + const char *name, mu_list_t tags, mu_list_t args); typedef enum @@ -121,7 +122,6 @@ typedef struct #define MU_SIEVE_DEBUG_DISAS 0x0004 #define MU_SIEVE_DRY_RUN 0x0008 -extern int mu_sieve_yydebug; 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; @@ -190,13 +190,16 @@ int mu_sieve_str_to_relcmp (const char *str, mu_sieve_relcmp_t * test, mu_sieve_relcmp_t mu_sieve_get_relcmp (mu_sieve_machine_t mach, mu_list_t tags); -void mu_sieve_require (mu_list_t slist); +void mu_sieve_require (mu_sieve_machine_t mach, mu_list_t slist); + int mu_sieve_tag_lookup (mu_list_t taglist, char *name, mu_sieve_value_t ** arg); int mu_sieve_load_ext (mu_sieve_machine_t mach, const char *name); -int mu_sieve_match_part_checker (const char *name, mu_list_t tags, +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 (const char *name, mu_list_t tags, +int mu_sieve_match_part_checker (mu_sieve_machine_t mach, + const char *name, mu_list_t tags, mu_list_t args); /* Operations in value lists */ mu_sieve_value_t *mu_sieve_value_get (mu_list_t vlist, size_t index); |