From 835e373b3eeaabcd0621ed6798ab500f37982fae Mon Sep 17 00:00:00 2001 From: Calvin Morrison Date: Wed, 5 Apr 2023 14:13:39 -0400 Subject: xpdf-no-select-disable --- xpdf/Error.cc | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 xpdf/Error.cc (limited to 'xpdf/Error.cc') diff --git a/xpdf/Error.cc b/xpdf/Error.cc new file mode 100644 index 0000000..5a97505 --- /dev/null +++ b/xpdf/Error.cc @@ -0,0 +1,92 @@ +//======================================================================== +// +// Error.cc +// +// Copyright 1996-2013 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include "gmempp.h" +#include "GString.h" +#include "GlobalParams.h" +#include "Error.h" + +const char *errorCategoryNames[] = { + "Syntax Warning", + "Syntax Error", + "Config Error", + "Command Line Error", + "I/O Error", + "Permission Error", + "Unimplemented Feature", + "Internal Error" +}; + +static void (*errorCbk)(void *data, ErrorCategory category, + int pos, char *msg) = NULL; +static void *errorCbkData = NULL; + +void setErrorCallback(void (*cbk)(void *data, ErrorCategory category, + int pos, char *msg), + void *data) { + errorCbk = cbk; + errorCbkData = data; +} + +void *getErrorCallbackData() { + return errorCbkData; +} + +void CDECL error(ErrorCategory category, GFileOffset pos, + const char *msg, ...) { + va_list args; + GString *s, *sanitized; + char c; + int i; + + // NB: this can be called before the globalParams object is created + if (!errorCbk && globalParams && globalParams->getErrQuiet()) { + return; + } + va_start(args, msg); + s = GString::formatv(msg, args); + va_end(args); + + // remove non-printable characters, just in case they might cause + // problems for the terminal program + sanitized = new GString(); + for (i = 0; i < s->getLength(); ++i) { + c = s->getChar(i); + if (c >= 0x20 && c <= 0x7e) { + sanitized->append(c); + } else { + sanitized->appendf("<{0:02x}>", c & 0xff); + } + } + + if (errorCbk) { + (*errorCbk)(errorCbkData, category, (int)pos, sanitized->getCString()); + } else { + fflush(stdout); + if (pos >= 0) { + fprintf(stderr, "%s (%d): %s\n", + errorCategoryNames[category], (int)pos, sanitized->getCString()); + } else { + fprintf(stderr, "%s: %s\n", + errorCategoryNames[category], sanitized->getCString()); + } + fflush(stderr); + } + + delete s; + delete sanitized; +} -- cgit v1.2.3