//======================================================================== // // Error.cc // // Copyright 1996-2003 Glyph & Cog, LLC // //======================================================================== //======================================================================== // // Modified under the Poppler project - http://poppler.freedesktop.org // // All changes made under the Poppler project to this file are licensed // under GPL version 2 or later // // Copyright (C) 2005, 2007 Jeff Muizelaar // Copyright (C) 2005 Albert Astals Cid // Copyright (C) 2007 Krzysztof Kowalczyk // Copyright (C) 2012 Marek Kasik // Copyright (C) 2013 Adrian Johnson // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git // //======================================================================== #include #ifdef USE_GCC_PRAGMAS #pragma implementation #endif #include #include #include #include "GooString.h" #include "GlobalParams.h" #include "Error.h" static 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, Goffset pos, char *msg) = NULL; static void *errorCbkData = NULL; void setErrorCallback(void (*cbk)(void *data, ErrorCategory category, Goffset pos, char *msg), void *data) { errorCbk = cbk; errorCbkData = data; } void CDECL error(ErrorCategory category, Goffset pos, const char *msg, ...) { va_list args; GooString *s, *sanitized; // NB: this can be called before the globalParams object is created if (!errorCbk && globalParams && globalParams->getErrQuiet()) { return; } va_start(args, msg); s = GooString::formatv(msg, args); va_end(args); sanitized = new GooString (); for (int i = 0; i < s->getLength(); ++i) { const char c = s->getChar(i); if (c < (char)0x20 || c >= (char)0x7f) { sanitized->appendf("<{0:02x}>", c & 0xff); } else { sanitized->append(c); } } if (errorCbk) { (*errorCbk)(errorCbkData, category, pos, sanitized->getCString()); } else { if (pos >= 0) { fprintf(stderr, "%s (%lld): %s\n", errorCategoryNames[category], (long long)pos, sanitized->getCString()); } else { fprintf(stderr, "%s: %s\n", errorCategoryNames[category], sanitized->getCString()); } fflush(stderr); } delete s; delete sanitized; }