diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-12-02 17:11:01 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-12-02 17:11:01 +0200 |
commit | 15f6dbf66eed6bed5c084d97077e7cc5f8e192a7 (patch) | |
tree | 1debcb9960f990af390cf3930c539736d0179960 /libmu_sieve/sieve-priv.h | |
parent | ed04bc837e353e61e4c43f6bdbd9a67859c61f61 (diff) | |
download | mailutils-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 'libmu_sieve/sieve-priv.h')
-rw-r--r-- | libmu_sieve/sieve-priv.h | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/libmu_sieve/sieve-priv.h b/libmu_sieve/sieve-priv.h index d7b389b07..7ae2fdf5a 100644 --- a/libmu_sieve/sieve-priv.h +++ b/libmu_sieve/sieve-priv.h @@ -19,8 +19,7 @@ #include <mailutils/sieve.h> #include <setjmp.h> #include <string.h> - -#define SIEVE_CODE_INCR 128 +#include <regex.h> typedef void (*sieve_instr_t) (mu_sieve_machine_t mach); @@ -29,6 +28,7 @@ typedef union sieve_instr_t instr; mu_sieve_handler_t handler; mu_sieve_value_t *val; + mu_sieve_comparator_t comp; mu_list_t list; long number; size_t pc; @@ -37,7 +37,7 @@ typedef union char *string; unsigned unum; } sieve_op_t; - + struct mu_locus_range { struct mu_locus beg; @@ -73,6 +73,14 @@ struct mu_sieve_machine mu_list_t action_list; /* Actions */ mu_list_t comp_list; /* Comparators */ mu_list_t source_list; /* Source names (for diagnostics) */ + + mu_sieve_string_t *stringspace; + size_t stringcount; + size_t stringmax; + + mu_sieve_value_t *valspace; + size_t valcount; + size_t valmax; size_t progsize; /* Number of allocated program cells */ sieve_op_t *prog; /* Compiled program */ @@ -85,8 +93,10 @@ struct mu_sieve_machine /* Call environment */ const char *identifier; /* Name of action or test being executed */ - mu_list_t arg_list; /* Positional arguments */ - mu_list_t tag_list; /* Tagged arguments */ + size_t argstart; /* Index of the first argument in valspace */ + size_t argcount; /* Number of positional arguments */ + size_t tagcount; /* Number of tagged arguments */ + mu_sieve_comparator_t comparator; /* Comparator (for tests) */ int dry_run; /* Dry-run mode */ jmp_buf errbuf; /* Target location for non-local exits */ @@ -146,7 +156,10 @@ struct mu_sieve_node struct { mu_sieve_register_t *reg; - mu_list_t arg; + size_t argstart; + size_t argcount; + size_t tagcount; + mu_sieve_comparator_t comparator; /* Comparator (for tests) */ } command; } v; }; @@ -161,18 +174,16 @@ void mu_i_sv_lex_finish (struct mu_sieve_machine *mach); extern mu_sieve_machine_t mu_sieve_machine; -#define TAG_COMPFUN "__compfun__" - -int mu_i_sv_code (struct mu_sieve_machine *mach, sieve_op_t op); +void mu_i_sv_code (struct mu_sieve_machine *mach, sieve_op_t op); void mu_i_sv_compile_error (struct mu_sieve_machine *mach, const char *fmt, ...) MU_PRINTFLIKE(2,3); int mu_i_sv_locus (struct mu_sieve_machine *mach, struct mu_locus_range *lr); -int mu_i_sv_code_action (struct mu_sieve_machine *mach, - mu_sieve_register_t *reg, mu_list_t arglist); -int mu_i_sv_code_test (struct mu_sieve_machine *mach, - mu_sieve_register_t *reg, mu_list_t arglist); +void mu_i_sv_code_action (struct mu_sieve_machine *mach, + struct mu_sieve_node *node); +void mu_i_sv_code_test (struct mu_sieve_machine *mach, + struct mu_sieve_node *node); /* Opcodes */ void _mu_i_sv_instr_action (mu_sieve_machine_t mach); @@ -203,8 +214,7 @@ void mu_i_sv_debug_command (mu_sieve_machine_t mach, size_t pc, char const *what); void mu_i_sv_trace (mu_sieve_machine_t mach, const char *what); -void mu_i_sv_argf (mu_stream_t str, mu_list_t list); -void mu_i_sv_valf (mu_stream_t str, mu_sieve_value_t *val); +void mu_i_sv_valf (mu_sieve_machine_t mach, mu_stream_t str, mu_sieve_value_t *val); typedef int (*mu_i_sv_interp_t) (char const *, size_t, char **, void *); @@ -216,4 +226,15 @@ int mu_i_sv_expand_encoded_char (char const *input, size_t len, char **exp, void int mu_sieve_require_encoded_character (mu_sieve_machine_t mach, const char *name); +void mu_i_sv_2nrealloc (mu_sieve_machine_t mach, + void **pptr, size_t *pnmemb, size_t size); + + +mu_sieve_value_t *mu_i_sv_mach_arg (mu_sieve_machine_t mach, size_t n); +mu_sieve_value_t *mu_i_sv_mach_tagn (mu_sieve_machine_t mach, size_t n); +void mu_i_sv_lint_command (struct mu_sieve_machine *mach, + struct mu_sieve_node *node); + + +size_t mu_i_sv_string_create (mu_sieve_machine_t mach, char *str); |