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