/*
LIBICONV TEST
These functions should be included in your application for testing
that libiconv library is linked with same runtime library version,
singlethreaded or multithreaded, as your application - it that case
calling IconvTest() returns 0 meaning "libiconv test successful".

Read also libiconv README for more information
http://www.gnu.org/software/libiconv/

You can make this standalone application by adding
#include "libparsifal/parsifal.h"
and
int main(int argc, char* argv[])
{
  switch (IconvTest()) {
    case 0: puts("\nlibiconv test successful."); break;
    case 1: puts("\nlibiconv test failed!\n"
      "Check that you're linking with same runtime lib as your libiconv."); break;
    case 2: puts("\nMemory alloc error!\n");  break;
    default: puts("\nUnknown error testing libiconv!\n");
  }
  return 0;
}
*/

#include "libparsifal/isrcmem.h"

int MemInputsrc(BYTE *buf, int cBytes, int *cBytesActual, void *inputData)
{
  XMLMEMINPUTSRC_HANDLE
}

int IconvTest() {
  int ret = -1; /* UNKNOWN ERROR */
  char *t = "\xFE\xFF\x00\x3C\x00\x7A\x00\x3E\xDF\x0F\x00\x3C\x00\x2F\x00\x7A\x00\x3E";
  /* UTF-16 (big endian) string (18 bytes): BOM and characters
     <z>*</z>
     where * is illegal character (low surrogate 0xdf0f) */
  LPXMLPARSER p = XMLParser_Create(&p);
  XMLMEMINPUTSRC meminput;
  XMLMEMINPUTSRC_INIT(&meminput, t, 18);
  if (!p) return 2; /* MEMORY ALLOC ERROR */
  XMLParser_Parse(p, MemInputsrc, &meminput, NULL);
  if (p->ErrorCode) {
    ret = (p->reader->encerr == EILSEQ) ? 0 /* SUCCESS */ : 1 /* FAILED */;
  }
  XMLParser_Free(p);
  return ret;
}