From cf5684491d7ab8488c39d36c1de5ae048e1c2743 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Thu, 18 Sep 2008 17:46:46 +0200 Subject: [PATCH] Variables: added dumptime context. --- src/lib-sieve/plugins/variables/Makefile.am | 2 + .../plugins/variables/ext-variables-common.c | 40 ----------- .../plugins/variables/ext-variables-common.h | 7 -- .../plugins/variables/ext-variables-dump.c | 68 +++++++++++++++++++ .../plugins/variables/ext-variables-dump.h | 17 +++++ .../plugins/variables/ext-variables.c | 1 + src/lib-sieve/sieve-code-dumper.c | 28 ++++++++ src/lib-sieve/sieve-code-dumper.h | 10 ++- 8 files changed, 125 insertions(+), 48 deletions(-) create mode 100644 src/lib-sieve/plugins/variables/ext-variables-dump.c create mode 100644 src/lib-sieve/plugins/variables/ext-variables-dump.h diff --git a/src/lib-sieve/plugins/variables/Makefile.am b/src/lib-sieve/plugins/variables/Makefile.am index 9fdb4c96d..6763e00a6 100644 --- a/src/lib-sieve/plugins/variables/Makefile.am +++ b/src/lib-sieve/plugins/variables/Makefile.am @@ -19,6 +19,7 @@ libsieve_ext_variables_la_SOURCES = \ ext-variables-arguments.c \ ext-variables-operands.c \ ext-variables-modifiers.c \ + ext-variables-dump.c \ $(cmds) \ $(tsts) \ ext-variables.c @@ -30,6 +31,7 @@ noinst_HEADERS = \ ext-variables-arguments.h \ ext-variables-operands.h \ ext-variables-modifiers.h \ + ext-variables-dump.h \ sieve-ext-variables.h EXTRA_DIST = *.sieve diff --git a/src/lib-sieve/plugins/variables/ext-variables-common.c b/src/lib-sieve/plugins/variables/ext-variables-common.c index f5bf51f28..ffb52a1ae 100644 --- a/src/lib-sieve/plugins/variables/ext-variables-common.c +++ b/src/lib-sieve/plugins/variables/ext-variables-common.c @@ -428,43 +428,6 @@ bool ext_variables_generator_load(const struct sieve_codegen_env *cgenv) return TRUE; } -/* - * Code dump - */ - -bool ext_variables_code_dump -(const struct sieve_dumptime_env *denv, sieve_size_t *address) -{ - unsigned int i, scope_size; - sieve_size_t pc; - int end_offset; - - sieve_code_mark(denv); - if ( !sieve_binary_read_unsigned(denv->sbin, address, &scope_size) ) - return FALSE; - - pc = *address; - if ( !sieve_binary_read_offset(denv->sbin, address, &end_offset) ) - return FALSE; - - sieve_code_dumpf(denv, "SCOPE [%u] (end: %08x)", - scope_size, (unsigned int) (pc + end_offset)); - - /* Read global variable scope */ - for ( i = 0; i < scope_size; i++ ) { - string_t *identifier; - - sieve_code_mark(denv); - if (!sieve_binary_read_string(denv->sbin, address, &identifier) ) { - return FALSE; - } - - sieve_code_dumpf(denv, "%3d: '%s'", i, str_c(identifier)); - } - - return TRUE; -} - /* * Interpreter context */ @@ -495,7 +458,6 @@ bool ext_variables_interpreter_load (const struct sieve_runtime_env *renv, sieve_size_t *address) { struct ext_variables_interpreter_context *ctx; - struct sieve_variable_scope *main_scope; unsigned int scope_size; sieve_size_t pc; int end_offset; @@ -510,8 +472,6 @@ bool ext_variables_interpreter_load scope_size, SIEVE_VARIABLES_MAX_SCOPE_SIZE ); return FALSE; } - - main_scope = sieve_variable_scope_create(NULL); pc = *address; if ( !sieve_binary_read_offset(renv->sbin, address, &end_offset) ) diff --git a/src/lib-sieve/plugins/variables/ext-variables-common.h b/src/lib-sieve/plugins/variables/ext-variables-common.h index cd22b3737..935558b02 100644 --- a/src/lib-sieve/plugins/variables/ext-variables-common.h +++ b/src/lib-sieve/plugins/variables/ext-variables-common.h @@ -75,13 +75,6 @@ struct sieve_variable *ext_variables_validator_get_variable bool ext_variables_generator_load (const struct sieve_codegen_env *cgenv); -/* - * Code dump - */ - -bool ext_variables_code_dump - (const struct sieve_dumptime_env *denv, sieve_size_t *address); - /* * Interpreter context */ diff --git a/src/lib-sieve/plugins/variables/ext-variables-dump.c b/src/lib-sieve/plugins/variables/ext-variables-dump.c new file mode 100644 index 000000000..27305e6c4 --- /dev/null +++ b/src/lib-sieve/plugins/variables/ext-variables-dump.c @@ -0,0 +1,68 @@ +/* Copyright (c) 2002-2008 Dovecot Sieve authors, see the included COPYING file + */ + +#include "lib.h" +#include "str.h" + +#include "sieve-common.h" +#include "sieve-dump.h" +#include "sieve-binary.h" +#include "sieve-code.h" + +#include "ext-variables-common.h" +#include "ext-variables-dump.h" + +/* + * Code dump context + */ + +struct ext_variables_dump_context { + struct sieve_variable_scope *main_scope; +}; + +bool ext_variables_code_dump +(const struct sieve_dumptime_env *denv, sieve_size_t *address) +{ + struct sieve_code_dumper *dumper = denv->cdumper; + struct ext_variables_dump_context *dctx; + struct sieve_variable_scope *main_scope; + unsigned int i, scope_size; + sieve_size_t pc; + int end_offset; + + sieve_code_mark(denv); + if ( !sieve_binary_read_unsigned(denv->sbin, address, &scope_size) ) + return FALSE; + + pc = *address; + if ( !sieve_binary_read_offset(denv->sbin, address, &end_offset) ) + return FALSE; + + main_scope = sieve_variable_scope_create(NULL); + + sieve_code_dumpf(denv, "SCOPE [%u] (end: %08x)", + scope_size, (unsigned int) (pc + end_offset)); + + /* Read main variable scope */ + + for ( i = 0; i < scope_size; i++ ) { + string_t *identifier; + + sieve_code_mark(denv); + if (!sieve_binary_read_string(denv->sbin, address, &identifier) ) { + return FALSE; + } + + sieve_code_dumpf(denv, "%3d: '%s'", i, str_c(identifier)); + } + + /* Create dumper context */ + dctx = p_new(sieve_code_dumper_pool(dumper), struct ext_variables_dump_context, 1); + dctx->main_scope = main_scope; + + sieve_dump_extension_set_context(dumper, &variables_extension, dctx); + + return TRUE; +} + + diff --git a/src/lib-sieve/plugins/variables/ext-variables-dump.h b/src/lib-sieve/plugins/variables/ext-variables-dump.h new file mode 100644 index 000000000..3533deb19 --- /dev/null +++ b/src/lib-sieve/plugins/variables/ext-variables-dump.h @@ -0,0 +1,17 @@ +/* Copyright (c) 2002-2008 Dovecot Sieve authors, see the included COPYING file + */ + +#ifndef __EXT_VARIABLES_DUMP_H +#define __EXT_VARIABLES_DUMP_H + +#include "sieve-common.h" + +/* + * Code dump context + */ + +bool ext_variables_code_dump + (const struct sieve_dumptime_env *denv, sieve_size_t *address); + + +#endif /* __EXT_VARIABLES_DUMP_H */ diff --git a/src/lib-sieve/plugins/variables/ext-variables.c b/src/lib-sieve/plugins/variables/ext-variables.c index 57e1fc8c1..12b9bee61 100644 --- a/src/lib-sieve/plugins/variables/ext-variables.c +++ b/src/lib-sieve/plugins/variables/ext-variables.c @@ -32,6 +32,7 @@ #include "ext-variables-arguments.h" #include "ext-variables-operands.h" #include "ext-variables-modifiers.h" +#include "ext-variables-dump.h" /* * Operations diff --git a/src/lib-sieve/sieve-code-dumper.c b/src/lib-sieve/sieve-code-dumper.c index 5a6f966f1..d6e375570 100644 --- a/src/lib-sieve/sieve-code-dumper.c +++ b/src/lib-sieve/sieve-code-dumper.c @@ -33,6 +33,8 @@ struct sieve_code_dumper { /* Dump environment */ struct sieve_dumptime_env *dumpenv; + + ARRAY_DEFINE(ext_contexts, void *); }; struct sieve_code_dumper *sieve_code_dumper_create @@ -47,6 +49,9 @@ struct sieve_code_dumper *sieve_code_dumper_create dumper->dumpenv = denv; dumper->pc = 0; + /* Setup storage for extension contexts */ + p_array_init(&dumper->ext_contexts, pool, sieve_extensions_get_count()); + return dumper; } @@ -62,6 +67,29 @@ pool_t sieve_code_dumper_pool(struct sieve_code_dumper *dumper) return dumper->pool; } +/* EXtension support */ + +void sieve_dump_extension_set_context +(struct sieve_code_dumper *dumper, const struct sieve_extension *ext, + void *context) +{ + array_idx_set(&dumper->ext_contexts, (unsigned int) *ext->id, &context); +} + +const void *sieve_dump_extension_get_context +(struct sieve_code_dumper *dumper, const struct sieve_extension *ext) +{ + int ext_id = *ext->id; + void * const *ctx; + + if ( ext_id < 0 || ext_id >= (int) array_count(&dumper->ext_contexts) ) + return NULL; + + ctx = array_idx(&dumper->ext_contexts, (unsigned int) ext_id); + + return *ctx; +} + /* Dump functions */ void sieve_code_dumpf diff --git a/src/lib-sieve/sieve-code-dumper.h b/src/lib-sieve/sieve-code-dumper.h index 4f246ba47..d8cf50dab 100644 --- a/src/lib-sieve/sieve-code-dumper.h +++ b/src/lib-sieve/sieve-code-dumper.h @@ -12,7 +12,15 @@ void sieve_code_dumper_free pool_t sieve_code_dumper_pool (struct sieve_code_dumper *dumper); -/* */ +/* EXtension support */ + +void sieve_dump_extension_set_context + (struct sieve_code_dumper *dumper, const struct sieve_extension *ext, + void *context); +const void *sieve_dump_extension_get_context + (struct sieve_code_dumper *dumper, const struct sieve_extension *ext); + +/* Dump functions */ void sieve_code_dumpf (const struct sieve_dumptime_env *denv, const char *fmt, ...) -- GitLab