diff options
Diffstat (limited to 'fitz/base_error.c')
-rw-r--r-- | fitz/base_error.c | 120 |
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); |