dovecot-2.1-pigeonhole: lib-sieve: adjusted code fetch api for h...
pigeonhole at rename-it.nl
pigeonhole at rename-it.nl
Tue Dec 20 21:05:26 EET 2011
details: http://hg.rename-it.nl/dovecot-2.1-pigeonhole/rev/35639e4925a7
changeset: 1584:35639e4925a7
user: Stephan Bosch <stephan at rename-it.nl>
date: Tue Dec 20 20:05:21 2011 +0100
description:
lib-sieve: adjusted code fetch api for handling omitted operands better.
Removes quite a bit of duplicated source code.
diffstat:
src/lib-sieve/cmd-redirect.c | 4 +-
src/lib-sieve/ext-fileinto.c | 4 +-
src/lib-sieve/plugins/date/tst-date.c | 26 +-------
src/lib-sieve/plugins/editheader/cmd-deleteheader.c | 26 +-------
src/lib-sieve/plugins/imap4flags/tag-flags.c | 61 ++++++++------------
src/lib-sieve/sieve-code.c | 59 ++++++++++++++++++-
src/lib-sieve/sieve-code.h | 10 ++-
7 files changed, 98 insertions(+), 92 deletions(-)
diffs (truncated from 394 to 300 lines):
diff -r 66b7b1636c8c -r 35639e4925a7 src/lib-sieve/cmd-redirect.c
--- a/src/lib-sieve/cmd-redirect.c Sat Dec 17 18:58:48 2011 +0100
+++ b/src/lib-sieve/cmd-redirect.c Tue Dec 20 20:05:21 2011 +0100
@@ -209,8 +209,8 @@
return ret;
/* Read the address */
- if ( (ret=sieve_opr_string_read_ex(renv, address, "address", &redirect,
- &literal_address)) <= 0 )
+ if ( (ret=sieve_opr_string_read_ex
+ (renv, address, "address", FALSE, &redirect, &literal_address)) <= 0 )
return ret;
/*
diff -r 66b7b1636c8c -r 35639e4925a7 src/lib-sieve/ext-fileinto.c
--- a/src/lib-sieve/ext-fileinto.c Sat Dec 17 18:58:48 2011 +0100
+++ b/src/lib-sieve/ext-fileinto.c Tue Dec 20 20:05:21 2011 +0100
@@ -183,8 +183,8 @@
return ret;
/* Folder operand */
- if ( (ret=sieve_opr_string_read_ex(renv, address, "folder", &folder,
- &folder_literal)) <= 0 )
+ if ( (ret=sieve_opr_string_read_ex
+ (renv, address, "folder", FALSE, &folder, &folder_literal)) <= 0 )
return ret;
/*
diff -r 66b7b1636c8c -r 35639e4925a7 src/lib-sieve/plugins/date/tst-date.c
--- a/src/lib-sieve/plugins/date/tst-date.c Sat Dec 17 18:58:48 2011 +0100
+++ b/src/lib-sieve/plugins/date/tst-date.c Tue Dec 20 20:05:21 2011 +0100
@@ -331,7 +331,6 @@
{
int opt_code = 0;
const struct sieve_operation *op = denv->oprtn;
- struct sieve_operand operand;
sieve_code_dumpf(denv, "%s", sieve_operation_mnemonic(op));
sieve_code_descend(denv);
@@ -347,18 +346,8 @@
switch ( opt_code ) {
case OPT_DATE_ZONE:
- if ( !sieve_operand_read(denv->sblock, address, "zone", &operand) ) {
- sieve_code_dumpf(denv, "ERROR: INVALID OPERAND");
+ if ( !sieve_opr_string_dump_ex(denv, address, "zone", "ORIGINAL") )
return FALSE;
- }
-
- if ( sieve_operand_is_omitted(&operand) ) {
- sieve_code_dumpf(denv, "zone: ORIGINAL");
- } else {
- if ( !sieve_opr_string_dump_data
- (denv, &operand, address, "zone") )
- return FALSE;
- }
break;
default:
return FALSE;
@@ -388,7 +377,6 @@
SIEVE_MATCH_TYPE_DEFAULT(is_match_type);
struct sieve_comparator cmp =
SIEVE_COMPARATOR_DEFAULT(i_ascii_casemap_comparator);
- struct sieve_operand oprnd;
string_t *date_part = NULL, *zone = NULL;
struct sieve_stringlist *hdr_list = NULL, *hdr_value_list;
struct sieve_stringlist *value_list, *key_list;
@@ -408,18 +396,10 @@
switch ( opt_code ) {
case OPT_DATE_ZONE:
- if ( (ret=sieve_operand_runtime_read(renv, address, "zone", &oprnd))
- <= 0 )
+ if ( (ret=sieve_opr_string_read_ex
+ (renv, address, "zone", TRUE, &zone, &zone_literal)) <= 0 )
return ret;
- if ( !sieve_operand_is_omitted(&oprnd) ) {
- if ( (ret=sieve_opr_string_read_data
- (renv, &oprnd, address, "zone", &zone)) <= 0 )
- return ret;
-
- zone_literal = sieve_operand_is_string_literal(&oprnd);
- }
-
zone_specified = TRUE;
break;
default:
diff -r 66b7b1636c8c -r 35639e4925a7 src/lib-sieve/plugins/editheader/cmd-deleteheader.c
--- a/src/lib-sieve/plugins/editheader/cmd-deleteheader.c Sat Dec 17 18:58:48 2011 +0100
+++ b/src/lib-sieve/plugins/editheader/cmd-deleteheader.c Tue Dec 20 20:05:21 2011 +0100
@@ -316,7 +316,6 @@
static bool cmd_deleteheader_operation_dump
(const struct sieve_dumptime_env *denv, sieve_size_t *address)
{
- struct sieve_operand oprnd;
int opt_code = 0;
sieve_code_dumpf(denv, "DELETEHEADER");
@@ -347,19 +346,7 @@
if ( !sieve_opr_string_dump(denv, address, "field name") )
return FALSE;
- sieve_code_mark(denv);
-
- if ( !sieve_operand_read
- (denv->sblock, address, "value patterns", &oprnd) ) {
- sieve_code_dumpf(denv, "ERROR: INVALID OPERAND");
- return FALSE;
- }
-
- if ( sieve_operand_is_omitted(&oprnd) )
- return TRUE;
-
- return sieve_opr_stringlist_dump_data
- (denv, &oprnd, address, "value patterns");
+ return sieve_opr_stringlist_dump_ex(denv, address, "value patterns", "");
}
/*
@@ -371,7 +358,6 @@
{
const struct sieve_extension *this_ext = renv->oprtn->ext;
int opt_code = 0;
- struct sieve_operand oprnd;
struct sieve_comparator cmp =
SIEVE_COMPARATOR_DEFAULT(i_ascii_casemap_comparator);
struct sieve_match_type mcht =
@@ -423,13 +409,9 @@
<= 0 )
return ret;
- /* Read value-patterns */
- if ( (ret=sieve_operand_runtime_read
- (renv, address, "value-patterns", &oprnd)) <= 0 )
- return ret;
-
- if ( !sieve_operand_is_omitted(&oprnd) && (ret=sieve_opr_stringlist_read_data
- (renv, &oprnd, address, "value-patterns", &vpattern_list)) <= 0 )
+ /* Read value-patterns */
+ if ( (ret=sieve_opr_stringlist_read_ex
+ (renv, address, "value-patterns", TRUE, &vpattern_list)) <= 0 )
return ret;
/*
diff -r 66b7b1636c8c -r 35639e4925a7 src/lib-sieve/plugins/imap4flags/tag-flags.c
--- a/src/lib-sieve/plugins/imap4flags/tag-flags.c Sat Dec 17 18:58:48 2011 +0100
+++ b/src/lib-sieve/plugins/imap4flags/tag-flags.c Tue Dec 20 20:05:21 2011 +0100
@@ -197,19 +197,7 @@
(const struct sieve_side_effect *seffect ATTR_UNUSED,
const struct sieve_dumptime_env *denv, sieve_size_t *address)
{
- struct sieve_operand oprnd;
-
- if ( !sieve_operand_read(denv->sblock, address, "flags", &oprnd) ) {
- sieve_code_dumpf(denv, "ERROR: INVALID OPERAND");
- return FALSE;
- }
-
- if ( sieve_operand_is_omitted(&oprnd) ) {
- sieve_code_dumpf(denv, "flags: INTERNAL");
- return TRUE;
- }
-
- return sieve_opr_stringlist_dump_data(denv, &oprnd, address, "flags");
+ return sieve_opr_stringlist_dump_ex(denv, address, "flags", "INTERNAL");
}
static struct seff_flags_context *seff_flags_get_implicit_context
@@ -252,43 +240,30 @@
return ctx;
}
-static int seff_flags_read_context
+static int seff_flags_do_read_context
(const struct sieve_side_effect *seffect,
const struct sieve_runtime_env *renv, sieve_size_t *address,
void **se_context)
{
- struct sieve_operand oprnd;
pool_t pool = sieve_result_pool(renv->result);
struct seff_flags_context *ctx;
string_t *flags_item;
- struct sieve_stringlist *flag_list;
- int ret;
+ struct sieve_stringlist *flag_list = NULL;
+ int ret;
+
+ if ( (ret=sieve_opr_stringlist_read_ex
+ (renv, address, "flags", TRUE, &flag_list)) <= 0 )
+ return ret;
- t_push();
-
- /* Check whether explicit flag list operand is present */
- if ( (ret=sieve_operand_runtime_read(renv, address, "flags", &oprnd)) <= 0 ) {
- t_pop();
- return ret;
- }
-
- if ( sieve_operand_is_omitted(&oprnd) ) {
+ if ( flag_list == NULL ) {
/* Flag list is omitted, use current value of internal
* variable to construct side effect context.
*/
*se_context = seff_flags_get_implicit_context
(SIEVE_OBJECT_EXTENSION(seffect), renv->result);
- t_pop();
return SIEVE_EXEC_OK;
}
-
- /* Read flag-list */
- if ( (ret=sieve_opr_stringlist_read_data
- (renv, &oprnd, address, NULL, &flag_list)) <= 0 ) {
- t_pop();
- return ret;
- }
-
+
ctx = p_new(pool, struct seff_flags_context, 1);
p_array_init(&ctx->keywords, pool, 2);
@@ -325,12 +300,24 @@
}
*se_context = (void *) ctx;
-
- t_pop();
return SIEVE_EXEC_OK;
}
+static int seff_flags_read_context
+(const struct sieve_side_effect *seffect,
+ const struct sieve_runtime_env *renv, sieve_size_t *address,
+ void **se_context)
+{
+ int ret;
+
+ T_BEGIN {
+ ret = seff_flags_do_read_context(seffect, renv, address, se_context);
+ } T_END;
+
+ return ret;
+}
+
/* Result verification */
static int seff_flags_merge
diff -r 66b7b1636c8c -r 35639e4925a7 src/lib-sieve/sieve-code.c
--- a/src/lib-sieve/sieve-code.c Sat Dec 17 18:58:48 2011 +0100
+++ b/src/lib-sieve/sieve-code.c Tue Dec 20 20:05:21 2011 +0100
@@ -536,7 +536,7 @@
bool sieve_opr_string_dump_ex
(const struct sieve_dumptime_env *denv, sieve_size_t *address,
- const char *field_name, bool *literal_r)
+ const char *field_name, const char *omitted_value)
{
struct sieve_operand operand;
@@ -546,7 +546,11 @@
return FALSE;
}
- *literal_r = sieve_operand_is_string_literal(&operand);
+ if ( omitted_value != NULL && sieve_operand_is_omitted(&operand) ) {
+ if ( *omitted_value != '\0' )
+ sieve_code_dumpf(denv, "%s: %s", field_name, omitted_value);
+ return TRUE;
+ }
return sieve_opr_string_dump_data(denv, &operand, address, field_name);
}
@@ -592,7 +596,7 @@
int sieve_opr_string_read_ex
(const struct sieve_runtime_env *renv, sieve_size_t *address,
- const char *field_name, string_t **str_r, bool *literal_r)
+ const char *field_name, bool optional, string_t **str_r, bool *literal_r)
{
struct sieve_operand operand;
int ret;
@@ -601,7 +605,13 @@
<= 0 )
return ret;
- *literal_r = sieve_operand_is_string_literal(&operand);
+ if ( optional && sieve_operand_is_omitted(&operand) ) {
+ *str_r = NULL;
+ return TRUE;
+ }
+
+ if ( literal_r != NULL )
+ *literal_r = sieve_operand_is_string_literal(&operand);
return sieve_opr_string_read_data(renv, &operand, address, field_name, str_r);
}
@@ -732,6 +742,27 @@
return sieve_opr_stringlist_dump_data(denv, &operand, address, field_name);
More information about the dovecot-cvs
mailing list