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