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