//========================================================================
//
// 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 <jeff@infidigm.net>
// Copyright (C) 2005, 2018 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2007 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
// Copyright (C) 2012 Marek Kasik <mkasik@redhat.com>
// Copyright (C) 2013, 2017 Adrian Johnson <ajohnson@redneon.com>
//
// 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 <config.h>
#include <poppler-config.h>

#include <stdio.h>
#include <stddef.h>
#include <stdarg.h>
#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, const char *msg) = nullptr;
static void *errorCbkData = nullptr;

void setErrorCallback(void (*cbk)(void *data, ErrorCategory category,
				  Goffset pos, const 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->c_str());
  } else {
    if (pos >= 0) {
      fprintf(stderr, "%s (%lld): %s\n",
	      errorCategoryNames[category], (long long)pos, sanitized->c_str());
    } else {
      fprintf(stderr, "%s: %s\n",
	      errorCategoryNames[category], sanitized->c_str());
    }
    fflush(stderr);
  }
  delete s;
  delete sanitized;
}
