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