From 468f75b2c32d67b93956012ebb6e4c54f42a08a8 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Mon, 22 Oct 2007 01:02:02 +0200
Subject: [PATCH] * Added generation support to the fileinto extension. * Fixed
 a bug in the require command generation.

---
 src/lib-sieve/cmd-require.c  |  2 +-
 src/lib-sieve/ext-fileinto.c | 49 +++++++++++++++++++++++++++++++++---
 2 files changed, 47 insertions(+), 4 deletions(-)

diff --git a/src/lib-sieve/cmd-require.c b/src/lib-sieve/cmd-require.c
index 0179afc21..22388510c 100644
--- a/src/lib-sieve/cmd-require.c
+++ b/src/lib-sieve/cmd-require.c
@@ -75,7 +75,7 @@ bool cmd_require_generate
 		struct sieve_ast_argument *stritem = sieve_ast_strlist_first(arg);
 		
 		while ( stritem != NULL ) {
-			struct sieve_extension *ext = (struct sieve_extension *) arg->context;
+			struct sieve_extension *ext = (struct sieve_extension *) stritem->context;
 		
 			sieve_generator_register_extension(generator, ext);
 			
diff --git a/src/lib-sieve/ext-fileinto.c b/src/lib-sieve/ext-fileinto.c
index 341134650..8b51bf426 100644
--- a/src/lib-sieve/ext-fileinto.c
+++ b/src/lib-sieve/ext-fileinto.c
@@ -1,30 +1,42 @@
+#include <stdio.h>
+
 #include "sieve-extensions.h"
 #include "sieve-commands.h"
 #include "sieve-validator.h"
+#include "sieve-generator.h"
+#include "sieve-interpreter.h"
 
 /* Forward declarations */
 static bool ext_fileinto_validator_load(struct sieve_validator *validator);
+static bool ext_fileinto_opcode_dump(struct sieve_interpreter *interpreter);
+
 static bool cmd_fileinto_validate(struct sieve_validator *validator, struct sieve_command_context *cmd);
+static bool cmd_fileinto_generate(struct sieve_generator *generator,	struct sieve_command_context *ctx);
 
 /* Extension definitions */
 const struct sieve_extension fileinto_extension = 
-	{ "fileinto", ext_fileinto_validator_load, NULL, NULL, NULL };
+	{ "fileinto", ext_fileinto_validator_load, NULL, ext_fileinto_opcode_dump, NULL };
 static const struct sieve_command fileinto_command = 
-	{ "fileinto", SCT_COMMAND, NULL, cmd_fileinto_validate, NULL, NULL };
+	{ "fileinto", SCT_COMMAND, NULL, cmd_fileinto_validate, cmd_fileinto_generate, NULL };
 
 /* Validation */
+
 static bool cmd_fileinto_validate(struct sieve_validator *validator, struct sieve_command_context *cmd) 
 { 	
+	struct sieve_ast_argument *arg;
+	
 	/* Check valid syntax: 
 	 *    reject <reason: string>
 	 */
-	if ( !sieve_validate_command_arguments(validator, cmd, 1, NULL) ||
+	if ( !sieve_validate_command_arguments(validator, cmd, 1, &arg) ||
 		!sieve_validate_command_subtests(validator, cmd, 0) || 
 	 	!sieve_validate_command_block(validator, cmd, FALSE, FALSE) ) {
 	 	
 		return FALSE;
 	}
 	
+	cmd->data = arg;
+	
 	return TRUE;
 }
 
@@ -36,3 +48,34 @@ static bool ext_fileinto_validator_load(struct sieve_validator *validator)
 
 	return TRUE;
 }
+
+/*
+ * Generation
+ */
+ 
+static bool cmd_fileinto_generate
+	(struct sieve_generator *generator,	struct sieve_command_context *ctx) 
+{
+	struct sieve_ast_argument *arg = (struct sieve_ast_argument *) ctx->data;
+	
+	sieve_generator_emit_opcode(generator, &fileinto_extension);
+
+	/* Emit folder string */  	
+	if ( !sieve_generator_emit_string_argument(generator, arg) ) 
+		return FALSE;
+	
+	return TRUE;
+}
+
+/* 
+ * Code dump
+ */
+ 
+static bool ext_fileinto_opcode_dump(struct sieve_interpreter *interpreter)
+{
+	printf("FILEINTO\n");
+	sieve_interpreter_dump_operand(interpreter);
+	
+	return TRUE;
+}
+
-- 
GitLab