summaryrefslogtreecommitdiff
path: root/fitz
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2011-03-06 15:14:33 +0000
committerTor Andersson <tor@ghostscript.com>2011-03-06 15:14:33 +0000
commit538d304ab289364510eaff37308bb8f4d6293d7b (patch)
treeb97e20cf1a0aa66facd92dd46b7b94aa4bbbdc6d /fitz
parentb5a4ed89c89dd94b21f4c9936abc2567a1553555 (diff)
downloadmupdf-538d304ab289364510eaff37308bb8f4d6293d7b.tar.xz
Add error message buffer for GUI applications to display the latest error stack trace.
Diffstat (limited to 'fitz')
-rw-r--r--fitz/base_error.c95
-rw-r--r--fitz/fitz.h4
2 files changed, 75 insertions, 24 deletions
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
*/