From c3678c458cf2739addb76d05f40b3bbbb3b3f365 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Mon, 11 Feb 2008 09:59:02 +0100 Subject: [PATCH] Variables: set modifiers are now sorted. --- src/lib-sieve/plugins/variables/cmd-set.c | 48 ++++++++++++------- .../plugins/variables/variables.sieve | 4 +- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/lib-sieve/plugins/variables/cmd-set.c b/src/lib-sieve/plugins/variables/cmd-set.c index a5d8ac503..6a386bc03 100644 --- a/src/lib-sieve/plugins/variables/cmd-set.c +++ b/src/lib-sieve/plugins/variables/cmd-set.c @@ -92,10 +92,24 @@ static bool tag_modifier_validate (struct sieve_validator *validator, struct sieve_ast_argument **arg, struct sieve_command_context *cmd) { + unsigned int i; + bool inserted; struct ext_variables_set_modifier *smodf = (*arg)->context; struct cmd_set_context *sctx = (struct cmd_set_context *) cmd->data; - array_append(&sctx->modifiers, &smodf, 1); + inserted = FALSE; + for ( i = 0; i < array_count(&sctx->modifiers) && !inserted; i++ ) { + struct ext_variables_set_modifier * const * mdf = + array_idx(&sctx->modifiers, i); + + if ( (*mdf)->precedence < smodf->precedence ) { + array_insert(&sctx->modifiers, i, &smodf, 1); + inserted = TRUE; + } + } + + if ( !inserted ) + array_append(&sctx->modifiers, &smodf, 1); /* Added to modifier list; self-destruct to prevent duplicate generation */ *arg = sieve_ast_arguments_detach(*arg, 1); @@ -234,8 +248,12 @@ static bool cmd_set_generate unsigned int i; sieve_generator_emit_operation_ext - (generator, &cmd_set_operation, ext_variables_my_id); + (generator, &cmd_set_operation, ext_variables_my_id); + /* Generate arguments */ + if ( !sieve_generate_arguments(generator, ctx, NULL) ) + return FALSE; + /* Generate modifiers */ sieve_binary_emit_byte(sbin, array_count(&sctx->modifiers)); for ( i = 0; i < array_count(&sctx->modifiers); i++ ) { @@ -243,11 +261,7 @@ static bool cmd_set_generate array_idx(&sctx->modifiers, i); sieve_binary_emit_byte(sbin, (*smodf)->code); - } - - /* Generate arguments */ - if ( !sieve_generate_arguments(generator, ctx, NULL) ) - return FALSE; + } return TRUE; } @@ -293,6 +307,10 @@ static bool cmd_set_operation_dump sieve_code_dumpf(denv, "SET"); sieve_code_descend(denv); + if ( !sieve_opr_string_dump(denv, address) || + !sieve_opr_string_dump(denv, address) ) + return FALSE; + if ( !sieve_binary_read_byte(denv->sbin, address, &mdfs) ) return FALSE; @@ -306,9 +324,7 @@ static bool cmd_set_operation_dump sieve_code_dumpf(denv, "MOD: %s", modf->identifier); } - return - sieve_opr_string_dump(denv, address) && - sieve_opr_string_dump(denv, address); + return TRUE; } /* @@ -325,6 +341,12 @@ static bool cmd_set_operation_execute printf(">> SET\n"); + if ( !ext_variables_opr_variable_read(renv, address, &storage, &var_index) ) + return FALSE; + + if ( !sieve_opr_string_read(renv, address, &value) ) + return FALSE; + if ( !sieve_binary_read_byte(renv->sbin, address, &mdfs) ) return FALSE; @@ -335,12 +357,6 @@ static bool cmd_set_operation_execute if ( modf == NULL ) return FALSE; } - - if ( !ext_variables_opr_variable_read(renv, address, &storage, &var_index) ) - return FALSE; - - if ( !sieve_opr_string_read(renv, address, &value) ) - return FALSE; sieve_variable_assign(storage, var_index, value); diff --git a/src/lib-sieve/plugins/variables/variables.sieve b/src/lib-sieve/plugins/variables/variables.sieve index 450a5e685..c628ce36a 100644 --- a/src/lib-sieve/plugins/variables/variables.sieve +++ b/src/lib-sieve/plugins/variables/variables.sieve @@ -1,8 +1,8 @@ require "variables"; require "fileinto"; -set :upper "foo" "foosome"; -set :lower "bar" "bareable"; +set :length :upper "foo" "foosome"; +set :quotewildcard :lower "bar" "bareable"; #fileinto "${foo}.${bar}"; -- GitLab