#include "mupdf/fitz.h"
#ifdef USE_OUTPUT_DEBUG_STRING
#include <windows.h>
#endif
void fz_var_imp(void *var)
{
UNUSED(var);
}
void fz_flush_warnings(fz_context *ctx)
{
if (ctx->warn->count > 1)
{
fprintf(stderr, "warning: ... repeated %d times ...\n", ctx->warn->count);
LOGE("warning: ... repeated %d times ...\n", ctx->warn->count);
}
ctx->warn->message[0] = 0;
ctx->warn->count = 0;
}
void fz_warn(fz_context *ctx, const char *fmt, ...)
{
va_list ap;
char buf[sizeof ctx->warn->message];
va_start(ap, fmt);
vsnprintf(buf, sizeof buf, fmt, ap);
va_end(ap);
#ifdef USE_OUTPUT_DEBUG_STRING
OutputDebugStringA(buf);
OutputDebugStringA("\n");
#endif
if (!strcmp(buf, ctx->warn->message))
{
ctx->warn->count++;
}
else
{
fz_flush_warnings(ctx);
fprintf(stderr, "warning: %s\n", buf);
LOGE("warning: %s\n", buf);
fz_strlcpy(ctx->warn->message, buf, sizeof ctx->warn->message);
ctx->warn->count = 1;
}
}
FZ_NORETURN static void throw(fz_error_context *ex);
static void throw(fz_error_context *ex)
{
if (ex->top >= 0)
{
fz_longjmp(ex->stack[ex->top].buffer, ex->stack[ex->top].code + 2);
}
else
{
fprintf(stderr, "uncaught exception: %s\n", ex->message);
LOGE("uncaught exception: %s\n", ex->message);
#ifdef USE_OUTPUT_DEBUG_STRING
OutputDebugStringA("uncaught exception: ");
OutputDebugStringA(ex->message);
OutputDebugStringA("\n");
#endif
exit(EXIT_FAILURE);
}
}
int fz_push_try(fz_error_context *ex)
{
assert(ex);
ex->top++;
if (ex->top < nelem(ex->stack)-1)
return 1;
assert(ex->top == nelem(ex->stack)-1);
strcpy(ex->message, "exception stack overflow!");
ex->stack[ex->top].code = 2;
fprintf(stderr, "error: %s\n", ex->message);
LOGE("error: %s\n", ex->message);
return 0;
}
int fz_caught(fz_context *ctx)
{
assert(ctx && ctx->error && ctx->error->errcode >= FZ_ERROR_NONE);
return ctx->error->errcode;
}
const char *fz_caught_message(fz_context *ctx)
{
assert(ctx && ctx->error && ctx->error->errcode >= FZ_ERROR_NONE);
return ctx->error->message;
}
void fz_throw(fz_context *ctx, int code, const char *fmt, ...)
{
va_list args;
ctx->error->errcode = code;
va_start(args, fmt);
vsnprintf(ctx->error->message, sizeof ctx->error->message, fmt, args);
va_end(args);
if (code != FZ_ERROR_ABORT)
{
fz_flush_warnings(ctx);
fprintf(stderr, "error: %s\n", ctx->error->message);
LOGE("error: %s\n", ctx->error->message);
#ifdef USE_OUTPUT_DEBUG_STRING
OutputDebugStringA("error: ");
OutputDebugStringA(ctx->error->message);
OutputDebugStringA("\n");
#endif
}
throw(ctx->error);
}
void fz_rethrow(fz_context *ctx)
{
assert(ctx && ctx->error && ctx->error->errcode >= FZ_ERROR_NONE);
throw(ctx->error);
}
void fz_rethrow_message(fz_context *ctx, const char *fmt, ...)
{
va_list args;
assert(ctx && ctx->error && ctx->error->errcode >= FZ_ERROR_NONE);
va_start(args, fmt);
vsnprintf(ctx->error->message, sizeof ctx->error->message, fmt, args);
va_end(args);
if (ctx->error->errcode != FZ_ERROR_ABORT)
{
fz_flush_warnings(ctx);
fprintf(stderr, "error: %s\n", ctx->error->message);
LOGE("error: %s\n", ctx->error->message);
#ifdef USE_OUTPUT_DEBUG_STRING
OutputDebugStringA("error: ");
OutputDebugStringA(ctx->error->message);
OutputDebugStringA("\n");
#endif
}
throw(ctx->error);
}
void fz_rethrow_if(fz_context *ctx, int err)
{
assert(ctx && ctx->error && ctx->error->errcode >= FZ_ERROR_NONE);
if (ctx->error->errcode == err)
fz_rethrow(ctx);
}