diff --git a/TODO b/TODO index e9fb4e4d8129793befb1c3fba481ca088cf370a5..6ae0e6af03824910f212cfa1ba673f8802b8e419 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 434f4434dd8d9e4456f9aedd0c04bf5f0e2ada5e..3adfee6c2dbbc07ca708bb53dc445ac6b4ad7812 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 17705faa9dfaa45d3344fa5916e5a1896494c28b..7abd09a80b943b70c200be18654f3b7008d86898 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 3e8ef2f4e3b4898cd6d3257bba47e661743e020d..9d37b5daa9f5bec8164e95f15fb3e91e27b4614a 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 0dd89812bed0344def6c818ee29e0d731807a3d8..70b2c03612d91f4d152f6bd6455322650ee77b40 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 ecba1e8fa12cd5d23d5fe22fe82588c34af8561c..ddecb7ccf6b9e20409f2c280905b98273163d5a1 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 4730ba5b23429cc0b8af0a50dab2650f26c8d45e..9b3c1ed579d1ead31257ea73ddee60116d7639dc 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 c88296ddd6ad5f06e0c1efdb9c6ab60bcb5a3de4..bf45d62aee951754dfb0a1278748556b4c19b6e7 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 5eac559634a86d072e3f9e3d094742bdb878818a..db8cab61ef4c3836f921b0ba8244d06cc350c91d 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 7c4c2ad339f6e88ca8f77fef2f4db88a35c0bb68..047913123979cccd51b341235f8d31dc6f1b9ba2 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 e150a4422c6f7af90fa10cc27638078d4de168ea..f76bf90a474b69ee15cdd22008738840d9d5fa91 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 22d1e3abd686450a42bfda995eeb92bd9f9818e6..5ee5257faee996853f5925591c3f3743ce9bb140 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 ade0eb35844e4d0927d7fe4c2b33c3aa0845821e..084d4bc0596a9a3c54a4edd13ebd6eea2317e4a0 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 9343f417ab42075618ac209ccbd8c40d17da7172..f54a132e77ad13d0a72514bcbf41ff8ca9651797 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 f56341aeaf1dbb6e77c5bf876648bcc4dd94fa18..9713122e9b9654c2fc06e3c3eec9979cd9b0357f 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 2a123a90e9f095e84c8a222913e32b5184b09218..c551bcd0db942b62cd80de65e991194450037695 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 149c7c7527b409bdde25f47c9d7e96e0ee9ca73e..4b7f78086c45433af3a9bbb53d6f129df7c0cc69 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 d4206dd92982eb75347c8b2034e1729c0298d29e..6cac837ee027a2bdef4b4933506ae0bf442f4c90 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 5b16d017545dc5b39fa24f392e7b7066905f9bf1..ec693a05e272de9a63c2de709abb7465a515f49d 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 164bb20fcea6f8a48571c223a994932041ebd401..a77441583e7efdc750f183eb81366059403c209b 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 8f59a49feaa7ab659cbfbc9b9437c03e932f393a..9b8c2ccf4cf547a515444194081eeb51898ce285 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 4cb06c844cadb9d45687fead7fb2b65e62ab19c5..706b8ca64bc3d17bb091d32b64c96e8a0a6501bf 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 18d9b2dd1c69987170942e53c387e38d93f64e98..23d8c65b3089ad596d5f39352689e6e4034845a0 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 4874c5a54931145461ff92e0f784d60de0ae1f1a..9a44da4300cf60e0e818b45ecbd78108ef5000d0 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 4e74b9c87de30a6bb47815b2e389fb749e6cd3c7..9bcb30f21ee45481f7c5d166255d1cbeb2c88eb1 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 675f6b1b3847b0bcae3a228eb2ead7701ff32792..fe8db57830a3853a9dca3a9cd3e96adc5a39df9e 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 44aca56fbea3966f80c94ead59f20be9d77da1e5..8ff7e355d9083ec039c53ee7a45e62b005784ab1 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 b4632695449ff716b38dc6ba86dc87573fe754a2..3b1ec240623716a28497a0d15ae7ad5950c0af49 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 ee4e7a9776329736bd351b9c763fa8202d515598..8b70d7262ddfb4fa8fb55edf82b5e5abf90ad31b 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 15041ddd1700b667a1811ffb948c434dc9e7e678..bcd85eb89bfcf7c23ba4f5fbe2f67315f4690787 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 eb91d09663a7e834e1f4746c9b6457e5a856b2eb..3b4bd6cda5a4ba78c988f202350b4cfcfb6f39a0 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 ae9f72108a1551e3b363a0c60c7749ce5dbb9a2d..19ca3244e9695172113b53bb05671a9f16863ce1 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 bf842a6a7118e9829c76f1fb0e47836168927e48..607ceb7dbaf1c18ef1f9e4dc4ea7c854f6f87988 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"); } /*