From 8b47f293ef1f91a510e73a8a7bd8496a31423d15 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Thu, 3 Jan 2008 01:49:54 +0100
Subject: [PATCH] Added strbuf error handler.

---
 src/lib-sieve/sieve-error.c | 63 +++++++++++++++++++++++++++++++++++++
 src/lib-sieve/sieve-error.h |  1 +
 2 files changed, 64 insertions(+)

diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c
index 528954fd4..578205c69 100644
--- a/src/lib-sieve/sieve-error.c
+++ b/src/lib-sieve/sieve-error.c
@@ -188,6 +188,69 @@ struct sieve_error_handler *sieve_stderr_ehandler_create( void )
 	return ehandler;	
 }
 
+/* Output errors to a string buffer */
+
+struct sieve_strbuf_ehandler {
+    struct sieve_error_handler handler;
+
+	string_t *errors;
+};
+
+static void sieve_strbuf_verror
+(struct sieve_error_handler *ehandler, const char *location,
+    const char *fmt, va_list args)
+{
+    struct sieve_strbuf_ehandler *handler =
+        (struct sieve_strbuf_ehandler *) ehandler;
+
+	str_printfa(handler->errors, "%s: error: ", location);
+	str_vprintfa(handler->errors, fmt, args);
+	str_append(handler->errors, ".\n");
+}
+
+static void sieve_strbuf_vwarning
+(struct sieve_error_handler *ehandler, const char *location,
+    const char *fmt, va_list args)
+{
+    struct sieve_strbuf_ehandler *handler =
+        (struct sieve_strbuf_ehandler *) ehandler;
+
+	str_printfa(handler->errors, "%s: warning: ", location);
+    str_vprintfa(handler->errors, fmt, args);
+    str_append(handler->errors, ".\n");
+}
+
+static void sieve_strbuf_vinfo
+(struct sieve_error_handler *ehandler, const char *location,
+    const char *fmt, va_list args)
+{
+    struct sieve_strbuf_ehandler *handler =
+        (struct sieve_strbuf_ehandler *) ehandler;
+	
+	str_printfa(handler->errors, "%s: info: ", location);
+    str_vprintfa(handler->errors, fmt, args);
+    str_append(handler->errors, ".\n");
+}
+
+struct sieve_error_handler *sieve_strbuf_ehandler_create
+(string_t *strbuf)
+{
+    pool_t pool;
+    struct sieve_strbuf_ehandler *ehandler;
+
+    pool = pool_alloconly_create("strbuf_error_handler", 256);
+    ehandler = p_new(pool, struct sieve_strbuf_ehandler, 1);
+	ehandler->errors = strbuf;
+    ehandler->handler.pool = pool;
+    ehandler->handler.errors = 0;
+    ehandler->handler.warnings = 0;
+    ehandler->handler.verror = sieve_strbuf_verror;
+    ehandler->handler.vwarning = sieve_strbuf_vwarning;
+    ehandler->handler.vinfo = sieve_strbuf_vinfo;
+
+    return &(ehandler->handler);
+}
+
 /* Output errors to a log file */
 
 struct sieve_logfile_ehandler {
diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h
index 00d395f84..3b389cb8a 100644
--- a/src/lib-sieve/sieve-error.h
+++ b/src/lib-sieve/sieve-error.h
@@ -102,6 +102,7 @@ void sieve_error_handler_free(struct sieve_error_handler **ehandler);
 /* Error handlers */
 
 struct sieve_error_handler *sieve_stderr_ehandler_create(void);
+struct sieve_error_handler *sieve_strbuf_ehandler_create(string_t *strbuf);
 struct sieve_error_handler *sieve_logfile_ehandler_create(const char *logfile);  
 
 #endif /* __SIEVE_ERROR_H */
-- 
GitLab