diff options
Diffstat (limited to 'base/base_error.c')
-rw-r--r-- | base/base_error.c | 118 |
1 files changed, 66 insertions, 52 deletions
diff --git a/base/base_error.c b/base/base_error.c index e0bf1567..fa1c9878 100644 --- a/base/base_error.c +++ b/base/base_error.c @@ -1,74 +1,88 @@ #include "fitz-base.h" -void -fz_warn(char *fmt, ...) +fz_error * +fz_keeperror(fz_error *eo) { - va_list ap; - fprintf(stderr, "warning: "); - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - fprintf(stderr, "\n"); + eo->refs++; + return eo; } -fz_error * -fz_throw1(char *fmt, ...) +void +fz_droperror(fz_error *eo) { - va_list ap; - fz_error *eo; + if (eo->refs > 0) + eo->refs--; + if (eo->refs == 0) + { + if (eo->cause) + fz_droperror(eo->cause); + fz_free(eo); + } +} - eo = fz_malloc(sizeof(fz_error)); - if (!eo) return fz_outofmem; +void +fz_printerror(fz_error *eo) +{ +#if 1 + if (eo->cause) + { + fz_printerror(eo->cause); + fprintf(stderr, "| %s:%d: %s(): %s\n", eo->file, eo->line, eo->func, eo->msg); + } + else + { + fprintf(stderr, "+ %s:%d: %s(): %s\n", eo->file, eo->line, eo->func, eo->msg); + } +#else + fprintf(stderr, "+ %s:%d: %s(): %s\n", eo->file, eo->line, eo->func, eo->msg); + eo = eo->cause; - eo->refs = 1; - strlcpy(eo->func, "unknown", sizeof eo->func); - strlcpy(eo->file, "unknown", sizeof eo->file); - eo->line = 0; + while (eo) + { + fprintf(stderr, "| %s:%d: %s(): %s\n", eo->file, eo->line, eo->func, eo->msg); + eo = eo->cause; + } +#endif +} - va_start(ap, fmt); - vsnprintf(eo->msg, sizeof eo->msg, fmt, ap); - eo->msg[sizeof(eo->msg) - 1] = '\0'; - va_end(ap); - return eo; +void +fz_warn(char *fmt, ...) +{ + va_list ap; + fprintf(stderr, "warning: "); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fprintf(stderr, "\n"); } fz_error * -fz_throw0(const char *func, const char *file, int line, char *fmt, ...) +fz_throwimp(fz_error *cause, const char *func, const char *file, int line, char *fmt, ...) { - va_list ap; - fz_error *eo; + va_list ap; + fz_error *eo; - eo = fz_malloc(sizeof(fz_error)); - if (!eo) return fz_outofmem; + eo = fz_malloc(sizeof(fz_error)); + if (!eo) + return fz_outofmem; /* oops. we're *really* out of memory here. */ - eo->refs = 1; - strlcpy(eo->func, func, sizeof eo->func); - strlcpy(eo->file, file, sizeof eo->file); - eo->line = line; + eo->refs = 1; - va_start(ap, fmt); - vsnprintf(eo->msg, sizeof eo->msg, fmt, ap); - eo->msg[sizeof(eo->msg) - 1] = '\0'; - va_end(ap); + va_start(ap, fmt); + vsnprintf(eo->msg, sizeof eo->msg, fmt, ap); + eo->msg[sizeof(eo->msg) - 1] = '\0'; + va_end(ap); - if (getenv("BOMB")) - { - fflush(stdout); - fprintf(stderr, "%s:%d: %s(): %s\n", eo->file, eo->line, eo->func, eo->msg); - fflush(stderr); - abort(); - } + strlcpy(eo->func, func, sizeof eo->func); + strlcpy(eo->file, file, sizeof eo->file); + eo->line = line; - return eo; -} + if (cause) + eo->cause = fz_keeperror(cause); + else + eo->cause = nil; -void -fz_droperror(fz_error *eo) -{ - if (eo->refs > 0) - eo->refs--; - if (eo->refs == 0) - fz_free(eo); + return eo; } |