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