From b40b9a0332e197571714bcdf5cf17f4e380b6a51 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Fri, 12 Sep 2008 15:27:26 +0200 Subject: [PATCH] Restructured error reporting in validator and code generator. --- src/lib-sieve/sieve-ast.c | 17 ----------- src/lib-sieve/sieve-ast.h | 6 ---- src/lib-sieve/sieve-commands.h | 54 +++++++++++++++++++-------------- src/lib-sieve/sieve-generator.c | 18 +++++++---- src/lib-sieve/sieve-generator.h | 6 ++-- src/lib-sieve/sieve-validator.c | 23 +++++++++----- src/lib-sieve/sieve-validator.h | 6 ++-- 7 files changed, 64 insertions(+), 66 deletions(-) diff --git a/src/lib-sieve/sieve-ast.c b/src/lib-sieve/sieve-ast.c index ea271fe63..5e57d31a0 100644 --- a/src/lib-sieve/sieve-ast.c +++ b/src/lib-sieve/sieve-ast.c @@ -177,23 +177,6 @@ void *sieve_ast_extension_get_context return reg->context; } -/* - * Error reporting - */ - -void sieve_ast_error -(struct sieve_error_handler *ehandler, sieve_error_vfunc_t vfunc, - struct sieve_ast_node *node, const char *fmt, va_list args) -{ - struct sieve_script *script = node->ast->script; - - T_BEGIN { - vfunc(ehandler, - sieve_error_script_location(script, sieve_ast_node_line(node)), - fmt, args); - } T_END; -} - /* * AST list implementations */ diff --git a/src/lib-sieve/sieve-ast.h b/src/lib-sieve/sieve-ast.h index 564bd5f8b..7e4b424cb 100644 --- a/src/lib-sieve/sieve-ast.h +++ b/src/lib-sieve/sieve-ast.h @@ -200,12 +200,6 @@ void sieve_ast_extension_register void *sieve_ast_extension_get_context (struct sieve_ast *ast, const struct sieve_extension *ext); -/* Error reporting */ - -void sieve_ast_error -(struct sieve_error_handler *ehandler, sieve_error_vfunc_t vfunc, - struct sieve_ast_node *node, const char *fmt, va_list args); - /* * AST node manipulation */ diff --git a/src/lib-sieve/sieve-commands.h b/src/lib-sieve/sieve-commands.h index 07012983a..28ec1ba32 100644 --- a/src/lib-sieve/sieve-commands.h +++ b/src/lib-sieve/sieve-commands.h @@ -31,6 +31,11 @@ struct sieve_argument { struct sieve_command_context *context); }; +/* Utility macros */ + +#define sieve_argument_is_string_literal(arg) \ + ( (arg)->argument == &string_argument ) + /* Literal arguments */ extern const struct sieve_argument number_argument; @@ -94,26 +99,45 @@ struct sieve_command_context { void *data; }; +/* Context API */ + struct sieve_command_context *sieve_command_context_create (struct sieve_ast_node *cmd_node, const struct sieve_command *command, struct sieve_command_registration *reg); const char *sieve_command_type_name(const struct sieve_command *command); -#define sieve_argument_is_string_literal(arg) \ - ( (arg)->argument == &string_argument ) +struct sieve_command_context *sieve_command_prev_context + (struct sieve_command_context *context); +struct sieve_command_context *sieve_command_parent_context + (struct sieve_command_context *context); + +struct sieve_ast_argument *sieve_command_add_dynamic_tag + (struct sieve_command_context *cmd, const struct sieve_argument *tag, + int id_code); +struct sieve_ast_argument *sieve_command_find_argument + (struct sieve_command_context *cmd, const struct sieve_argument *argument); + +void sieve_command_exit_block_unconditionally + (struct sieve_command_context *cmd); +bool sieve_command_block_exits_unconditionally + (struct sieve_command_context *cmd); + +/* Error handling */ #define sieve_command_validate_error(validator, context, ...) \ - sieve_validator_error(validator, (context)->ast_node, __VA_ARGS__) + sieve_validator_error(validator, (context)->ast_node->source_line, __VA_ARGS__) #define sieve_command_validate_warning(validator, context, ...) \ - sieve_validator_warning(validator, (context)->ast_node, __VA_ARGS__) + sieve_validator_warning(validator, (context)->ast_node->source_line, __VA_ARGS__) #define sieve_command_validate_critical(validator, context, ...) \ - sieve_validator_critical(validator, (context)->ast_node, __VA_ARGS__) + sieve_validator_critical(validator, (context)->ast_node->source_line, __VA_ARGS__) #define sieve_command_generate_error(gentr, context, ...) \ - sieve_generator_error(gentr, (context)->ast_node, __VA_ARGS__) + sieve_generator_error(gentr, (context)->ast_node->source_line, __VA_ARGS__) #define sieve_command_generate_critical(gentr, context, ...) \ - sieve_generator_critical(gentr, (context)->ast_node, __VA_ARGS__) + sieve_generator_critical(gentr, (context)->ast_node->source_line, __VA_ARGS__) + +/* Utility macros */ #define sieve_command_pool(context) \ sieve_ast_node_pool((context)->ast_node) @@ -129,22 +153,6 @@ const char *sieve_command_type_name(const struct sieve_command *command); #define sieve_command_is_first(context) \ ( sieve_ast_node_prev((context)->ast_node) == NULL ) -struct sieve_command_context *sieve_command_prev_context - (struct sieve_command_context *context); -struct sieve_command_context *sieve_command_parent_context - (struct sieve_command_context *context); - -struct sieve_ast_argument *sieve_command_add_dynamic_tag - (struct sieve_command_context *cmd, const struct sieve_argument *tag, - int id_code); -struct sieve_ast_argument *sieve_command_find_argument - (struct sieve_command_context *cmd, const struct sieve_argument *argument); - -void sieve_command_exit_block_unconditionally - (struct sieve_command_context *cmd); -bool sieve_command_block_exits_unconditionally - (struct sieve_command_context *cmd); - /* * Core commands */ diff --git a/src/lib-sieve/sieve-generator.c b/src/lib-sieve/sieve-generator.c index 552c217dd..1db9d9b1d 100644 --- a/src/lib-sieve/sieve-generator.c +++ b/src/lib-sieve/sieve-generator.c @@ -141,35 +141,41 @@ struct sieve_binary *sieve_generator_get_binary */ void sieve_generator_warning -(struct sieve_generator *gentr, struct sieve_ast_node *node, +(struct sieve_generator *gentr, unsigned int source_line, const char *fmt, ...) { va_list args; va_start(args, fmt); - sieve_ast_error(gentr->ehandler, sieve_vwarning, node, fmt, args); + sieve_vwarning(gentr->ehandler, + sieve_error_script_location(gentr->genenv.script, source_line), + fmt, args); va_end(args); } void sieve_generator_error -(struct sieve_generator *gentr, struct sieve_ast_node *node, +(struct sieve_generator *gentr, unsigned int source_line, const char *fmt, ...) { va_list args; va_start(args, fmt); - sieve_ast_error(gentr->ehandler, sieve_verror, node, fmt, args); + sieve_verror(gentr->ehandler, + sieve_error_script_location(gentr->genenv.script, source_line), + fmt, args); va_end(args); } void sieve_generator_critical -(struct sieve_generator *gentr, struct sieve_ast_node *node, +(struct sieve_generator *gentr, unsigned int source_line, const char *fmt, ...) { va_list args; va_start(args, fmt); - sieve_ast_error(gentr->ehandler, sieve_vcritical, node, fmt, args); + sieve_vwarning(gentr->ehandler, + sieve_error_script_location(gentr->genenv.script, source_line), + fmt, args); va_end(args); } diff --git a/src/lib-sieve/sieve-generator.h b/src/lib-sieve/sieve-generator.h index 5ab6f651a..bc7921b46 100644 --- a/src/lib-sieve/sieve-generator.h +++ b/src/lib-sieve/sieve-generator.h @@ -41,13 +41,13 @@ struct sieve_binary *sieve_generator_get_binary */ void sieve_generator_warning -(struct sieve_generator *gentr, struct sieve_ast_node *node, +(struct sieve_generator *gentr, unsigned int source_line, const char *fmt, ...) ATTR_FORMAT(3, 4);; void sieve_generator_error -(struct sieve_generator *gentr, struct sieve_ast_node *node, +(struct sieve_generator *gentr, unsigned int source_line, const char *fmt, ...) ATTR_FORMAT(3, 4); void sieve_generator_critical -(struct sieve_generator *gentr, struct sieve_ast_node *node, +(struct sieve_generator *gentr, unsigned int source_line, const char *fmt, ...) ATTR_FORMAT(3, 4); /* diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c index c134acf7a..a9f913ba6 100644 --- a/src/lib-sieve/sieve-validator.c +++ b/src/lib-sieve/sieve-validator.c @@ -98,35 +98,42 @@ struct sieve_validator { */ void sieve_validator_warning -(struct sieve_validator *validator, struct sieve_ast_node *node, +(struct sieve_validator *validator, unsigned int source_line, const char *fmt, ...) { va_list args; va_start(args, fmt); - sieve_ast_error(validator->ehandler, sieve_vwarning, node, fmt, args); + sieve_vwarning(validator->ehandler, + sieve_error_script_location(validator->script, source_line), + fmt, args); va_end(args); + } void sieve_validator_error -(struct sieve_validator *validator, struct sieve_ast_node *node, +(struct sieve_validator *validator, unsigned int source_line, const char *fmt, ...) { va_list args; va_start(args, fmt); - sieve_ast_error(validator->ehandler, sieve_verror, node, fmt, args); + sieve_verror(validator->ehandler, + sieve_error_script_location(validator->script, source_line), + fmt, args); va_end(args); } void sieve_validator_critical -(struct sieve_validator *validator, struct sieve_ast_node *node, +(struct sieve_validator *validator, unsigned int source_line, const char *fmt, ...) { va_list args; va_start(args, fmt); - sieve_ast_error(validator->ehandler, sieve_vcritical, node, fmt, args); + sieve_vcritical(validator->ehandler, + sieve_error_script_location(validator->script, source_line), + fmt, args); va_end(args); } @@ -968,7 +975,7 @@ static bool sieve_validate_command (command->type == SCT_TEST && ast_type == SAT_COMMAND) ) { sieve_validator_error( - valdtr, cmd_node, "attempted to use %s '%s' as %s", + valdtr, cmd_node->source_line, "attempted to use %s '%s' as %s", sieve_command_type_name(command), cmd_node->identifier, sieve_ast_type_name(ast_type)); @@ -1011,7 +1018,7 @@ static bool sieve_validate_command } else { sieve_validator_error( - valdtr, cmd_node, + valdtr, cmd_node->source_line, "unknown %s '%s' (only reported once at first occurence)", sieve_ast_type_name(ast_type), cmd_node->identifier); diff --git a/src/lib-sieve/sieve-validator.h b/src/lib-sieve/sieve-validator.h index 041336c7f..a48dbd8c7 100644 --- a/src/lib-sieve/sieve-validator.h +++ b/src/lib-sieve/sieve-validator.h @@ -52,13 +52,13 @@ struct sieve_script *sieve_validator_script */ void sieve_validator_warning - (struct sieve_validator *validator, struct sieve_ast_node *node, + (struct sieve_validator *validator, unsigned int source_line, const char *fmt, ...) ATTR_FORMAT(3, 4); void sieve_validator_error - (struct sieve_validator *validator, struct sieve_ast_node *node, + (struct sieve_validator *validator, unsigned int source_line, const char *fmt, ...) ATTR_FORMAT(3, 4); void sieve_validator_critical - (struct sieve_validator *validator, struct sieve_ast_node *node, + (struct sieve_validator *validator, unsigned int source_line, const char *fmt, ...) ATTR_FORMAT(3, 4); /* -- GitLab