X-Git-Url: http://git.imager.perl.org/imager.git/blobdiff_plain/f0960b14ef3c415ec87e69c8636fc81737099b48..7a1a2b568f62f2060779478f88a0c20ed2efc6fd:/error.c diff --git a/error.c b/error.c index 9876ac67..84785a2a 100644 --- a/error.c +++ b/error.c @@ -61,7 +61,7 @@ C). The Perl level won't use all of this. =cut */ -#include "image.h" +#include "imager.h" #include #include @@ -183,10 +183,15 @@ the mark. =over =item i_clear_error() +=synopsis i_clear_error(); +=category Error handling -Called by any imager function before doing any other processing. +Clears the error stack. -=cut */ +Called by any Imager function before doing any other processing. + +=cut +*/ void i_clear_error() { #ifdef IMAGER_DEBUG_MALLOC int i; @@ -204,8 +209,11 @@ void i_clear_error() { /* =item i_push_error(int code, char const *msg) +=synopsis i_push_error(0, "Yep, it's broken"); +=synopsis i_push_error(errno, "Error writing"); +=category Error handling -Called by an imager function to push an error message onto the stack. +Called by an Imager function to push an error message onto the stack. No message is pushed if the stack is full (since this means someone forgot to call i_clear_error(), or that a function that doesn't do @@ -214,7 +222,7 @@ error handling is calling function that does.). =cut */ void i_push_error(int code, char const *msg) { - int size = strlen(msg)+1; + size_t size = strlen(msg)+1; if (error_sp <= 0) /* bad, bad programmer */ @@ -239,16 +247,22 @@ void i_push_error(int code, char const *msg) { } /* -=item i_push_errorvf(int code, char const *fmt, va_list ap) +=item i_push_errorvf(int C, char const *C, va_list C) + +=category Error handling Intended for use by higher level functions, takes a varargs pointer and a format to produce the finally pushed error message. +Does not support perl specific format codes. + =cut */ void i_push_errorvf(int code, char const *fmt, va_list ap) { char buf[1024]; -#if defined(_MSC_VER) +#if defined(IMAGER_VSNPRINTF) + vsnprintf(buf, sizeof(buf), fmt, ap); +#elif defined(_MSC_VER) _vsnprintf(buf, sizeof(buf), fmt, ap); #else /* is there a way to detect vsnprintf()? @@ -262,8 +276,12 @@ void i_push_errorvf(int code, char const *fmt, va_list ap) { /* =item i_push_errorf(int code, char const *fmt, ...) +=synopsis i_push_errorf(errno, "Cannot open file %s: %d", filename, errno); +=category Error handling + +A version of i_push_error() that does printf() like formatting. -A version of i_push_error() that does printf() like formating. +Does not support perl specific format codes. =cut */ @@ -299,7 +317,7 @@ int i_failed(int code, char const *msg) { failed_cb(error_stack + error_sp); if (failures_fatal) { int sp; - int total; /* total length of error messages */ + size_t total; /* total length of error messages */ char *full; /* full message for logging */ if (argv0) fprintf(stderr, "%s: ", argv0); @@ -310,10 +328,14 @@ int i_failed(int code, char const *msg) { ++sp; } /* we want to log the error too, build an error message to hand to - m_fatal() */ + i_fatal() */ total = 1; /* remember the NUL */ for (sp = error_sp; error_stack[sp].msg; ++sp) { - total += strlen(error_stack[sp].msg) + 2; + size_t new_total += strlen(error_stack[sp].msg) + 2; + if (new_total < total) { + /* overflow, somehow */ + break; + } } full = mymalloc(total); if (!full) { @@ -327,7 +349,7 @@ int i_failed(int code, char const *msg) { } /* lose the extra ": " */ full[strlen(full)-2] = '\0'; - m_fatal(EXIT_FAILURE, "%s", full); + i_fatal(EXIT_FAILURE, "%s", full); } return 0; @@ -335,6 +357,21 @@ int i_failed(int code, char const *msg) { #endif +/* +=item im_assert_fail(file, line, message) + +Called when an im_assert() assertion fails. + +=cut +*/ + +void +im_assert_fail(char const *file, int line, char const *message) { + fprintf(stderr, "Assertion failed line %d file %s: %s\n", + line, file, message); + exit(EXIT_FAILURE); +} + /* =back