summaryrefslogtreecommitdiff
path: root/fitz/base_error.c
diff options
context:
space:
mode:
Diffstat (limited to 'fitz/base_error.c')
-rw-r--r--fitz/base_error.c120
1 files changed, 75 insertions, 45 deletions
diff --git a/fitz/base_error.c b/fitz/base_error.c
index a0efa290..b844fb6a 100644
--- a/fitz/base_error.c
+++ b/fitz/base_error.c
@@ -1,77 +1,109 @@
#include "fitz.h"
-enum { LINE_LEN = 160, LINE_COUNT = 25 };
+/* Warning context */
-static char warn_message[LINE_LEN] = "";
-static int warn_count = 0;
-
-void fz_flush_warnings(void)
+void fz_flush_warnings(fz_context *ctx)
{
- if (warn_count > 1)
- fprintf(stderr, "warning: ... repeated %d times ...\n", warn_count);
- warn_message[0] = 0;
- warn_count = 0;
+ if (ctx->warn->count > 1)
+ fprintf(stderr, "warning: ... repeated %d times ...\n", ctx->warn->count);
+ ctx->warn->message[0] = 0;
+ ctx->warn->count = 0;
}
-void fz_warn(char *fmt, ...)
+void fz_warn(fz_context *ctx, char *fmt, ...)
{
va_list ap;
- char buf[LINE_LEN];
+ char buf[sizeof ctx->warn->message];
va_start(ap, fmt);
vsnprintf(buf, sizeof buf, fmt, ap);
va_end(ap);
- if (!strcmp(buf, warn_message))
+ if (!strcmp(buf, ctx->warn->message))
{
- warn_count++;
+ ctx->warn->count++;
}
else
{
- fz_flush_warnings();
+ fz_flush_warnings(ctx);
fprintf(stderr, "warning: %s\n", buf);
- fz_strlcpy(warn_message, buf, sizeof warn_message);
- warn_count = 1;
+ fz_strlcpy(ctx->warn->message, buf, sizeof ctx->warn->message);
+ ctx->warn->count = 1;
}
}
-static char error_message[LINE_COUNT][LINE_LEN];
-static int error_count = 0;
+/* Error context */
-static void
-fz_emit_error(char what, char *location, char *message)
+static void throw(fz_error_context *ex)
{
- fz_flush_warnings();
-
- fprintf(stderr, "%c %s%s\n", what, location, message);
+ if (ex->top >= 0) {
+ longjmp(ex->stack[ex->top--].buffer, 1);
+ } else {
+ fprintf(stderr, "uncaught exception: %s\n", ex->message);
+ exit(EXIT_FAILURE);
+ }
+}
- if (error_count < LINE_COUNT)
+void fz_push_try(fz_error_context *ex)
+{
+ assert(ex != NULL);
+ if (ex->top + 1 >= nelem(ex->stack))
{
- fz_strlcpy(error_message[error_count], location, LINE_LEN);
- fz_strlcat(error_message[error_count], message, LINE_LEN);
- error_count++;
+ fprintf(stderr, "exception stack overflow!\n");
+ exit(EXIT_FAILURE);
}
+ ex->top++;
+}
+
+char *fz_caught(fz_context *ctx)
+{
+ assert(ctx != NULL);
+ assert(ctx->error != NULL);
+ return ctx->error->message;
+}
+
+void fz_throw(fz_context *ctx, char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ vsnprintf(ctx->error->message, sizeof ctx->error->message, fmt, args);
+ va_end(args);
+
+ fprintf(stderr, "error: %s\n", ctx->error->message);
+
+ throw(ctx->error);
+}
+
+void fz_rethrow(fz_context *ctx)
+{
+ throw(ctx->error);
+}
+
+/* Deprecated error bubbling */
+
+static void
+fz_emit_error(char what, char *location, char *message)
+{
+ fprintf(stderr, "%c %s%s\n", what, location, message);
}
int
fz_get_error_count(void)
{
- return error_count;
+ return 0;
}
char *
fz_get_error_line(int n)
{
- return error_message[n];
+ return "";
}
fz_error
-fz_throw_imp(const char *file, int line, const char *func, char *fmt, ...)
+fz_error_make_imp(const char *file, int line, const char *func, char *fmt, ...)
{
va_list ap;
- char one[LINE_LEN], two[LINE_LEN];
-
- error_count = 0;
+ char one[256], two[256];
snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func);
va_start(ap, fmt);
@@ -84,10 +116,10 @@ fz_throw_imp(const char *file, int line, const char *func, char *fmt, ...)
}
fz_error
-fz_rethrow_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...)
+fz_error_note_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...)
{
va_list ap;
- char one[LINE_LEN], two[LINE_LEN];
+ char one[256], two[256];
snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func);
va_start(ap, fmt);
@@ -100,10 +132,10 @@ fz_rethrow_imp(const char *file, int line, const char *func, fz_error cause, cha
}
void
-fz_catch_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...)
+fz_error_handle_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...)
{
va_list ap;
- char one[LINE_LEN], two[LINE_LEN];
+ char one[256], two[256];
snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func);
va_start(ap, fmt);
@@ -114,12 +146,10 @@ fz_catch_imp(const char *file, int line, const char *func, fz_error cause, char
}
fz_error
-fz_throw_impx(char *fmt, ...)
+fz_error_make_impx(char *fmt, ...)
{
va_list ap;
- char buf[LINE_LEN];
-
- error_count = 0;
+ char buf[256];
va_start(ap, fmt);
vsnprintf(buf, sizeof buf, fmt, ap);
@@ -131,10 +161,10 @@ fz_throw_impx(char *fmt, ...)
}
fz_error
-fz_rethrow_impx(fz_error cause, char *fmt, ...)
+fz_error_note_impx(fz_error cause, char *fmt, ...)
{
va_list ap;
- char buf[LINE_LEN];
+ char buf[256];
va_start(ap, fmt);
vsnprintf(buf, sizeof buf, fmt, ap);
@@ -146,10 +176,10 @@ fz_rethrow_impx(fz_error cause, char *fmt, ...)
}
void
-fz_catch_impx(fz_error cause, char *fmt, ...)
+fz_error_handle_impx(fz_error cause, char *fmt, ...)
{
va_list ap;
- char buf[LINE_LEN];
+ char buf[256];
va_start(ap, fmt);
vsnprintf(buf, sizeof buf, fmt, ap);