diff options
author | Tor Andersson <tor@ghostscript.com> | 2009-08-21 17:51:15 +0200 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2009-08-21 17:51:15 +0200 |
commit | a5928bde6a1a757a3d1a3680d542629611656ab5 (patch) | |
tree | 15f1071e7664b64d229fdc26ab922cb9b86a0453 /fitz/base_error.c | |
parent | fd2ea36e0848223b58c09c292a551b696a955585 (diff) | |
download | mupdf-a5928bde6a1a757a3d1a3680d542629611656ab5.tar.xz |
Save error messages in a static buffer so that the windows viewer can show them in a dialog box.
Diffstat (limited to 'fitz/base_error.c')
-rw-r--r-- | fitz/base_error.c | 58 |
1 files changed, 45 insertions, 13 deletions
diff --git a/fitz/base_error.c b/fitz/base_error.c index 44df2b59..c446bce9 100644 --- a/fitz/base_error.c +++ b/fitz/base_error.c @@ -1,5 +1,36 @@ #include "fitz_base.h" +char fz_errorbuf[100*20] = {0}; +static int fz_errorlen = 0; +static int fz_errorclear = 1; + +static void +fz_printerror(int type, const char *file, int line, const char *func, char *msg) +{ + char buf[100]; + int len; + + snprintf(buf, sizeof buf, "%c %s:%d: %s(): %s", type, file, line, func, msg); + len = strlen(buf); + + fputs(buf, stderr); + + if (fz_errorclear) + { + fz_errorclear = 0; + fz_errorlen = 0; + memset(fz_errorbuf, 0, sizeof fz_errorbuf); + } + + if (fz_errorlen + len + 2 < sizeof fz_errorbuf) + { + memcpy(fz_errorbuf + fz_errorlen, buf, len); + fz_errorlen += len; + fz_errorbuf[fz_errorlen++] = '\n'; + fz_errorbuf[fz_errorlen] = 0; + } +} + void fz_warn(char *fmt, ...) { va_list ap; @@ -10,36 +41,37 @@ void fz_warn(char *fmt, ...) fprintf(stderr, "\n"); } -fz_error fz_throwimp(const char *func, const char *file, int line, char *fmt, ...) +fz_error fz_throwimp(const char *file, int line, const char *func, char *fmt, ...) { + char buf[100]; va_list ap; - fprintf(stderr, "+ %s:%d: %s(): ", file, line, func); va_start(ap, fmt); - vfprintf(stderr, fmt, ap); + vsnprintf(buf, sizeof buf, fmt, ap); va_end(ap); - fprintf(stderr, "\n"); - return ((fz_error)-1); + fz_printerror('+', file, line, func, buf); + return -1; } -fz_error fz_rethrowimp(fz_error cause, const char *func, const char *file, int line, char *fmt, ...) +fz_error fz_rethrowimp(fz_error cause, const char *file, int line, const char *func, char *fmt, ...) { + char buf[100]; va_list ap; - fprintf(stderr, "| %s:%d: %s(): ", file, line, func); va_start(ap, fmt); - vfprintf(stderr, fmt, ap); + vsnprintf(buf, sizeof buf, fmt, ap); va_end(ap); - fprintf(stderr, "\n"); + fz_printerror('|', file, line, func, buf); return cause; } -fz_error fz_catchimp(fz_error cause, const char *func, const char *file, int line, char *fmt, ...) +fz_error fz_catchimp(fz_error cause, const char *file, int line, const char *func, char *fmt, ...) { + char buf[100]; va_list ap; - fprintf(stderr, "\\ %s:%d: %s(): ", file, line, func); va_start(ap, fmt); - vfprintf(stderr, fmt, ap); + vsnprintf(buf, sizeof buf, fmt, ap); va_end(ap); - fprintf(stderr, "\n"); + fz_printerror('\\', file, line, func, buf); + fz_errorclear = 1; return cause; } |