From 5d7ae35629f3c2ffa4c78a736d3a571f90880c3f Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Tue, 9 Sep 2008 21:52:49 +0200
Subject: [PATCH] Improved byte code dumping to be more readable.

---
 TODO                                          |   3 +-
 src/lib-sieve/cmd-redirect.c                  |   2 +-
 src/lib-sieve/ext-envelope.c                  |   4 +-
 src/lib-sieve/ext-fileinto.c                  |   6 +-
 src/lib-sieve/ext-reject.c                    |   2 +-
 src/lib-sieve/mcht-is.c                       |   2 -
 src/lib-sieve/plugins/body/tst-body.c         |   4 +-
 .../plugins/imapflags/ext-imapflags-common.c  |   9 +-
 src/lib-sieve/plugins/imapflags/tag-flags.c   |   2 +-
 src/lib-sieve/plugins/imapflags/tst-hasflag.c |   4 +-
 src/lib-sieve/plugins/include/cmd-include.c   |   2 +-
 src/lib-sieve/plugins/vacation/cmd-vacation.c |  15 ++-
 src/lib-sieve/plugins/variables/cmd-set.c     |   4 +-
 .../plugins/variables/ext-variables-common.c  |   2 +-
 .../variables/ext-variables-modifiers.c       |   2 +-
 .../variables/ext-variables-operands.c        |  58 ++++++---
 src/lib-sieve/plugins/variables/tst-string.c  |   4 +-
 src/lib-sieve/sieve-address-parts.c           |   2 +-
 src/lib-sieve/sieve-code-dumper.c             |   2 +-
 src/lib-sieve/sieve-code.c                    | 115 ++++++++++--------
 src/lib-sieve/sieve-code.h                    |  35 +++---
 src/lib-sieve/sieve-comparators.c             |   2 +-
 src/lib-sieve/sieve-match-types.c             |   5 +-
 src/lib-sieve/tst-address.c                   |   4 +-
 src/lib-sieve/tst-exists.c                    |   2 +-
 src/lib-sieve/tst-header.c                    |   4 +-
 src/lib-sieve/tst-size.c                      |   2 +-
 src/testsuite/cmd-test-fail.c                 |   4 +-
 src/testsuite/cmd-test-set.c                  |   4 +-
 src/testsuite/cmd-test.c                      |   2 +-
 src/testsuite/testsuite-objects.c             |   2 +-
 src/testsuite/tst-test-compile.c              |   2 +-
 src/testsuite/tst-test-error.c                |   4 +-
 33 files changed, 173 insertions(+), 143 deletions(-)

diff --git a/TODO b/TODO
index e9fb4e4d8..6ae0e6af0 100644
--- a/TODO
+++ b/TODO
@@ -2,10 +2,9 @@ Next (in order of descending priority/precedence):
 
 * Finish the test suite for the base functionality
 * Improve debugging and error handling:
-	- Improve byte code dumping and trace functionality to be a little more 
-  	  user-friendly
 	- Improve argument errors
 * Make sure cmusieve can be replaced seamlessly with the new plugin.
+	- Add simple log rotation to script error log.
 * Fix/Report issues listed in 'doc/rfc/RFC Controversy.txt'
 
 * ## MAKE A FIRST RELEASE (0.1.x) ##
diff --git a/src/lib-sieve/cmd-redirect.c b/src/lib-sieve/cmd-redirect.c
index 434f4434d..3adfee6c2 100644
--- a/src/lib-sieve/cmd-redirect.c
+++ b/src/lib-sieve/cmd-redirect.c
@@ -180,7 +180,7 @@ static bool cmd_redirect_operation_dump
 	if ( !sieve_code_dumper_print_optional_operands(denv, address) )
 		return FALSE;
 
-	return sieve_opr_string_dump(denv, address);
+	return sieve_opr_string_dump(denv, address, "reason");
 }
 
 /*
diff --git a/src/lib-sieve/ext-envelope.c b/src/lib-sieve/ext-envelope.c
index 17705faa9..7abd09a80 100644
--- a/src/lib-sieve/ext-envelope.c
+++ b/src/lib-sieve/ext-envelope.c
@@ -316,8 +316,8 @@ static bool ext_envelope_operation_dump
 		return FALSE;
 
 	return
-		sieve_opr_stringlist_dump(denv, address) &&
-		sieve_opr_stringlist_dump(denv, address);
+		sieve_opr_stringlist_dump(denv, address, "envelope part") &&
+		sieve_opr_stringlist_dump(denv, address, "key list");
 }
 
 /*
diff --git a/src/lib-sieve/ext-fileinto.c b/src/lib-sieve/ext-fileinto.c
index 3e8ef2f4e..9d37b5daa 100644
--- a/src/lib-sieve/ext-fileinto.c
+++ b/src/lib-sieve/ext-fileinto.c
@@ -160,11 +160,7 @@ static bool ext_fileinto_operation_dump
 		return FALSE;
 	}
 
-	if ( !sieve_opr_string_dump(denv, address) ) {
-		return FALSE;
-	}
-	
-	return TRUE;
+	return sieve_opr_string_dump(denv, address, "folder");
 }
 
 /*
diff --git a/src/lib-sieve/ext-reject.c b/src/lib-sieve/ext-reject.c
index 0dd89812b..70b2c0361 100644
--- a/src/lib-sieve/ext-reject.c
+++ b/src/lib-sieve/ext-reject.c
@@ -200,7 +200,7 @@ static bool ext_reject_operation_dump
         return FALSE;
 	
 	return
-		sieve_opr_string_dump(denv, address);
+		sieve_opr_string_dump(denv, address, "reason");
 }
 
 /*
diff --git a/src/lib-sieve/mcht-is.c b/src/lib-sieve/mcht-is.c
index ecba1e8fa..ddecb7ccf 100644
--- a/src/lib-sieve/mcht-is.c
+++ b/src/lib-sieve/mcht-is.c
@@ -45,8 +45,6 @@ static int mcht_is_match
 	if ( (val == NULL || val_size == 0) ) 
 		return ( key_size == 0 );
 
-	printf ("VAL '%s' KEY '%s'\n", val, key);
-	
 	if ( mctx->comparator->compare != NULL )
 		return (mctx->comparator->compare(mctx->comparator, 
 			val, val_size, key, key_size) == 0);
diff --git a/src/lib-sieve/plugins/body/tst-body.c b/src/lib-sieve/plugins/body/tst-body.c
index 4730ba5b2..9b3c1ed57 100644
--- a/src/lib-sieve/plugins/body/tst-body.c
+++ b/src/lib-sieve/plugins/body/tst-body.c
@@ -285,7 +285,7 @@ static bool ext_body_operation_dump
 				sieve_code_dumpf(denv, "BODY-TRANSFORM: CONTENT");
 				
 				sieve_code_descend(denv);
-				if ( !sieve_opr_stringlist_dump(denv, address) )
+				if ( !sieve_opr_stringlist_dump(denv, address, "content types") )
 					return FALSE;
 				sieve_code_ascend(denv);
 				break;
@@ -298,7 +298,7 @@ static bool ext_body_operation_dump
 		}
 	} while ( opt_code != SIEVE_MATCH_OPT_END );
 
-	return sieve_opr_stringlist_dump(denv, address);
+	return sieve_opr_stringlist_dump(denv, address, "key list");
 }
 
 /*
diff --git a/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c b/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
index c88296ddd..bf45d62ae 100644
--- a/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
+++ b/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
@@ -148,12 +148,15 @@ bool ext_imapflags_command_operands_dump
 
 	if ( sieve_operand_is_variable(operand) ) {	
 		return 
-			sieve_opr_string_dump_data(denv, operand, address) &&
-			sieve_opr_stringlist_dump(denv, address);
+			sieve_opr_string_dump_data(denv, operand, address, 
+				"variable name") &&
+			sieve_opr_stringlist_dump(denv, address, 
+				"list of flags");
 	}
 	
 	return 
-			sieve_opr_stringlist_dump_data(denv, operand, address);
+		sieve_opr_stringlist_dump_data(denv, operand, address,
+			"list of flags");
 }
 
 bool ext_imapflags_command_operation_dump
diff --git a/src/lib-sieve/plugins/imapflags/tag-flags.c b/src/lib-sieve/plugins/imapflags/tag-flags.c
index 5eac55963..db8cab61e 100644
--- a/src/lib-sieve/plugins/imapflags/tag-flags.c
+++ b/src/lib-sieve/plugins/imapflags/tag-flags.c
@@ -160,7 +160,7 @@ static bool seff_flags_dump_context
 (const struct sieve_side_effect *seffect ATTR_UNUSED, 
 	const struct sieve_dumptime_env *denv, sieve_size_t *address)
 {
-	return sieve_opr_stringlist_dump(denv, address);
+	return sieve_opr_stringlist_dump(denv, address, "flags");
 }
 
 static bool seff_flags_read_context
diff --git a/src/lib-sieve/plugins/imapflags/tst-hasflag.c b/src/lib-sieve/plugins/imapflags/tst-hasflag.c
index 7c4c2ad33..047913123 100644
--- a/src/lib-sieve/plugins/imapflags/tst-hasflag.c
+++ b/src/lib-sieve/plugins/imapflags/tst-hasflag.c
@@ -148,7 +148,7 @@ static bool tst_hasflag_operation_dump
 		case SIEVE_MATCH_OPT_END:
 			break;
 		case OPT_VARIABLES:
-			sieve_opr_stringlist_dump(denv, address);
+			sieve_opr_stringlist_dump(denv, address, "variables");
 			break;
 		default:
 			return FALSE;
@@ -156,7 +156,7 @@ static bool tst_hasflag_operation_dump
 	} while ( opt_code != SIEVE_MATCH_OPT_END );
 			
 	return 
-			sieve_opr_stringlist_dump(denv, address);
+		sieve_opr_stringlist_dump(denv, address, "list of flags");
 }
 
 /*
diff --git a/src/lib-sieve/plugins/include/cmd-include.c b/src/lib-sieve/plugins/include/cmd-include.c
index e150a4422..f76bf90a4 100644
--- a/src/lib-sieve/plugins/include/cmd-include.c
+++ b/src/lib-sieve/plugins/include/cmd-include.c
@@ -264,7 +264,7 @@ static bool opc_include_dump
 		return FALSE;
 		
 	sieve_code_descend(denv);
-	sieve_code_dumpf(denv, "SCRIPT: %s [ID: %d, BLOCK: %d]", 
+	sieve_code_dumpf(denv, "script: %s [ID: %d, BLOCK: %d]", 
 		sieve_script_filename(included->script), include_id, included->block_id);
 	 
 	return TRUE;
diff --git a/src/lib-sieve/plugins/vacation/cmd-vacation.c b/src/lib-sieve/plugins/vacation/cmd-vacation.c
index 22d1e3abd..5ee5257fa 100644
--- a/src/lib-sieve/plugins/vacation/cmd-vacation.c
+++ b/src/lib-sieve/plugins/vacation/cmd-vacation.c
@@ -499,20 +499,23 @@ static bool ext_vacation_operation_dump
 			case 0:
 				break;
 			case OPT_DAYS:
-				if ( !sieve_opr_number_dump(denv, address) )
+				if ( !sieve_opr_number_dump(denv, address, "days") )
 					return FALSE;
 				break;
 			case OPT_SUBJECT:
+				if ( !sieve_opr_string_dump(denv, address, "subject") )
+					return FALSE;
+				break;
 			case OPT_FROM:
-				if ( !sieve_opr_string_dump(denv, address) )
+				if ( !sieve_opr_string_dump(denv, address, "from") )
 					return FALSE;
 				break;
 			case OPT_ADDRESSES:
-				if ( !sieve_opr_stringlist_dump(denv, address) )
+				if ( !sieve_opr_stringlist_dump(denv, address, "addresses") )
 					return FALSE;
 				break;
 			case OPT_MIME:
-				sieve_code_dumpf(denv, "MIME");	
+				sieve_code_dumpf(denv, "mime");	
 				break;
 			
 			default:
@@ -523,8 +526,8 @@ static bool ext_vacation_operation_dump
 	
 	/* Dump reason and handle operands */
 	return 
-		sieve_opr_string_dump(denv, address) &&
-		sieve_opr_string_dump(denv, address);
+		sieve_opr_string_dump(denv, address, "reason") &&
+		sieve_opr_string_dump(denv, address, "handle");
 }
 
 /* 
diff --git a/src/lib-sieve/plugins/variables/cmd-set.c b/src/lib-sieve/plugins/variables/cmd-set.c
index ade0eb358..084d4bc05 100644
--- a/src/lib-sieve/plugins/variables/cmd-set.c
+++ b/src/lib-sieve/plugins/variables/cmd-set.c
@@ -251,8 +251,8 @@ static bool cmd_set_operation_dump
 	sieve_code_descend(denv);
 	
 	/* Print both variable name and string value */
-	if ( !sieve_opr_string_dump(denv, address) ||
-		!sieve_opr_string_dump(denv, address) )
+	if ( !sieve_opr_string_dump(denv, address, "variable") ||
+		!sieve_opr_string_dump(denv, address, "value") )
 		return FALSE;
 	
 	/* Read the number of applied modifiers we need to read */
diff --git a/src/lib-sieve/plugins/variables/ext-variables-common.c b/src/lib-sieve/plugins/variables/ext-variables-common.c
index 9343f417a..f54a132e7 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-common.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-common.c
@@ -447,7 +447,7 @@ bool ext_variables_code_dump
 	if ( !sieve_binary_read_offset(denv->sbin, address, &end_offset) )
 		return FALSE;
 	
-	sieve_code_dumpf(denv, "SCOPE (size: %d, end: %08x)", 
+	sieve_code_dumpf(denv, "SCOPE [%d] (end: %08x)", 
 		scope_size, pc + end_offset);
 	
 	/* Read global variable scope */
diff --git a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
index f56341aea..9713122e9 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
@@ -85,7 +85,7 @@ void ext_variables_register_core_modifiers
  */
  
 const struct sieve_operand_class ext_variables_modifier_operand_class = 
-	{ "MODIFIER" };
+	{ "modifier" };
 	
 static const struct sieve_extension_obj_registry core_modifiers =
 	SIEVE_VARIABLES_DEFINE_MODIFIERS(ext_variables_core_modifiers);
diff --git a/src/lib-sieve/plugins/variables/ext-variables-operands.c b/src/lib-sieve/plugins/variables/ext-variables-operands.c
index 2a123a90e..c551bcd0d 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-operands.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-operands.c
@@ -29,7 +29,8 @@
 static bool opr_variable_read_value
 	(const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str);
 static bool opr_variable_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address, 
+		const char *field_name);
 
 const struct sieve_opr_string_interface variable_interface = { 
 	opr_variable_dump,
@@ -61,7 +62,8 @@ void ext_variables_opr_variable_emit
 }
 
 static bool opr_variable_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	sieve_size_t index = 0;
 	const struct sieve_extension *ext;
@@ -73,15 +75,24 @@ static bool opr_variable_dump
 	if ( !sieve_binary_read_integer(denv->sbin, address, &index) )
 		return FALSE;
 		
-	if ( ext == NULL )
-		sieve_code_dumpf(denv, "VAR: %ld", (long) index);
-	else
-		sieve_code_dumpf(denv, "VAR: [%d:%s] %ld", *ext->id, ext->name, (long) index);
+	if ( ext == NULL ) {
+		if ( field_name != NULL ) 
+			sieve_code_dumpf(denv, "%s: VAR %ld", field_name, (long) index);
+		else
+			sieve_code_dumpf(denv, "VAR %ld", (long) index);
+	} else {
+		if ( field_name != NULL ) 
+			sieve_code_dumpf(denv, "%s: VAR [%s] %ld", 
+				field_name, ext->name, (long) index);
+		else
+			sieve_code_dumpf(denv, "VAR [%s] %ld", 
+				ext->name, (long) index);
+	}
 	return TRUE;
 }
 
 static bool opr_variable_read_value
-  (const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str)
+(const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str)
 { 
 	const struct sieve_extension *ext;
 	unsigned int code = 1; /* Initially set to offset value */
@@ -155,7 +166,8 @@ bool sieve_variable_operand_read
 static bool opr_match_value_read
 	(const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str);
 static bool opr_match_value_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address, 
+		const char *field_name);
 
 const struct sieve_opr_string_interface match_value_interface = { 
 	opr_match_value_dump,
@@ -171,19 +183,23 @@ const struct sieve_operand match_value_operand = {
 };	
 
 void ext_variables_opr_match_value_emit
-	(struct sieve_binary *sbin, unsigned int index) 
+(struct sieve_binary *sbin, unsigned int index) 
 {
 	(void) sieve_operand_emit_code(sbin, &match_value_operand);
 	(void) sieve_binary_emit_integer(sbin, index);
 }
 
 static bool opr_match_value_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	sieve_size_t index = 0;
 	
 	if (sieve_binary_read_integer(denv->sbin, address, &index) ) {
-		sieve_code_dumpf(denv, "MVALUE: %ld", (long) index);
+		if ( field_name != NULL )
+			sieve_code_dumpf(denv, "%s: MATCHVAL %ld", field_name, (long) index);
+		else
+			sieve_code_dumpf(denv, "MATCHVAL %ld", (long) index);
 
 		return TRUE;
 	}
@@ -192,7 +208,7 @@ static bool opr_match_value_dump
 }
 
 static bool opr_match_value_read
-  (const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str)
+(const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str)
 { 
 	sieve_size_t index = 0;
 			
@@ -221,7 +237,8 @@ static bool opr_match_value_read
 static bool opr_variable_string_read
 	(const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str);
 static bool opr_variable_string_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+		const char *field_name);
 
 const struct sieve_opr_string_interface variable_string_interface = { 
 	opr_variable_string_dump,
@@ -237,14 +254,15 @@ const struct sieve_operand variable_string_operand = {
 };	
 
 void ext_variables_opr_variable_string_emit
-	(struct sieve_binary *sbin, unsigned int elements) 
+(struct sieve_binary *sbin, unsigned int elements) 
 {
 	(void) sieve_operand_emit_code(sbin, &variable_string_operand);
 	(void) sieve_binary_emit_integer(sbin, elements);
 }
 
 static bool opr_variable_string_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	sieve_size_t elements = 0;
 	unsigned int i;
@@ -252,11 +270,15 @@ static bool opr_variable_string_dump
 	if (!sieve_binary_read_integer(denv->sbin, address, &elements) )
 		return FALSE;
 	
-	sieve_code_dumpf(denv, "VARSTR [%ld]:", (long) elements);
+	if ( field_name != NULL ) 
+		sieve_code_dumpf(denv, "%s: VARSTR [%ld]:", 
+			field_name, (long) elements);
+	else
+		sieve_code_dumpf(denv, "VARSTR [%ld]:", (long) elements);
 
 	sieve_code_descend(denv);
 	for ( i = 0; i < (unsigned int) elements; i++ ) {
-		sieve_opr_string_dump(denv, address);
+		sieve_opr_string_dump(denv, address, NULL);
 	}
 	sieve_code_ascend(denv);
 	
@@ -264,7 +286,7 @@ static bool opr_variable_string_dump
 }
 
 static bool opr_variable_string_read
-  (const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str)
+(const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str)
 { 
 	sieve_size_t elements = 0;
 	unsigned int i;
diff --git a/src/lib-sieve/plugins/variables/tst-string.c b/src/lib-sieve/plugins/variables/tst-string.c
index 149c7c752..4b7f78086 100644
--- a/src/lib-sieve/plugins/variables/tst-string.c
+++ b/src/lib-sieve/plugins/variables/tst-string.c
@@ -154,8 +154,8 @@ static bool tst_string_operation_dump
 		return FALSE;
 		
 	return
-		sieve_opr_stringlist_dump(denv, address) &&
-		sieve_opr_stringlist_dump(denv, address);
+		sieve_opr_stringlist_dump(denv, address, "source") &&
+		sieve_opr_stringlist_dump(denv, address, "key list");
 }
 
 /* 
diff --git a/src/lib-sieve/sieve-address-parts.c b/src/lib-sieve/sieve-address-parts.c
index d4206dd92..6cac837ee 100644
--- a/src/lib-sieve/sieve-address-parts.c
+++ b/src/lib-sieve/sieve-address-parts.c
@@ -195,7 +195,7 @@ static bool tag_address_part_generate
  */
  
 struct sieve_operand_class sieve_address_part_operand_class = 
-	{ "ADDRESS-PART" };
+	{ "address part" };
 
 static const struct sieve_extension_obj_registry core_address_parts =
 	SIEVE_EXT_DEFINE_MATCH_TYPES(sieve_core_address_parts);
diff --git a/src/lib-sieve/sieve-code-dumper.c b/src/lib-sieve/sieve-code-dumper.c
index 5b16d0175..ec693a05e 100644
--- a/src/lib-sieve/sieve-code-dumper.c
+++ b/src/lib-sieve/sieve-code-dumper.c
@@ -181,7 +181,7 @@ void sieve_code_dumper_run(struct sieve_code_dumper *dumper)
 	if ( sieve_binary_read_integer(sbin, &dumper->pc, &ext_count) ) {
 		unsigned int i;
 		
-		sieve_code_dumpf(denv, "EXTENSIONS (count: %d):", ext_count);
+		sieve_code_dumpf(denv, "EXTENSIONS [%d]:", ext_count);
 		sieve_code_descend(denv);
 		
 		for ( i = 0; i < ext_count; i++ ) {
diff --git a/src/lib-sieve/sieve-code.c b/src/lib-sieve/sieve-code.c
index 164bb20fc..a77441583 100644
--- a/src/lib-sieve/sieve-code.c
+++ b/src/lib-sieve/sieve-code.c
@@ -123,18 +123,23 @@ bool sieve_coded_stringlist_read_all
 
 static bool sieve_coded_stringlist_dump
 (const struct sieve_dumptime_env *denv, sieve_size_t *address, 
-	sieve_size_t length, sieve_size_t end)
+	sieve_size_t length, sieve_size_t end, const char *field_name)
 {
 	unsigned int i;
 	
 	if ( end > sieve_binary_get_code_size(denv->sbin) ) 
   		return FALSE;
     
-	sieve_code_dumpf(denv, "STRLIST [%d] (END %08x)", length, end);
+  if ( field_name != NULL )
+		sieve_code_dumpf(denv, "%s: STRLIST [%d] (end: %08x)", 
+			field_name, length, end);
+	else
+		sieve_code_dumpf(denv, "STRLIST [%d] (end: %08x)", length, end);
+	
 	sieve_code_descend(denv);
 	
 	for ( i = 0; i < length; i++ ) {
-		if ( !sieve_opr_string_dump(denv, address) ) 
+		if ( !sieve_opr_string_dump(denv, address, NULL) ) 
 			return FALSE;
 
 		if ( *address > end ) 
@@ -282,7 +287,8 @@ bool sieve_operand_optional_read
 /* Number */
 
 static bool opr_number_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+		const char *field_name);
 static bool opr_number_read
 	(const struct sieve_runtime_env *renv, sieve_size_t *address, 
 		sieve_size_t *number);
@@ -305,7 +311,8 @@ const struct sieve_operand number_operand = {
 /* String */
 
 static bool opr_string_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+		const char *field_name);
 static bool opr_string_read
 	(const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str);
 
@@ -327,7 +334,8 @@ const struct sieve_operand string_operand = {
 /* String List */
 
 static bool opr_stringlist_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+		const char *field_name);
 static struct sieve_coded_stringlist *opr_stringlist_read
 	(const struct sieve_runtime_env *renv, sieve_size_t *address);
 
@@ -360,7 +368,7 @@ void sieve_opr_number_emit(struct sieve_binary *sbin, sieve_size_t number)
 
 bool sieve_opr_number_dump_data
 (const struct sieve_dumptime_env *denv, const struct sieve_operand *operand,
-	sieve_size_t *address) 
+	sieve_size_t *address, const char *field_name) 
 {
 	const struct sieve_opr_number_interface *intf;
 
@@ -372,11 +380,12 @@ bool sieve_opr_number_dump_data
 	if ( intf->dump == NULL )
 		return FALSE;
 
-	return intf->dump(denv, address);  
+	return intf->dump(denv, address, field_name);  
 }
 
 bool sieve_opr_number_dump
-(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	const struct sieve_operand *operand;
 	
@@ -384,7 +393,7 @@ bool sieve_opr_number_dump
 	
 	operand = sieve_operand_read(denv->sbin, address);
 
-	return sieve_opr_number_dump_data(denv, operand, address);
+	return sieve_opr_number_dump_data(denv, operand, address, field_name);
 }
 
 bool sieve_opr_number_read_data
@@ -414,12 +423,16 @@ bool sieve_opr_number_read
 }
 
 static bool opr_number_dump
-(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	sieve_size_t number = 0;
 	
 	if (sieve_binary_read_integer(denv->sbin, address, &number) ) {
-		sieve_code_dumpf(denv, "NUM: %llu", (long long) number);
+		if ( field_name != NULL ) 
+			sieve_code_dumpf(denv, "%s: NUM %llu", field_name, (long long) number);
+		else
+			sieve_code_dumpf(denv, "NUM %llu", (long long) number);
 
 		return TRUE;
 	}
@@ -444,7 +457,7 @@ void sieve_opr_string_emit(struct sieve_binary *sbin, string_t *str)
 
 bool sieve_opr_string_dump_data
 (const struct sieve_dumptime_env *denv, const struct sieve_operand *operand,
-	sieve_size_t *address) 
+	sieve_size_t *address, const char *field_name) 
 {
 	const struct sieve_opr_string_interface *intf;
 	
@@ -456,22 +469,24 @@ bool sieve_opr_string_dump_data
 	if ( intf->dump == NULL ) 
 		return FALSE;
 
-	return intf->dump(denv, address);  
+	return intf->dump(denv, address, field_name);  
 }
 
 bool sieve_opr_string_dump
-(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	const struct sieve_operand *operand;
 	
 	sieve_code_mark(denv);
 	operand = sieve_operand_read(denv->sbin, address);
 
-	return sieve_opr_string_dump_data(denv, operand, address);
+	return sieve_opr_string_dump_data(denv, operand, address, field_name);
 }
 
 bool sieve_opr_string_dump_ex
-(const struct sieve_dumptime_env *denv, sieve_size_t *address, bool *literal)
+(const struct sieve_dumptime_env *denv, sieve_size_t *address, 
+	const char *field_name, bool *literal)
 {
 	const struct sieve_operand *operand;
 	
@@ -480,7 +495,7 @@ bool sieve_opr_string_dump_ex
 
 	*literal = ( operand == &string_operand );	
 
-	return sieve_opr_string_dump_data(denv, operand, address);
+	return sieve_opr_string_dump_data(denv, operand, address, field_name);
 } 
 
 bool sieve_opr_string_read_data
@@ -520,23 +535,34 @@ bool sieve_opr_string_read_ex
 }
 
 static void _dump_string
-(const struct sieve_dumptime_env *denv, string_t *str) 
-{
-	if ( str_len(str) > 80 )
-		sieve_code_dumpf(denv, "STR[%ld]: \"%s", 
-			(long) str_len(str), str_sanitize(str_c(str), 80));
-	else
-		sieve_code_dumpf(denv, "STR[%ld]: \"%s\"", 
-			(long) str_len(str), str_sanitize(str_c(str), 80));		
+(const struct sieve_dumptime_env *denv, string_t *str, 
+	const char *field_name) 
+{
+	if ( str_len(str) > 80 ) {
+		if ( field_name != NULL ) 
+			sieve_code_dumpf(denv, "%s: STR[%ld] \"%s", 
+				field_name, (long) str_len(str), str_sanitize(str_c(str), 80));
+		else
+			sieve_code_dumpf(denv, "STR[%ld] \"%s", 
+				(long) str_len(str), str_sanitize(str_c(str), 80));
+	} else {
+		if ( field_name != NULL )
+			sieve_code_dumpf(denv, "%s: STR[%ld] \"%s\"", 
+				field_name, (long) str_len(str), str_sanitize(str_c(str), 80));		
+		else
+			sieve_code_dumpf(denv, "STR[%ld] \"%s\"", 
+				(long) str_len(str), str_sanitize(str_c(str), 80));		
+	}
 }
 
 bool opr_string_dump
-(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	string_t *str; 
 	
 	if ( sieve_binary_read_string(denv->sbin, address, &str) ) {
-		_dump_string(denv, str);   		
+		_dump_string(denv, str, field_name);   		
 		
 		return TRUE;
 	}
@@ -584,7 +610,7 @@ void sieve_opr_stringlist_emit_end
 
 bool sieve_opr_stringlist_dump_data
 (const struct sieve_dumptime_env *denv, const struct sieve_operand *operand,
-	sieve_size_t *address) 
+	sieve_size_t *address, const char *field_name) 
 {
 	if ( operand == NULL )
 		return FALSE;
@@ -596,7 +622,7 @@ bool sieve_opr_stringlist_dump_data
 		if ( intf->dump == NULL )
 			return FALSE;
 
-		return intf->dump(denv, address); 
+		return intf->dump(denv, address, field_name); 
 	} else if ( operand->class == &string_class ) {
 		const struct sieve_opr_string_interface *intf =
 			(const struct sieve_opr_string_interface *) operand->interface; 
@@ -604,21 +630,22 @@ bool sieve_opr_stringlist_dump_data
 		if ( intf->dump == NULL ) 
 			return FALSE;
 
-		return intf->dump(denv, address);  
+		return intf->dump(denv, address, field_name);  
 	}
 	
 	return FALSE;
 }
 
 bool sieve_opr_stringlist_dump
-(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	const struct sieve_operand *operand;
 
 	sieve_code_mark(denv);
 	operand = sieve_operand_read(denv->sbin, address);
 
-	return sieve_opr_stringlist_dump_data(denv, operand, address);
+	return sieve_opr_stringlist_dump_data(denv, operand, address, field_name);
 }
 
 struct sieve_coded_stringlist *sieve_opr_stringlist_read_data
@@ -661,7 +688,8 @@ struct sieve_coded_stringlist *sieve_opr_stringlist_read
 }
 
 static bool opr_stringlist_dump
-(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address, 
+	const char *field_name) 
 {
 	sieve_size_t pc = *address;
 	sieve_size_t end; 
@@ -676,7 +704,7 @@ static bool opr_stringlist_dump
 	if ( !sieve_binary_read_integer(denv->sbin, address, &length) ) 
 		return FALSE;	
   	
-	return sieve_coded_stringlist_dump(denv, address, length, end); 
+	return sieve_coded_stringlist_dump(denv, address, length, end, field_name); 
 }
 
 static struct sieve_coded_stringlist *opr_stringlist_read
@@ -877,20 +905,3 @@ static int opc_jmpfalse_execute
 	
 	return sieve_interpreter_program_jump(renv->interp, !result);
 }	
-
-/*
- * Utility
- */
-
-/* Code dump for trivial operations */
-
-bool sieve_operation_string_dump
-(const struct sieve_operation *op,
-	const struct sieve_dumptime_env *denv, sieve_size_t *address)
-{
-	sieve_code_dumpf(denv, "%s", op->mnemonic);
-
-	return 
-		sieve_opr_string_dump(denv, address);
-}
-
diff --git a/src/lib-sieve/sieve-code.h b/src/lib-sieve/sieve-code.h
index 8f59a49fe..9b8c2ccf4 100644
--- a/src/lib-sieve/sieve-code.h
+++ b/src/lib-sieve/sieve-code.h
@@ -109,7 +109,8 @@ extern const unsigned int sieve_operand_count;
 
 struct sieve_opr_number_interface {
 	bool (*dump)	
-		(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+		(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+			const char *field_name);
 	bool (*read)
 	  (const struct sieve_runtime_env *renv, sieve_size_t *address, 
 	  	sieve_size_t *number);
@@ -117,7 +118,8 @@ struct sieve_opr_number_interface {
 
 struct sieve_opr_string_interface {
 	bool (*dump)
-		(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+		(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+			const char *field_name);
 	bool (*read)
 		(const struct sieve_runtime_env *renv, sieve_size_t *address, 
 			string_t **str);
@@ -125,7 +127,8 @@ struct sieve_opr_string_interface {
 
 struct sieve_opr_stringlist_interface {
 	bool (*dump)
-		(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+		(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+			const char *field_name);
 	struct sieve_coded_stringlist *(*read)
 		(const struct sieve_runtime_env *renv, sieve_size_t *address);
 };
@@ -139,9 +142,10 @@ struct sieve_opr_stringlist_interface {
 void sieve_opr_number_emit(struct sieve_binary *sbin, sieve_size_t number);
 bool sieve_opr_number_dump_data	
 	(const struct sieve_dumptime_env *denv, const struct sieve_operand *operand,
-		sieve_size_t *address); 
+		sieve_size_t *address, const char *field_name); 
 bool sieve_opr_number_dump	
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address); 
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+		const char *field_name); 
 bool sieve_opr_number_read_data
 	(const struct sieve_runtime_env *renv, const struct sieve_operand *operand,
 		sieve_size_t *address, sieve_size_t *number);
@@ -160,11 +164,13 @@ static inline bool sieve_operand_is_number
 void sieve_opr_string_emit(struct sieve_binary *sbin, string_t *str);
 bool sieve_opr_string_dump_data
 	(const struct sieve_dumptime_env *denv, const struct sieve_operand *operand,
-		sieve_size_t *address); 
+		sieve_size_t *address, const char *field_name); 
 bool sieve_opr_string_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address); 
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+		const char *field_name); 
 bool sieve_opr_string_dump_ex
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address, bool *literal); 
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address, 
+		const char *field_name, bool *literal); 
 bool sieve_opr_string_read_data
 	(const struct sieve_runtime_env *renv, const struct sieve_operand *operand,
 		sieve_size_t *address, string_t **str);
@@ -190,9 +196,10 @@ void sieve_opr_stringlist_emit_end
 	(struct sieve_binary *sbin, void *context);
 bool sieve_opr_stringlist_dump_data
 	(const struct sieve_dumptime_env *denv, const struct sieve_operand *operand, 
-		sieve_size_t *address);
+		sieve_size_t *address, const char *field_name);
 bool sieve_opr_stringlist_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+		const char *field_name);
 struct sieve_coded_stringlist *sieve_opr_stringlist_read_data
 	(const struct sieve_runtime_env *renv, const struct sieve_operand *operand, 
 		sieve_size_t op_address, sieve_size_t *address);
@@ -266,12 +273,4 @@ extern const struct sieve_operation sieve_jmpfalse_operation;
 extern const struct sieve_operation *sieve_operations[];
 extern const unsigned int sieve_operations_count;
 
-/*
- * Utilitity
- */
-
-bool sieve_operation_string_dump
-	(const struct sieve_operation *op,
-		const struct sieve_dumptime_env *denv, sieve_size_t *address);
-
 #endif
diff --git a/src/lib-sieve/sieve-comparators.c b/src/lib-sieve/sieve-comparators.c
index 4cb06c844..706b8ca64 100644
--- a/src/lib-sieve/sieve-comparators.c
+++ b/src/lib-sieve/sieve-comparators.c
@@ -236,7 +236,7 @@ const struct sieve_comparator *sieve_comparator_tag_get
  */
  
 const struct sieve_operand_class sieve_comparator_operand_class = 
-	{ "COMPARATOR" };
+	{ "comparator" };
 	
 static const struct sieve_extension_obj_registry core_comparators =
 	SIEVE_EXT_DEFINE_COMPARATORS(sieve_core_comparators);
diff --git a/src/lib-sieve/sieve-match-types.c b/src/lib-sieve/sieve-match-types.c
index 18d9b2dd1..23d8c65b3 100644
--- a/src/lib-sieve/sieve-match-types.c
+++ b/src/lib-sieve/sieve-match-types.c
@@ -221,8 +221,7 @@ static string_t *sieve_match_values_add_entry
 		
 	if ( mvalues->count >= array_count(&mvalues->values) ) {
 		entry = str_new(mvalues->pool, 64);
-		array_append(&mvalues->values, &entry, 1);
-	} else {
+		array_append(&mvalues->values, &entry, 1);	} else {
 		string_t * const *ep = array_idx(&mvalues->values, mvalues->count);
 		entry = *ep;
 		str_truncate(entry, 0);
@@ -481,7 +480,7 @@ bool sieve_match_type_validate
  */
  
 struct sieve_operand_class sieve_match_type_operand_class = 
-	{ "MATCH-TYPE" };
+	{ "match type" };
 	
 static const struct sieve_extension_obj_registry core_match_types =
 	SIEVE_EXT_DEFINE_MATCH_TYPES(sieve_core_match_types);
diff --git a/src/lib-sieve/tst-address.c b/src/lib-sieve/tst-address.c
index 4874c5a54..9a44da430 100644
--- a/src/lib-sieve/tst-address.c
+++ b/src/lib-sieve/tst-address.c
@@ -199,8 +199,8 @@ static bool tst_address_operation_dump
 		return FALSE;
 
 	return
-		sieve_opr_stringlist_dump(denv, address) &&
-		sieve_opr_stringlist_dump(denv, address);
+		sieve_opr_stringlist_dump(denv, address, "header list") &&
+		sieve_opr_stringlist_dump(denv, address, "key list");
 }
 
 /* 
diff --git a/src/lib-sieve/tst-exists.c b/src/lib-sieve/tst-exists.c
index 4e74b9c87..9bcb30f21 100644
--- a/src/lib-sieve/tst-exists.c
+++ b/src/lib-sieve/tst-exists.c
@@ -92,7 +92,7 @@ static bool tst_exists_operation_dump
     sieve_code_dumpf(denv, "EXISTS");
 	sieve_code_descend(denv);
 
-	return sieve_opr_stringlist_dump(denv, address);
+	return sieve_opr_stringlist_dump(denv, address, "header names");
 }
 
 /* 
diff --git a/src/lib-sieve/tst-header.c b/src/lib-sieve/tst-header.c
index 675f6b1b3..fe8db5783 100644
--- a/src/lib-sieve/tst-header.c
+++ b/src/lib-sieve/tst-header.c
@@ -137,8 +137,8 @@ static bool tst_header_operation_dump
 		return FALSE;
 	
 	return
-		sieve_opr_stringlist_dump(denv, address) &&
-		sieve_opr_stringlist_dump(denv, address);
+		sieve_opr_stringlist_dump(denv, address, "header names") &&
+		sieve_opr_stringlist_dump(denv, address, "key list");
 }
 
 /* 
diff --git a/src/lib-sieve/tst-size.c b/src/lib-sieve/tst-size.c
index 44aca56fb..8ff7e355d 100644
--- a/src/lib-sieve/tst-size.c
+++ b/src/lib-sieve/tst-size.c
@@ -216,7 +216,7 @@ static bool tst_size_operation_dump
 	sieve_code_descend(denv);
 	
 	return 
-		sieve_opr_number_dump(denv, address);
+		sieve_opr_number_dump(denv, address, "limit");
 }
 
 /* 
diff --git a/src/testsuite/cmd-test-fail.c b/src/testsuite/cmd-test-fail.c
index b46326954..3b1ec2406 100644
--- a/src/testsuite/cmd-test-fail.c
+++ b/src/testsuite/cmd-test-fail.c
@@ -113,13 +113,13 @@ static bool cmd_test_fail_operation_dump
 	sieve_code_dumpf(denv, "TEST_FAIL:");
 	sieve_code_descend(denv);
 
-	if ( !sieve_opr_string_dump(denv, address) ) 
+	if ( !sieve_opr_string_dump(denv, address, "reason") ) 
 		return FALSE;
 
 	sieve_code_mark(denv);
 	pc = *address;
 	if ( sieve_binary_read_offset(denv->sbin, address, &offset) )
-		sieve_code_dumpf(denv, "OFFSET: %d [%08x]", offset, pc + offset);
+		sieve_code_dumpf(denv, "offset: %d [%08x]", offset, pc + offset);
 	else
 		return FALSE;
 
diff --git a/src/testsuite/cmd-test-set.c b/src/testsuite/cmd-test-set.c
index ee4e7a977..8b70d7262 100644
--- a/src/testsuite/cmd-test-set.c
+++ b/src/testsuite/cmd-test-set.c
@@ -93,7 +93,7 @@ static bool cmd_test_set_validate
 }
 
 /*
- * Generation
+ * Code generation
  */
  
 static bool cmd_test_set_generate
@@ -118,7 +118,7 @@ static bool cmd_test_set_operation_dump
 
 	return 
 		testsuite_object_dump(denv, address) &&
-		sieve_opr_string_dump(denv, address);
+		sieve_opr_string_dump(denv, address, "value");
 }
 
 /*
diff --git a/src/testsuite/cmd-test.c b/src/testsuite/cmd-test.c
index 15041ddd1..bcd85eb89 100644
--- a/src/testsuite/cmd-test.c
+++ b/src/testsuite/cmd-test.c
@@ -143,7 +143,7 @@ static bool cmd_test_operation_dump
 	sieve_code_descend(denv);
 
 	return 
-		sieve_opr_string_dump(denv, address);
+		sieve_opr_string_dump(denv, address, "test name");
 }
 
 /*
diff --git a/src/testsuite/testsuite-objects.c b/src/testsuite/testsuite-objects.c
index eb91d0966..3b4bd6cda 100644
--- a/src/testsuite/testsuite-objects.c
+++ b/src/testsuite/testsuite-objects.c
@@ -80,7 +80,7 @@ void testsuite_register_core_objects
  */ 
  
 const struct sieve_operand_class sieve_testsuite_object_operand_class = 
-	{ "TESTSUITE-OBJECT" };
+	{ "testsuite object" };
 
 static const struct sieve_extension_obj_registry core_testsuite_objects =
 	SIEVE_EXT_DEFINE_OBJECTS(testsuite_core_objects);
diff --git a/src/testsuite/tst-test-compile.c b/src/testsuite/tst-test-compile.c
index ae9f72108..19ca3244e 100644
--- a/src/testsuite/tst-test-compile.c
+++ b/src/testsuite/tst-test-compile.c
@@ -103,7 +103,7 @@ static bool tst_test_compile_operation_dump
 	sieve_code_dumpf(denv, "TEST_COMPILE:");
 	sieve_code_descend(denv);
 
-	if ( !sieve_opr_string_dump(denv, address) ) 
+	if ( !sieve_opr_string_dump(denv, address, "script") ) 
 		return FALSE;
 
 	return TRUE;
diff --git a/src/testsuite/tst-test-error.c b/src/testsuite/tst-test-error.c
index bf842a6a7..607ceb7db 100644
--- a/src/testsuite/tst-test-error.c
+++ b/src/testsuite/tst-test-error.c
@@ -193,7 +193,7 @@ static bool tst_test_error_operation_dump
 		case SIEVE_MATCH_OPT_END:
 			break;
 		case OPT_INDEX:
-			if ( !sieve_opr_number_dump(denv, address) )
+			if ( !sieve_opr_number_dump(denv, address, "index") )
 				return FALSE;
 			break;
 		default:
@@ -201,7 +201,7 @@ static bool tst_test_error_operation_dump
 		}
 	} while ( opt_code != SIEVE_MATCH_OPT_END );
 
-	return sieve_opr_stringlist_dump(denv, address);
+	return sieve_opr_stringlist_dump(denv, address, "key list");
 }
 
 /*
-- 
GitLab