From 538d304ab289364510eaff37308bb8f4d6293d7b Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Sun, 6 Mar 2011 15:14:33 +0000 Subject: Add error message buffer for GUI applications to display the latest error stack trace. --- apps/win_main.c | 13 +++++++- fitz/base_error.c | 95 +++++++++++++++++++++++++++++++++++++++++-------------- fitz/fitz.h | 4 +++ 3 files changed, 87 insertions(+), 25 deletions(-) diff --git a/apps/win_main.c b/apps/win_main.c index d3dbb3f8..e217dfbb 100644 --- a/apps/win_main.c +++ b/apps/win_main.c @@ -48,9 +48,20 @@ void winwarn(pdfapp_t *app, char *msg) void winerror(pdfapp_t *app, fz_error error) { + char msgbuf[160 * 30]; + int i; + /* TODO: redirect stderr to a log file and display here */ fz_catch(error, "displaying error message to user"); - MessageBoxA(hwndframe, "An error has occurred.", "MuPDF: Error", MB_ICONERROR); + + fz_strlcpy(msgbuf, "An error has occurred.\n\n", sizeof msgbuf); + for (i = 0; i < fz_geterrorcount(); i++) + { + fz_strlcat(msgbuf, fz_geterrorline(i), sizeof msgbuf); + fz_strlcat(msgbuf, "\n", sizeof msgbuf); + } + + MessageBoxA(hwndframe, msgbuf, "MuPDF: Error", MB_ICONERROR); exit(1); } diff --git a/fitz/base_error.c b/fitz/base_error.c index 4117bc92..7b21d691 100644 --- a/fitz/base_error.c +++ b/fitz/base_error.c @@ -35,16 +35,51 @@ void fz_warn(char *fmt, ...) } } +static char errormessage[LINECOUNT][LINELEN]; +static int errorcount = 0; + +static void +fz_emiterror(char what, char *location, char *message) +{ + fz_flushwarnings(); + + fprintf(stderr, "%c %s%s\n", what, location, message); + + if (errorcount < LINECOUNT) + { + fz_strlcpy(errormessage[errorcount], location, LINELEN); + fz_strlcat(errormessage[errorcount], message, LINELEN); + errorcount++; + } +} + +int +fz_geterrorcount(void) +{ + return errorcount; +} + +char * +fz_geterrorline(int n) +{ + return errormessage[n]; +} + fz_error fz_throwimp(const char *file, int line, const char *func, char *fmt, ...) { va_list ap; - fz_flushwarnings(); - fprintf(stderr, "+ %s:%d: %s(): ", file, line, func); + char one[LINELEN], two[LINELEN]; + + errorcount = 0; + + snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func); va_start(ap, fmt); - vfprintf(stderr, fmt, ap); + vsnprintf(two, sizeof two, fmt, ap); va_end(ap); - fprintf(stderr, "\n"); + + fz_emiterror('+', one, two); + return -1; } @@ -52,12 +87,15 @@ fz_error fz_rethrowimp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...) { va_list ap; - fz_flushwarnings(); - fprintf(stderr, "| %s:%d: %s(): ", file, line, func); + char one[LINELEN], two[LINELEN]; + + snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func); va_start(ap, fmt); - vfprintf(stderr, fmt, ap); + vsnprintf(two, sizeof two, fmt, ap); va_end(ap); - fprintf(stderr, "\n"); + + fz_emiterror('|', one, two); + return cause; } @@ -65,24 +103,30 @@ void fz_catchimp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...) { va_list ap; - fz_flushwarnings(); - fprintf(stderr, "\\ %s:%d: %s(): ", file, line, func); + char one[LINELEN], two[LINELEN]; + + snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func); va_start(ap, fmt); - vfprintf(stderr, fmt, ap); + vsnprintf(two, sizeof two, fmt, ap); va_end(ap); - fprintf(stderr, "\n"); + + fz_emiterror('\\', one, two); } fz_error fz_throwimpx(char *fmt, ...) { va_list ap; - fz_flushwarnings(); - fprintf(stderr, "+ "); + char buf[LINELEN]; + + errorcount = 0; + va_start(ap, fmt); - vfprintf(stderr, fmt, ap); + vsnprintf(buf, sizeof buf, fmt, ap); va_end(ap); - fprintf(stderr, "\n"); + + fz_emiterror('+', "", buf); + return -1; } @@ -90,12 +134,14 @@ fz_error fz_rethrowimpx(fz_error cause, char *fmt, ...) { va_list ap; - fz_flushwarnings(); - fprintf(stderr, "| "); + char buf[LINELEN]; + va_start(ap, fmt); - vfprintf(stderr, fmt, ap); + vsnprintf(buf, sizeof buf, fmt, ap); va_end(ap); - fprintf(stderr, "\n"); + + fz_emiterror('|', "", buf); + return cause; } @@ -103,10 +149,11 @@ void fz_catchimpx(fz_error cause, char *fmt, ...) { va_list ap; - fz_flushwarnings(); - fprintf(stderr, "\\ "); + char buf[LINELEN]; + va_start(ap, fmt); - vfprintf(stderr, fmt, ap); + vsnprintf(buf, sizeof buf, fmt, ap); va_end(ap); - fprintf(stderr, "\n"); + + fz_emiterror('\\', "", buf); } diff --git a/fitz/fitz.h b/fitz/fitz.h index 14372efd..72af4532 100644 --- a/fitz/fitz.h +++ b/fitz/fitz.h @@ -125,6 +125,10 @@ void fz_catchimpx(fz_error cause, char *fmt, ...) __printflike(2, 3); #define fz_okay ((fz_error)0) +/* extract the last error stack trace */ +int fz_geterrorcount(void); +char *fz_geterrorline(int n); + /* * Basic runtime and utility functions */ -- cgit v1.2.3