[8/9] wpp: Add error management callbacks [try 2]

Matteo Bruni matteo.mystral at gmail.com
Thu Oct 1 07:21:52 CDT 2009


-------------- next part --------------
From 1dab42ff41254340096fc9978d94c6cb004cc6c7 Mon Sep 17 00:00:00 2001
From: Matteo Bruni <matteo.mystral at gmail.com>
Date: Tue, 29 Sep 2009 12:34:17 +0200
Subject: wpp: Add error management callbacks

---
 include/wine/wpp.h     |    9 +++++++++
 libs/wpp/preproc.c     |   39 ++++++++++++++++++++++++++++++++-------
 libs/wpp/wpp.c         |    7 +++++++
 libs/wpp/wpp_private.h |    3 +++
 4 files changed, 51 insertions(+), 7 deletions(-)

diff --git a/include/wine/wpp.h b/include/wine/wpp.h
index 10b71e0..5a7d40b 100644
--- a/include/wine/wpp.h
+++ b/include/wine/wpp.h
@@ -33,4 +33,13 @@ extern char *wpp_find_include( const char *name, const char *parent_name );
 extern int wpp_parse( const char *input, FILE *output );
 extern int wpp_parse_temp( const char *input, const char *output_base, char **output_name );
 
+struct wpp_callbacks {
+    /* Error callbacks */
+    void (*error)( const char *file, int line, int col, const char *near, const char *msg, va_list ap );
+    void (*warning)( const char *file, int line, int col, const char *near, const char *msg, va_list ap );
+    void (*internal_error)( const char *file, int line, const char *msg, va_list ap );
+};
+
+void wpp_set_callbacks( struct wpp_callbacks *callbacks );
+
 #endif  /* __WINE_WPP_H */
diff --git a/libs/wpp/preproc.c b/libs/wpp/preproc.c
index 885e9a6..60546ac 100644
--- a/libs/wpp/preproc.c
+++ b/libs/wpp/preproc.c
@@ -672,13 +672,40 @@ end:
 	fprintf(stderr, "\n");
 }
 
+void wpp_default_error(const char *file, int line, int col, const char *near, const char *msg, va_list ap)
+{
+	generic_msg(msg, "Error", near, ap);
+	exit(1);
+}
+
+void wpp_default_warning(const char *file, int line, int col, const char *near, const char *msg, va_list ap)
+{
+	generic_msg(msg, "Warning", near, ap);
+}
+
+void wpp_default_internal_error(const char *file, int line, const char *msg, va_list ap)
+{
+	fprintf(stderr, "Internal error (please report) %s %d: ", file, line);
+	vfprintf(stderr, msg, ap);
+	fprintf(stderr, "\n");
+	exit(3);
+}
+
+struct wpp_callbacks default_callbacks = {
+	wpp_default_error,
+	wpp_default_warning,
+	wpp_default_internal_error
+};
+
+struct wpp_callbacks *wpp_callbacks = &default_callbacks;
+
 int ppy_error(const char *s, ...)
 {
 	va_list ap;
 	va_start(ap, s);
-	generic_msg(s, "Error", ppy_text, ap);
+	wpp_callbacks->error(pp_status.input, pp_status.line_number, pp_status.char_number, ppy_text, s, ap);
 	va_end(ap);
-	exit(1);
+	pp_status.state = 1;
 	return 1;
 }
 
@@ -686,7 +713,7 @@ int ppy_warning(const char *s, ...)
 {
 	va_list ap;
 	va_start(ap, s);
-	generic_msg(s, "Warning", ppy_text, ap);
+	wpp_callbacks->warning(pp_status.input, pp_status.line_number, pp_status.char_number, ppy_text, s, ap);
 	va_end(ap);
 	return 0;
 }
@@ -695,9 +722,7 @@ void pp_internal_error(const char *file, int line, const char *s, ...)
 {
 	va_list ap;
 	va_start(ap, s);
-	fprintf(stderr, "Internal error (please report) %s %d: ", file, line);
-	vfprintf(stderr, s, ap);
-	fprintf(stderr, "\n");
+	wpp_callbacks->internal_error(file, line, s, ap);
 	va_end(ap);
-	exit(3);
+	pp_status.state = 1;
 }
diff --git a/libs/wpp/wpp.c b/libs/wpp/wpp.c
index faae893..f39a24e 100644
--- a/libs/wpp/wpp.c
+++ b/libs/wpp/wpp.c
@@ -228,3 +228,10 @@ int wpp_parse_temp( const char *input, const char *output_base, char **output_na
     fclose( output );
     return ret;
 }
+
+void wpp_set_callbacks(struct wpp_callbacks *callbacks)
+{
+    if(callbacks)
+        wpp_callbacks = callbacks;
+    else wpp_callbacks = &default_callbacks;
+}
diff --git a/libs/wpp/wpp_private.h b/libs/wpp/wpp_private.h
index c0b95a4..d7f9e2a 100644
--- a/libs/wpp/wpp_private.h
+++ b/libs/wpp/wpp_private.h
@@ -218,6 +218,9 @@ int pp_get_if_depth(void);
 #define __attribute__(x)  /*nothing*/
 #endif
 
+extern struct wpp_callbacks *wpp_callbacks;
+extern struct wpp_callbacks default_callbacks;
+
 int ppy_error(const char *s, ...) __attribute__((format (printf, 1, 2)));
 int ppy_warning(const char *s, ...) __attribute__((format (printf, 1, 2)));
 void pp_internal_error(const char *file, int line, const char *s, ...) __attribute__((format (printf, 3, 4)));
-- 
1.6.3.3


More information about the wine-patches mailing list