15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * encoding.c : implements the encoding conversion functions needed for XML
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Related specs:
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * rfc2044        (UTF-8 and UTF-16) F. Yergeau Alis Technologies
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * rfc2781        UTF-16, an encoding of ISO 10646, P. Hoffman, F. Yergeau
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * [ISO-10646]    UTF-8 and UTF-16 in Annexes
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * [ISO-8859-1]   ISO Latin-1 characters codes.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * [UNICODE]      The Unicode Consortium, "The Unicode Standard --
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                Worldwide Character Encoding -- Version 1.0", Addison-
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                Wesley, Volume 1, 1991, Volume 2, 1992.  UTF-8 is
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                described in Unicode Technical Report #4.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * [US-ASCII]     Coded Character Set--7-bit American Standard Code for
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                Information Interchange, ANSI X3.4-1986.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * daniel@veillard.com
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Original code for IsoLatin1 and UTF-16 by "Martin J. Duerst" <duerst@w3.org>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBXML
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_CTYPE_H
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ctype.h>
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDLIB_H
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICONV_ENABLED
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ERRNO_H
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <errno.h>
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/encoding.h>
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h>
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTML_ENABLED
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/HTMLparser.h>
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/globals.h>
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlerror.h>
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCharEncodingHandlerPtr xmlUTF16LEHandler = NULL;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCharEncodingHandlerPtr xmlUTF16BEHandler = NULL;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlCharEncodingAlias xmlCharEncodingAlias;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlCharEncodingAlias *xmlCharEncodingAliasPtr;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlCharEncodingAlias {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *name;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *alias;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCharEncodingAliasPtr xmlCharEncodingAliases = NULL;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlCharEncodingAliasesNb = 0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlCharEncodingAliasesMax = 0;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_ICONV_ENABLED) || defined(LIBXML_ICU_ENABLED)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_ENCODING  /* Define this to get encoding traces */
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ISO8859X_ENABLED
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void xmlRegisterCharEncodingHandlersISO8859x (void);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlLittleEndian = 1;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlEncodingErrMemory:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra:  extra informations
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle an out of memory condition
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEncodingErrMemory(const char *extra)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlSimpleError(XML_FROM_I18N, XML_ERR_NO_MEMORY, NULL, NULL, extra);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlErrEncoding:
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error:  the error number
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the error message
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * n encoding error
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEncodingErr(xmlParserErrors error, const char *msg, const char *val)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlRaiseError(NULL, NULL, NULL, NULL, NULL,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    XML_FROM_I18N, error, XML_ERR_FATAL,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    NULL, 0, val, NULL, NULL, 0, 0, msg, val);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICU_ENABLED
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static uconv_t*
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)openIcuConverter(const char* name, int toUnicode)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UErrorCode status = U_ZERO_ERROR;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uconv_t *conv = (uconv_t *) xmlMalloc(sizeof(uconv_t));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (conv == NULL)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  conv->uconv = ucnv_open(name, &status);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (U_FAILURE(status))
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto error;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = U_ZERO_ERROR;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (toUnicode) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ucnv_setToUCallBack(conv->uconv, UCNV_TO_U_CALLBACK_STOP,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        NULL, NULL, NULL, &status);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ucnv_setFromUCallBack(conv->uconv, UCNV_FROM_U_CALLBACK_STOP,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        NULL, NULL, NULL, &status);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (U_FAILURE(status))
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto error;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = U_ZERO_ERROR;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  conv->utf8 = ucnv_open("UTF-8", &status);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (U_SUCCESS(status))
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return conv;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error:
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (conv->uconv)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ucnv_close(conv->uconv);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  xmlFree(conv);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)closeIcuConverter(uconv_t *conv)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (conv != NULL) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ucnv_close(conv->uconv);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ucnv_close(conv->utf8);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(conv);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICU_ENABLED */
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Conversions To/From UTF8 encoding			*
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * asciiToUTF8:
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a pointer to an array of bytes to store the result
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @out
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a pointer to an array of ASCII chars
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlen:  the length of @in
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Take a block of ASCII chars in and try to convert it to an UTF-8
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * block of chars out.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if success, or -1 otherwise
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @inlen after return is the number of octets consumed
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     if the return value is positive, else unpredictable.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @outlen after return is the number of octets consumed.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)asciiToUTF8(unsigned char* out, int *outlen,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const unsigned char* in, int *inlen) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char* outstart = out;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* base = in;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* processed = in;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char* outend = out + *outlen;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* inend;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int c;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inend = in + (*inlen);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((in < inend) && (out - outstart + 5 < *outlen)) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	c= *in++;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (out >= outend)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (c < 0x80) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = c;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *outlen = out - outstart;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *inlen = processed - base;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	processed = (const unsigned char*) in;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outlen = out - outstart;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *inlen = processed - base;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(*outlen);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * UTF8Toascii:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a pointer to an array of bytes to store the result
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @out
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a pointer to an array of UTF-8 chars
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlen:  the length of @in
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Take a block of UTF-8 chars in and try to convert it to an ASCII
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * block of chars out.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @inlen after return is the number of octets consumed
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     if the return value is positive, else unpredictable.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @outlen after return is the number of octets consumed.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UTF8Toascii(unsigned char* out, int *outlen,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const unsigned char* in, int *inlen) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* processed = in;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* outend;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* outstart = out;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* instart = in;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* inend;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int c, d;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int trailing;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in == NULL) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * initialization nothing to do
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*outlen = 0;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*inlen = 0;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inend = in + (*inlen);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outend = out + (*outlen);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (in < inend) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	d = *in++;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if      (d < 0x80)  { c= d; trailing= 0; }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (d < 0xC0) {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* trailing byte in leading position */
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *outlen = out - outstart;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *inlen = processed - instart;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-2);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (d < 0xE0)  { c= d & 0x1F; trailing= 1; }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (d < 0xF0)  { c= d & 0x0F; trailing= 2; }
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (d < 0xF8)  { c= d & 0x07; trailing= 3; }
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* no chance for this in Ascii */
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *outlen = out - outstart;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *inlen = processed - instart;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-2);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (inend - in < trailing) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for ( ; trailing; trailing--) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80))
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c <<= 6;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c |= d & 0x3F;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* assertion: c is a single UTF-4 value */
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (c < 0x80) {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (out >= outend)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = c;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* no chance for this in Ascii */
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *outlen = out - outstart;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *inlen = processed - instart;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-2);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	processed = in;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outlen = out - outstart;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *inlen = processed - instart;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(*outlen);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * isolat1ToUTF8:
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a pointer to an array of bytes to store the result
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @out
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a pointer to an array of ISO Latin 1 chars
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlen:  the length of @in
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Take a block of ISO Latin 1 chars in and try to convert it to an UTF-8
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * block of chars out.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written if success, or -1 otherwise
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @inlen after return is the number of octets consumed
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     if the return value is positive, else unpredictable.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @outlen after return is the number of octets consumed.
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)isolat1ToUTF8(unsigned char* out, int *outlen,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const unsigned char* in, int *inlen) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char* outstart = out;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* base = in;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char* outend;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* inend;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* instop;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out == NULL) || (in == NULL) || (outlen == NULL) || (inlen == NULL))
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outend = out + *outlen;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inend = in + (*inlen);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instop = inend;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (in < inend && out < outend - 1) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	if (*in >= 0x80) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = (((*in) >>  6) & 0x1F) | 0xC0;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *out++ = ((*in) & 0x3F) | 0x80;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ++in;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (instop - in > outend - out) instop = in + (outend - out);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (in < instop && *in < 0x80) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = *in++;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in < inend && out < outend && *in < 0x80) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *out++ = *in++;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outlen = out - outstart;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *inlen = in - base;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(*outlen);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * UTF8ToUTF8:
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a pointer to an array of bytes to store the result
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @out
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inb:  a pointer to an array of UTF-8 chars
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlenb:  the length of @in in UTF-8 chars
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * No op copy operation for UTF8 handling.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written, or -1 if lack of space.
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     The value of *inlen after return is the number of octets consumed
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     if the return value is positive, else unpredictable.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UTF8ToUTF8(unsigned char* out, int *outlen,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           const unsigned char* inb, int *inlenb)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out == NULL) || (inb == NULL) || (outlen == NULL) || (inlenb == NULL))
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*outlen > *inlenb) {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	len = *inlenb;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	len = *outlen;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len < 0)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(out, inb, len);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outlen = len;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *inlenb = len;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(*outlen);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * UTF8Toisolat1:
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a pointer to an array of bytes to store the result
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @out
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a pointer to an array of UTF-8 chars
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlen:  the length of @in
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Take a block of UTF-8 chars in and try to convert it to an ISO Latin 1
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * block of chars out.
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written if success, -2 if the transcoding fails,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           or -1 otherwise
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @inlen after return is the number of octets consumed
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     if the return value is positive, else unpredictable.
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @outlen after return is the number of octets consumed.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UTF8Toisolat1(unsigned char* out, int *outlen,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const unsigned char* in, int *inlen) {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* processed = in;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* outend;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* outstart = out;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* instart = in;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* inend;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int c, d;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int trailing;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in == NULL) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * initialization nothing to do
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*outlen = 0;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*inlen = 0;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inend = in + (*inlen);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outend = out + (*outlen);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (in < inend) {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	d = *in++;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if      (d < 0x80)  { c= d; trailing= 0; }
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (d < 0xC0) {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* trailing byte in leading position */
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *outlen = out - outstart;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *inlen = processed - instart;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-2);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (d < 0xE0)  { c= d & 0x1F; trailing= 1; }
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (d < 0xF0)  { c= d & 0x0F; trailing= 2; }
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (d < 0xF8)  { c= d & 0x07; trailing= 3; }
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* no chance for this in IsoLat1 */
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *outlen = out - outstart;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *inlen = processed - instart;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-2);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (inend - in < trailing) {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for ( ; trailing; trailing--) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (in >= inend)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (((d= *in++) & 0xC0) != 0x80) {
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*outlen = out - outstart;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*inlen = processed - instart;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-2);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c <<= 6;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c |= d & 0x3F;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* assertion: c is a single UTF-4 value */
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (c <= 0xFF) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (out >= outend)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = c;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* no chance for this in IsoLat1 */
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *outlen = out - outstart;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *inlen = processed - instart;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-2);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	processed = in;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outlen = out - outstart;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *inlen = processed - instart;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(*outlen);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * UTF16LEToUTF8:
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a pointer to an array of bytes to store the result
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @out
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inb:  a pointer to an array of UTF-16LE passwd as a byte array
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlenb:  the length of @in in UTF-16LE chars
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Take a block of UTF-16LE ushorts in and try to convert it to an UTF-8
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * block of chars out. This function assumes the endian property
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is the same between the native type of this machine and the
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * inputed one.
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written, or -1 if lack of space, or -2
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     if the transcoding fails (if *in is not a valid utf16 string)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     The value of *inlen after return is the number of octets consumed
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     if the return value is positive, else unpredictable.
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UTF16LEToUTF8(unsigned char* out, int *outlen,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const unsigned char* inb, int *inlenb)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char* outstart = out;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* processed = inb;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char* outend = out + *outlen;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned short* in = (unsigned short*) inb;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned short* inend;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int c, d, inlen;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char *tmp;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int bits;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*inlenb % 2) == 1)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (*inlenb)--;
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inlen = *inlenb / 2;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inend = in + inlen;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((in < inend) && (out - outstart + 5 < *outlen)) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (xmlLittleEndian) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c= *in++;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = (unsigned char *) in;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = *tmp++;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = c | (((unsigned int)*tmp) << 8);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    in++;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((c & 0xFC00) == 0xD800) {    /* surrogates */
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (in >= inend) {           /* (in > inend) shouldn't happens */
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlLittleEndian) {
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		d = *in++;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = (unsigned char *) in;
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		d = *tmp++;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		d = d | (((unsigned int)*tmp) << 8);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		in++;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((d & 0xFC00) == 0xDC00) {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                c &= 0x03FF;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                c <<= 10;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                c |= d & 0x03FF;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                c += 0x10000;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*outlen = out - outstart;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*inlenb = processed - inb;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        return(-2);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* assertion: c is a single UTF-4 value */
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (out >= outend)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if      (c <    0x80) {  *out++=  c;                bits= -6; }
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (c <   0x800) {  *out++= ((c >>  6) & 0x1F) | 0xC0;  bits=  0; }
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (c < 0x10000) {  *out++= ((c >> 12) & 0x0F) | 0xE0;  bits=  6; }
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else                  {  *out++= ((c >> 18) & 0x07) | 0xF0;  bits= 12; }
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for ( ; bits >= 0; bits-= 6) {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (out >= outend)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        break;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *out++= ((c >> bits) & 0x3F) | 0x80;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	processed = (const unsigned char*) in;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outlen = out - outstart;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *inlenb = processed - inb;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(*outlen);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * UTF8ToUTF16LE:
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outb:  a pointer to an array of bytes to store the result
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @outb
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a pointer to an array of UTF-8 chars
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlen:  the length of @in
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Take a block of UTF-8 chars in and try to convert it to an UTF-16LE
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * block of chars out.
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written, or -1 if lack of space, or -2
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     if the transcoding failed.
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UTF8ToUTF16LE(unsigned char* outb, int *outlen,
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const unsigned char* in, int *inlen)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned short* out = (unsigned short*) outb;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* processed = in;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char *const instart = in;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned short* outstart= out;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned short* outend;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* inend;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int c, d;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int trailing;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char *tmp;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned short tmp1, tmp2;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* UTF16LE encoding has no BOM */
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in == NULL) {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*outlen = 0;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*inlen = 0;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inend= in + *inlen;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outend = out + (*outlen / 2);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (in < inend) {
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      d= *in++;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if      (d < 0x80)  { c= d; trailing= 0; }
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (d < 0xC0) {
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* trailing byte in leading position */
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  *outlen = (out - outstart) * 2;
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  *inlen = processed - instart;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  return(-2);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (d < 0xE0)  { c= d & 0x1F; trailing= 1; }
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (d < 0xF0)  { c= d & 0x0F; trailing= 2; }
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (d < 0xF8)  { c= d & 0x07; trailing= 3; }
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else {
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* no chance for this in UTF-16 */
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*outlen = (out - outstart) * 2;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*inlen = processed - instart;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-2);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (inend - in < trailing) {
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for ( ; trailing; trailing--) {
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80))
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          c <<= 6;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          c |= d & 0x3F;
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* assertion: c is a single UTF-4 value */
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (c < 0x10000) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (out >= outend)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        break;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlLittleEndian) {
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*out++ = c;
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = (unsigned char *) out;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*tmp = c ;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*(tmp + 1) = c >> 8 ;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out++;
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (c < 0x110000) {
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (out+1 >= outend)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        break;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c -= 0x10000;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlLittleEndian) {
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*out++ = 0xD800 | (c >> 10);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*out++ = 0xDC00 | (c & 0x03FF);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp1 = 0xD800 | (c >> 10);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = (unsigned char *) out;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*tmp = (unsigned char) tmp1;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*(tmp + 1) = tmp1 >> 8;
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out++;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp2 = 0xDC00 | (c & 0x03FF);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = (unsigned char *) out;
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*tmp  = (unsigned char) tmp2;
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*(tmp + 1) = tmp2 >> 8;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out++;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	processed = in;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outlen = (out - outstart) * 2;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *inlen = processed - instart;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(*outlen);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * UTF8ToUTF16:
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outb:  a pointer to an array of bytes to store the result
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @outb
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a pointer to an array of UTF-8 chars
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlen:  the length of @in
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Take a block of UTF-8 chars in and try to convert it to an UTF-16
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * block of chars out.
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written, or -1 if lack of space, or -2
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     if the transcoding failed.
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UTF8ToUTF16(unsigned char* outb, int *outlen,
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const unsigned char* in, int *inlen)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in == NULL) {
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * initialization, add the Byte Order Mark for UTF-16LE
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (*outlen >= 2) {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    outb[0] = 0xFF;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    outb[1] = 0xFE;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *outlen = 2;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *inlen = 0;
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Added FFFE Byte Order Mark\n");
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(2);
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*outlen = 0;
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*inlen = 0;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (UTF8ToUTF16LE(outb, outlen, in, inlen));
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * UTF16BEToUTF8:
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a pointer to an array of bytes to store the result
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @out
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inb:  a pointer to an array of UTF-16 passed as a byte array
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlenb:  the length of @in in UTF-16 chars
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Take a block of UTF-16 ushorts in and try to convert it to an UTF-8
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * block of chars out. This function assumes the endian property
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is the same between the native type of this machine and the
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * inputed one.
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written, or -1 if lack of space, or -2
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     if the transcoding fails (if *in is not a valid utf16 string)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of *inlen after return is the number of octets consumed
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     if the return value is positive, else unpredictable.
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UTF16BEToUTF8(unsigned char* out, int *outlen,
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const unsigned char* inb, int *inlenb)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char* outstart = out;
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* processed = inb;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char* outend = out + *outlen;
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned short* in = (unsigned short*) inb;
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned short* inend;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int c, d, inlen;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char *tmp;
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int bits;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*inlenb % 2) == 1)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (*inlenb)--;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inlen = *inlenb / 2;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inend= in + inlen;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (in < inend) {
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlLittleEndian) {
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = (unsigned char *) in;
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = *tmp++;
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = c << 8;
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = c | (unsigned int) *tmp;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    in++;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c= *in++;
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((c & 0xFC00) == 0xD800) {    /* surrogates */
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (in >= inend) {           /* (in > inend) shouldn't happens */
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*outlen = out - outstart;
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*inlenb = processed - inb;
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        return(-2);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlLittleEndian) {
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = (unsigned char *) in;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		d = *tmp++;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		d = d << 8;
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		d = d | (unsigned int) *tmp;
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		in++;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		d= *in++;
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((d & 0xFC00) == 0xDC00) {
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                c &= 0x03FF;
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                c <<= 10;
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                c |= d & 0x03FF;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                c += 0x10000;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else {
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*outlen = out - outstart;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*inlenb = processed - inb;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        return(-2);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* assertion: c is a single UTF-4 value */
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (out >= outend)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if      (c <    0x80) {  *out++=  c;                bits= -6; }
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (c <   0x800) {  *out++= ((c >>  6) & 0x1F) | 0xC0;  bits=  0; }
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (c < 0x10000) {  *out++= ((c >> 12) & 0x0F) | 0xE0;  bits=  6; }
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else                  {  *out++= ((c >> 18) & 0x07) | 0xF0;  bits= 12; }
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for ( ; bits >= 0; bits-= 6) {
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (out >= outend)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        break;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *out++= ((c >> bits) & 0x3F) | 0x80;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	processed = (const unsigned char*) in;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outlen = out - outstart;
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *inlenb = processed - inb;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(*outlen);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * UTF8ToUTF16BE:
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outb:  a pointer to an array of bytes to store the result
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @outb
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a pointer to an array of UTF-8 chars
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlen:  the length of @in
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Take a block of UTF-8 chars in and try to convert it to an UTF-16BE
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * block of chars out.
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of byte written, or -1 by lack of space, or -2
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     if the transcoding failed.
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UTF8ToUTF16BE(unsigned char* outb, int *outlen,
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const unsigned char* in, int *inlen)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned short* out = (unsigned short*) outb;
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* processed = in;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char *const instart = in;
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned short* outstart= out;
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned short* outend;
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* inend;
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int c, d;
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int trailing;
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char *tmp;
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned short tmp1, tmp2;
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* UTF-16BE has no BOM */
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((outb == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1);
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in == NULL) {
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*outlen = 0;
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*inlen = 0;
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inend= in + *inlen;
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outend = out + (*outlen / 2);
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (in < inend) {
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      d= *in++;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if      (d < 0x80)  { c= d; trailing= 0; }
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (d < 0xC0)  {
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* trailing byte in leading position */
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  *outlen = out - outstart;
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  *inlen = processed - instart;
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  return(-2);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (d < 0xE0)  { c= d & 0x1F; trailing= 1; }
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (d < 0xF0)  { c= d & 0x0F; trailing= 2; }
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (d < 0xF8)  { c= d & 0x07; trailing= 3; }
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else {
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* no chance for this in UTF-16 */
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  *outlen = out - outstart;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  *inlen = processed - instart;
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  return(-2);
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (inend - in < trailing) {
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for ( ; trailing; trailing--) {
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80))  break;
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          c <<= 6;
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          c |= d & 0x3F;
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* assertion: c is a single UTF-4 value */
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (c < 0x10000) {
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (out >= outend)  break;
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlLittleEndian) {
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = (unsigned char *) out;
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*tmp = c >> 8;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*(tmp + 1) = c;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out++;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*out++ = c;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (c < 0x110000) {
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (out+1 >= outend)  break;
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c -= 0x10000;
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlLittleEndian) {
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp1 = 0xD800 | (c >> 10);
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = (unsigned char *) out;
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*tmp = tmp1 >> 8;
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*(tmp + 1) = (unsigned char) tmp1;
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out++;
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp2 = 0xDC00 | (c & 0x03FF);
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = (unsigned char *) out;
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*tmp = tmp2 >> 8;
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*(tmp + 1) = (unsigned char) tmp2;
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out++;
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*out++ = 0xD800 | (c >> 10);
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*out++ = 0xDC00 | (c & 0x03FF);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	processed = in;
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outlen = (out - outstart) * 2;
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *inlen = processed - instart;
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(*outlen);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Generic encoding handling routines			*
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDetectCharEncoding:
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a pointer to the first bytes of the XML entity, must be at least
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       2 bytes long (at least 4 if encoding is UTF4 variant).
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  pointer to the length of the buffer
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Guess the encoding of the entity using the first bytes of the entity content
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * according to the non-normative appendix F of the XML-1.0 recommendation.
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns one of the XML_CHAR_ENCODING_... values.
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCharEncoding
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDetectCharEncoding(const unsigned char* in, int len)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in == NULL)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(XML_CHAR_ENCODING_NONE);
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len >= 4) {
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((in[0] == 0x00) && (in[1] == 0x00) &&
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (in[2] == 0x00) && (in[3] == 0x3C))
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_CHAR_ENCODING_UCS4BE);
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((in[0] == 0x3C) && (in[1] == 0x00) &&
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (in[2] == 0x00) && (in[3] == 0x00))
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_CHAR_ENCODING_UCS4LE);
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((in[0] == 0x00) && (in[1] == 0x00) &&
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (in[2] == 0x3C) && (in[3] == 0x00))
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_CHAR_ENCODING_UCS4_2143);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((in[0] == 0x00) && (in[1] == 0x3C) &&
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (in[2] == 0x00) && (in[3] == 0x00))
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_CHAR_ENCODING_UCS4_3412);
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((in[0] == 0x4C) && (in[1] == 0x6F) &&
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (in[2] == 0xA7) && (in[3] == 0x94))
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_CHAR_ENCODING_EBCDIC);
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((in[0] == 0x3C) && (in[1] == 0x3F) &&
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (in[2] == 0x78) && (in[3] == 0x6D))
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_CHAR_ENCODING_UTF8);
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Although not part of the recommendation, we also
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * attempt an "auto-recognition" of UTF-16LE and
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * UTF-16BE encodings.
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((in[0] == 0x3C) && (in[1] == 0x00) &&
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (in[2] == 0x3F) && (in[3] == 0x00))
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_CHAR_ENCODING_UTF16LE);
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((in[0] == 0x00) && (in[1] == 0x3C) &&
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (in[2] == 0x00) && (in[3] == 0x3F))
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_CHAR_ENCODING_UTF16BE);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len >= 3) {
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Errata on XML-1.0 June 20 2001
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * We now allow an UTF8 encoded BOM
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((in[0] == 0xEF) && (in[1] == 0xBB) &&
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (in[2] == 0xBF))
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_CHAR_ENCODING_UTF8);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* For UTF-16 we can recognize by the BOM */
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len >= 2) {
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((in[0] == 0xFE) && (in[1] == 0xFF))
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_CHAR_ENCODING_UTF16BE);
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((in[0] == 0xFF) && (in[1] == 0xFE))
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_CHAR_ENCODING_UTF16LE);
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(XML_CHAR_ENCODING_NONE);
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCleanupEncodingAliases:
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unregisters all aliases
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCleanupEncodingAliases(void) {
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlCharEncodingAliases == NULL)
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;i < xmlCharEncodingAliasesNb;i++) {
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlCharEncodingAliases[i].name != NULL)
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree((char *) xmlCharEncodingAliases[i].name);
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlCharEncodingAliases[i].alias != NULL)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree((char *) xmlCharEncodingAliases[i].alias);
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCharEncodingAliasesNb = 0;
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCharEncodingAliasesMax = 0;
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(xmlCharEncodingAliases);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCharEncodingAliases = NULL;
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetEncodingAlias:
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @alias:  the alias name as parsed, in UTF-8 format (ASCII actually)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Lookup an encoding name for the given alias.
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns NULL if not found, otherwise the original name
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetEncodingAlias(const char *alias) {
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char upper[100];
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (alias == NULL)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlCharEncodingAliases == NULL)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;i < 99;i++) {
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        upper[i] = toupper(alias[i]);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (upper[i] == 0) break;
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    upper[i] = 0;
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Walk down the list looking for a definition of the alias
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;i < xmlCharEncodingAliasesNb;i++) {
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!strcmp(xmlCharEncodingAliases[i].alias, upper)) {
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(xmlCharEncodingAliases[i].name);
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlAddEncodingAlias:
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the encoding name as parsed, in UTF-8 format (ASCII actually)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @alias:  the alias name as parsed, in UTF-8 format (ASCII actually)
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Registers an alias @alias for an encoding named @name. Existing alias
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * will be overwritten.
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, -1 in case of error
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAddEncodingAlias(const char *name, const char *alias) {
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char upper[100];
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((name == NULL) || (alias == NULL))
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;i < 99;i++) {
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        upper[i] = toupper(alias[i]);
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (upper[i] == 0) break;
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    upper[i] = 0;
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlCharEncodingAliases == NULL) {
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCharEncodingAliasesNb = 0;
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCharEncodingAliasesMax = 20;
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCharEncodingAliases = (xmlCharEncodingAliasPtr)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      xmlMalloc(xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias));
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlCharEncodingAliases == NULL)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlCharEncodingAliasesNb >= xmlCharEncodingAliasesMax) {
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCharEncodingAliasesMax *= 2;
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCharEncodingAliases = (xmlCharEncodingAliasPtr)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      xmlRealloc(xmlCharEncodingAliases,
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		         xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias));
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Walk down the list looking for a definition of the alias
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;i < xmlCharEncodingAliasesNb;i++) {
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!strcmp(xmlCharEncodingAliases[i].alias, upper)) {
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * Replace the definition.
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree((char *) xmlCharEncodingAliases[i].name);
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlCharEncodingAliases[i].name = xmlMemStrdup(name);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(0);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Add the definition
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCharEncodingAliases[xmlCharEncodingAliasesNb].name = xmlMemStrdup(name);
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCharEncodingAliases[xmlCharEncodingAliasesNb].alias = xmlMemStrdup(upper);
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCharEncodingAliasesNb++;
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDelEncodingAlias:
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @alias:  the alias name as parsed, in UTF-8 format (ASCII actually)
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unregisters an encoding alias @alias
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, -1 in case of error
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDelEncodingAlias(const char *alias) {
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (alias == NULL)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlCharEncodingAliases == NULL)
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Walk down the list looking for a definition of the alias
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;i < xmlCharEncodingAliasesNb;i++) {
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!strcmp(xmlCharEncodingAliases[i].alias, alias)) {
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree((char *) xmlCharEncodingAliases[i].name);
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree((char *) xmlCharEncodingAliases[i].alias);
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlCharEncodingAliasesNb--;
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    memmove(&xmlCharEncodingAliases[i], &xmlCharEncodingAliases[i + 1],
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    sizeof(xmlCharEncodingAlias) * (xmlCharEncodingAliasesNb - i));
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(0);
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(-1);
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParseCharEncoding:
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the encoding name as parsed, in UTF-8 format (ASCII actually)
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compare the string to the encoding schemes already known. Note
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that the comparison is case insensitive accordingly to the section
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * [XML] 4.3.3 Character Encoding in Entities.
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns one of the XML_CHAR_ENCODING_... values or XML_CHAR_ENCODING_NONE
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if not recognized.
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCharEncoding
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParseCharEncoding(const char* name)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *alias;
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char upper[500];
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL)
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(XML_CHAR_ENCODING_NONE);
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Do the alias resolution
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    alias = xmlGetEncodingAlias(name);
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (alias != NULL)
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	name = alias;
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;i < 499;i++) {
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        upper[i] = toupper(name[i]);
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (upper[i] == 0) break;
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    upper[i] = 0;
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper, "")) return(XML_CHAR_ENCODING_NONE);
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper, "UTF-8")) return(XML_CHAR_ENCODING_UTF8);
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper, "UTF8")) return(XML_CHAR_ENCODING_UTF8);
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * NOTE: if we were able to parse this, the endianness of UTF16 is
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *       already found and in use
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper, "UTF-16")) return(XML_CHAR_ENCODING_UTF16LE);
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper, "UTF16")) return(XML_CHAR_ENCODING_UTF16LE);
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper, "ISO-10646-UCS-2")) return(XML_CHAR_ENCODING_UCS2);
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper, "UCS-2")) return(XML_CHAR_ENCODING_UCS2);
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper, "UCS2")) return(XML_CHAR_ENCODING_UCS2);
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * NOTE: if we were able to parse this, the endianness of UCS4 is
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *       already found and in use
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper, "ISO-10646-UCS-4")) return(XML_CHAR_ENCODING_UCS4LE);
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper, "UCS-4")) return(XML_CHAR_ENCODING_UCS4LE);
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper, "UCS4")) return(XML_CHAR_ENCODING_UCS4LE);
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper,  "ISO-8859-1")) return(XML_CHAR_ENCODING_8859_1);
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper,  "ISO-LATIN-1")) return(XML_CHAR_ENCODING_8859_1);
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper,  "ISO LATIN 1")) return(XML_CHAR_ENCODING_8859_1);
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper,  "ISO-8859-2")) return(XML_CHAR_ENCODING_8859_2);
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper,  "ISO-LATIN-2")) return(XML_CHAR_ENCODING_8859_2);
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper,  "ISO LATIN 2")) return(XML_CHAR_ENCODING_8859_2);
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper,  "ISO-8859-3")) return(XML_CHAR_ENCODING_8859_3);
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper,  "ISO-8859-4")) return(XML_CHAR_ENCODING_8859_4);
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper,  "ISO-8859-5")) return(XML_CHAR_ENCODING_8859_5);
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper,  "ISO-8859-6")) return(XML_CHAR_ENCODING_8859_6);
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper,  "ISO-8859-7")) return(XML_CHAR_ENCODING_8859_7);
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper,  "ISO-8859-8")) return(XML_CHAR_ENCODING_8859_8);
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper,  "ISO-8859-9")) return(XML_CHAR_ENCODING_8859_9);
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper, "ISO-2022-JP")) return(XML_CHAR_ENCODING_2022_JP);
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper, "SHIFT_JIS")) return(XML_CHAR_ENCODING_SHIFT_JIS);
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(upper, "EUC-JP")) return(XML_CHAR_ENCODING_EUC_JP);
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "Unknown encoding %s\n", name);
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(XML_CHAR_ENCODING_ERROR);
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetCharEncodingName:
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @enc:  the encoding
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The "canonical" name for XML encoding.
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * C.f. http://www.w3.org/TR/REC-xml#charencoding
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Section 4.3.3  Character Encoding in Entities
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the canonical name for the given encoding
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char*
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetCharEncodingName(xmlCharEncoding enc) {
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (enc) {
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_ERROR:
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_NONE:
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UTF8:
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return("UTF-8");
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UTF16LE:
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return("UTF-16");
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UTF16BE:
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return("UTF-16");
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_EBCDIC:
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return("EBCDIC");
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UCS4LE:
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return("ISO-10646-UCS-4");
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UCS4BE:
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return("ISO-10646-UCS-4");
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UCS4_2143:
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return("ISO-10646-UCS-4");
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UCS4_3412:
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return("ISO-10646-UCS-4");
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UCS2:
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return("ISO-10646-UCS-2");
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_1:
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return("ISO-8859-1");
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_2:
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return("ISO-8859-2");
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_3:
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return("ISO-8859-3");
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_4:
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return("ISO-8859-4");
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_5:
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return("ISO-8859-5");
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_6:
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return("ISO-8859-6");
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_7:
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return("ISO-8859-7");
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_8:
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return("ISO-8859-8");
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_9:
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return("ISO-8859-9");
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_2022_JP:
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return("ISO-2022-JP");
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_SHIFT_JIS:
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return("Shift-JIS");
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_EUC_JP:
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return("EUC-JP");
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_CHAR_ENCODING_ASCII:
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Char encoding handlers				*
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* the size should be growable, but it's not a big deal ... */
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_ENCODING_HANDLERS 50
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCharEncodingHandlerPtr *handlers = NULL;
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int nbCharEncodingHandler = 0;
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The default is UTF-8 for XML, that's also the default used for the
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parser internals, so the default encoding handler is NULL
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCharEncodingHandlerPtr xmlDefaultCharEncodingHandler = NULL;
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewCharEncodingHandler:
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the encoding name, in UTF-8 format (ASCII actually)
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @input:  the xmlCharEncodingInputFunc to read that encoding
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the xmlCharEncodingOutputFunc to write that encoding
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create and registers an xmlCharEncodingHandler.
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlCharEncodingHandlerPtr created (or NULL in case of error).
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCharEncodingHandlerPtr
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewCharEncodingHandler(const char *name,
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          xmlCharEncodingInputFunc input,
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          xmlCharEncodingOutputFunc output) {
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCharEncodingHandlerPtr handler;
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *alias;
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char upper[500];
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *up = NULL;
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Do the alias resolution
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    alias = xmlGetEncodingAlias(name);
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (alias != NULL)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	name = alias;
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Keep only the uppercase version of the encoding.
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) {
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlEncodingErr(XML_I18N_NO_NAME,
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       "xmlNewCharEncodingHandler : no name !\n", NULL);
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;i < 499;i++) {
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        upper[i] = toupper(name[i]);
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (upper[i] == 0) break;
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    upper[i] = 0;
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    up = xmlMemStrdup(upper);
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (up == NULL) {
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlEncodingErrMemory("xmlNewCharEncodingHandler : out of memory !\n");
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * allocate and fill-up an handler block.
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handler = (xmlCharEncodingHandlerPtr)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              xmlMalloc(sizeof(xmlCharEncodingHandler));
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handler == NULL) {
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(up);
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlEncodingErrMemory("xmlNewCharEncodingHandler : out of memory !\n");
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handler->input = input;
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handler->output = output;
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handler->name = up;
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICONV_ENABLED
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handler->iconv_in = NULL;
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handler->iconv_out = NULL;
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICU_ENABLED
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handler->uconv_in = NULL;
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handler->uconv_out = NULL;
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * registers and returns the handler.
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRegisterCharEncodingHandler(handler);
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext,
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Registered encoding handler for %s\n", name);
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(handler);
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlInitCharEncodingHandlers:
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Initialize the char encoding support, it registers the default
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * encoding supported.
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: while public, this function usually doesn't need to be called
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       in normal processing.
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlInitCharEncodingHandlers(void) {
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned short int tst = 0x1234;
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char *ptr = (unsigned char *) &tst;
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handlers != NULL) return;
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handlers = (xmlCharEncodingHandlerPtr *)
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlMalloc(MAX_ENCODING_HANDLERS * sizeof(xmlCharEncodingHandlerPtr));
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*ptr == 0x12) xmlLittleEndian = 0;
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (*ptr == 0x34) xmlLittleEndian = 1;
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlEncodingErr(XML_ERR_INTERNAL_ERROR,
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	               "Odd problem at endianness detection\n", NULL);
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handlers == NULL) {
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlEncodingErrMemory("xmlInitCharEncodingHandlers : out of memory !\n");
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler("UTF-8", UTF8ToUTF8, UTF8ToUTF8);
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlUTF16LEHandler =
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          xmlNewCharEncodingHandler("UTF-16LE", UTF16LEToUTF8, UTF8ToUTF16LE);
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlUTF16BEHandler =
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          xmlNewCharEncodingHandler("UTF-16BE", UTF16BEToUTF8, UTF8ToUTF16BE);
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler("UTF-16", UTF16LEToUTF8, UTF8ToUTF16);
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler("ISO-8859-1", isolat1ToUTF8, UTF8Toisolat1);
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler("ASCII", asciiToUTF8, UTF8Toascii);
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler("US-ASCII", asciiToUTF8, UTF8Toascii);
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTML_ENABLED
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler("HTML", NULL, UTF8ToHtml);
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlUTF16LEHandler =
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          xmlNewCharEncodingHandler("UTF-16LE", UTF16LEToUTF8, NULL);
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlUTF16BEHandler =
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          xmlNewCharEncodingHandler("UTF-16BE", UTF16BEToUTF8, NULL);
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler("UTF-16", UTF16LEToUTF8, NULL);
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler("ISO-8859-1", isolat1ToUTF8, NULL);
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler("ASCII", asciiToUTF8, NULL);
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler("US-ASCII", asciiToUTF8, NULL);
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(LIBXML_ICONV_ENABLED) && !defined(LIBXML_ICU_ENABLED)
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ISO8859X_ENABLED
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRegisterCharEncodingHandlersISO8859x ();
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCleanupCharEncodingHandlers:
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup the memory allocated for the char encoding support, it
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * unregisters all the encoding handlers and the aliases.
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCleanupCharEncodingHandlers(void) {
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCleanupEncodingAliases();
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handlers == NULL) return;
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (;nbCharEncodingHandler > 0;) {
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nbCharEncodingHandler--;
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (handlers[nbCharEncodingHandler] != NULL) {
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (handlers[nbCharEncodingHandler]->name != NULL)
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(handlers[nbCharEncodingHandler]->name);
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(handlers[nbCharEncodingHandler]);
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(handlers);
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handlers = NULL;
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nbCharEncodingHandler = 0;
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDefaultCharEncodingHandler = NULL;
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRegisterCharEncodingHandler:
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @handler:  the xmlCharEncodingHandlerPtr handler block
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Register the char encoding handler, surprising, isn't it ?
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRegisterCharEncodingHandler(xmlCharEncodingHandlerPtr handler) {
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handlers == NULL) xmlInitCharEncodingHandlers();
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((handler == NULL) || (handlers == NULL)) {
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlEncodingErr(XML_I18N_NO_HANDLER,
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlRegisterCharEncodingHandler: NULL handler !\n", NULL);
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nbCharEncodingHandler >= MAX_ENCODING_HANDLERS) {
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlEncodingErr(XML_I18N_EXCESS_HANDLER,
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"xmlRegisterCharEncodingHandler: Too many handler registered, see %s\n",
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	               "MAX_ENCODING_HANDLERS");
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handlers[nbCharEncodingHandler++] = handler;
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetCharEncodingHandler:
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @enc:  an xmlCharEncoding value.
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Search in the registered set the handler able to read/write that encoding.
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the handler or NULL if not found
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCharEncodingHandlerPtr
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetCharEncodingHandler(xmlCharEncoding enc) {
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCharEncodingHandlerPtr handler;
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handlers == NULL) xmlInitCharEncodingHandlers();
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (enc) {
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_ERROR:
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_NONE:
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UTF8:
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UTF16LE:
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(xmlUTF16LEHandler);
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UTF16BE:
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(xmlUTF16BEHandler);
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_EBCDIC:
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("EBCDIC");
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("ebcdic");
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("EBCDIC-US");
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UCS4BE:
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("ISO-10646-UCS-4");
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("UCS-4");
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("UCS4");
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UCS4LE:
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("ISO-10646-UCS-4");
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("UCS-4");
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("UCS4");
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UCS4_2143:
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UCS4_3412:
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_UCS2:
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("ISO-10646-UCS-2");
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("UCS-2");
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("UCS2");
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * We used to keep ISO Latin encodings native in the
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * generated data. This led to so many problems that
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * this has been removed. One can still change this
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * back by registering no-ops encoders for those
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_1:
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handler = xmlFindCharEncodingHandler("ISO-8859-1");
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (handler != NULL) return(handler);
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_2:
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handler = xmlFindCharEncodingHandler("ISO-8859-2");
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (handler != NULL) return(handler);
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_3:
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handler = xmlFindCharEncodingHandler("ISO-8859-3");
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (handler != NULL) return(handler);
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_4:
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handler = xmlFindCharEncodingHandler("ISO-8859-4");
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (handler != NULL) return(handler);
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_5:
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handler = xmlFindCharEncodingHandler("ISO-8859-5");
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (handler != NULL) return(handler);
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_6:
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handler = xmlFindCharEncodingHandler("ISO-8859-6");
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (handler != NULL) return(handler);
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_7:
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handler = xmlFindCharEncodingHandler("ISO-8859-7");
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (handler != NULL) return(handler);
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_8:
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handler = xmlFindCharEncodingHandler("ISO-8859-8");
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (handler != NULL) return(handler);
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_8859_9:
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handler = xmlFindCharEncodingHandler("ISO-8859-9");
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (handler != NULL) return(handler);
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_2022_JP:
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("ISO-2022-JP");
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_SHIFT_JIS:
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("SHIFT-JIS");
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("SHIFT_JIS");
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("Shift_JIS");
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CHAR_ENCODING_EUC_JP:
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler = xmlFindCharEncodingHandler("EUC-JP");
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (handler != NULL) return(handler);
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext,
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "No handler found for encoding %d\n", enc);
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFindCharEncodingHandler:
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  a string describing the char encoding.
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Search in the registered set the handler able to read/write that encoding.
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the handler or NULL if not found
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCharEncodingHandlerPtr
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFindCharEncodingHandler(const char *name) {
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *nalias;
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *norig;
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCharEncoding alias;
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICONV_ENABLED
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCharEncodingHandlerPtr enc;
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iconv_t icv_in, icv_out;
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICONV_ENABLED */
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICU_ENABLED
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCharEncodingHandlerPtr enc;
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uconv_t *ucv_in, *ucv_out;
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICU_ENABLED */
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char upper[100];
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handlers == NULL) xmlInitCharEncodingHandlers();
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) return(xmlDefaultCharEncodingHandler);
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name[0] == 0) return(xmlDefaultCharEncodingHandler);
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Do the alias resolution
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    norig = name;
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nalias = xmlGetEncodingAlias(name);
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nalias != NULL)
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	name = nalias;
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Check first for directly registered encoding names
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;i < 99;i++) {
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        upper[i] = toupper(name[i]);
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (upper[i] == 0) break;
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    upper[i] = 0;
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handlers != NULL) {
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (i = 0;i < nbCharEncodingHandler; i++) {
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!strcmp(upper, handlers[i]->name)) {
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlGenericError(xmlGenericErrorContext,
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "Found registered handler for encoding %s\n", name);
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return(handlers[i]);
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICONV_ENABLED
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* check whether iconv can handle this */
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icv_in = iconv_open("UTF-8", name);
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icv_out = iconv_open(name, "UTF-8");
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (icv_in == (iconv_t) -1) {
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        icv_in = iconv_open("UTF-8", upper);
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (icv_out == (iconv_t) -1) {
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	icv_out = iconv_open(upper, "UTF-8");
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((icv_in != (iconv_t) -1) && (icv_out != (iconv_t) -1)) {
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    enc = (xmlCharEncodingHandlerPtr)
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	          xmlMalloc(sizeof(xmlCharEncodingHandler));
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (enc == NULL) {
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        iconv_close(icv_in);
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        iconv_close(icv_out);
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    enc->name = xmlMemStrdup(name);
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    enc->input = NULL;
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    enc->output = NULL;
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    enc->iconv_in = icv_in;
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    enc->iconv_out = icv_out;
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Found iconv handler for encoding %s\n", name);
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return enc;
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((icv_in != (iconv_t) -1) || icv_out != (iconv_t) -1) {
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlEncodingErr(XML_ERR_INTERNAL_ERROR,
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "iconv : problems with filters for '%s'\n", name);
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICONV_ENABLED */
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICU_ENABLED
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* check whether icu can handle this */
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ucv_in = openIcuConverter(name, 1);
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ucv_out = openIcuConverter(name, 0);
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ucv_in != NULL && ucv_out != NULL) {
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    enc = (xmlCharEncodingHandlerPtr)
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	          xmlMalloc(sizeof(xmlCharEncodingHandler));
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (enc == NULL) {
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                closeIcuConverter(ucv_in);
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                closeIcuConverter(ucv_out);
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    enc->name = xmlMemStrdup(name);
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    enc->input = NULL;
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    enc->output = NULL;
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    enc->uconv_in = ucv_in;
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    enc->uconv_out = ucv_out;
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Found ICU converter handler for encoding %s\n", name);
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return enc;
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (ucv_in != NULL || ucv_out != NULL) {
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            closeIcuConverter(ucv_in);
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            closeIcuConverter(ucv_out);
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlEncodingErr(XML_ERR_INTERNAL_ERROR,
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "ICU converter : problems with filters for '%s'\n", name);
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICU_ENABLED */
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext,
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "No handler found for encoding %s\n", name);
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Fallback using the canonical names
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    alias = xmlParseCharEncoding(norig);
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (alias != XML_CHAR_ENCODING_ERROR) {
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const char* canon;
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        canon = xmlGetCharEncodingName(alias);
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((canon != NULL) && (strcmp(name, canon))) {
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(xmlFindCharEncodingHandler(canon));
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If "none of the above", give up */
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		ICONV based generic conversion functions		*
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICONV_ENABLED
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIconvWrapper:
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cd:		iconv converter data structure
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a pointer to an array of bytes to store the result
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @out
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a pointer to an array of ISO Latin 1 chars
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlen:  the length of @in
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if success, or
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -1 by lack of space, or
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -2 if the transcoding fails (for *in is not valid utf8 string or
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *        the result of transformation can't fit into the encoding we want), or
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -3 if there the last byte can't form a single output char.
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @inlen after return is the number of octets consumed
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     as the return value is positive, else unpredictable.
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @outlen after return is the number of ocetes consumed.
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIconvWrapper(iconv_t cd, unsigned char *out, int *outlen,
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const unsigned char *in, int *inlen) {
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t icv_inlen, icv_outlen;
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *icv_in = (const char *) in;
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *icv_out = (char *) out;
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) {
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (outlen != NULL) *outlen = 0;
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icv_inlen = *inlen;
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icv_outlen = *outlen;
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = iconv(cd, (ICONV_CONST char **) &icv_in, &icv_inlen, &icv_out, &icv_outlen);
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *inlen -= icv_inlen;
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outlen -= icv_outlen;
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((icv_inlen != 0) || (ret == -1)) {
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EILSEQ
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (errno == EILSEQ) {
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return -2;
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef E2BIG
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (errno == E2BIG) {
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return -1;
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EINVAL
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (errno == EINVAL) {
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return -3;
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return -3;
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICONV_ENABLED */
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		ICU based generic conversion functions	         	*
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICU_ENABLED
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlUconvWrapper:
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cd: ICU uconverter data structure
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @toUnicode : non-zero if toUnicode. 0 otherwise.
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a pointer to an array of bytes to store the result
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @out
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a pointer to an array of ISO Latin 1 chars
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlen:  the length of @in
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if success, or
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -1 by lack of space, or
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -2 if the transcoding fails (for *in is not valid utf8 string or
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *        the result of transformation can't fit into the encoding we want), or
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -3 if there the last byte can't form a single output char.
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @inlen after return is the number of octets consumed
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     as the return value is positive, else unpredictable.
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @outlen after return is the number of ocetes consumed.
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlUconvWrapper(uconv_t *cd, int toUnicode, unsigned char *out, int *outlen,
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const unsigned char *in, int *inlen) {
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *ucv_in = (const char *) in;
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *ucv_out = (char *) out;
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UErrorCode err = U_ZERO_ERROR;
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) {
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (outlen != NULL) *outlen = 0;
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * TODO(jungshik)
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * 1. is ucnv_convert(To|From)Algorithmic better?
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * 2. had we better use an explicit pivot buffer?
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * 3. error returned comes from 'fromUnicode' only even
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *    when toUnicode is true !
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (toUnicode) {
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* encoding => UTF-16 => UTF-8 */
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ucnv_convertEx(cd->utf8, cd->uconv, &ucv_out, ucv_out + *outlen,
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       &ucv_in, ucv_in + *inlen, NULL, NULL, NULL, NULL,
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       0, TRUE, &err);
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* UTF-8 => UTF-16 => encoding */
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ucnv_convertEx(cd->uconv, cd->utf8, &ucv_out, ucv_out + *outlen,
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       &ucv_in, ucv_in + *inlen, NULL, NULL, NULL, NULL,
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       0, TRUE, &err);
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *inlen = ucv_in - (const char*) in;
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outlen = ucv_out - (char *) out;
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (U_SUCCESS(err))
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err == U_BUFFER_OVERFLOW_ERROR)
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return -1;
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err == U_INVALID_CHAR_FOUND || err == U_ILLEGAL_CHAR_FOUND)
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return -2;
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* if (err == U_TRUNCATED_CHAR_FOUND) */
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return -3;
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICU_ENABLED */
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		The real API used by libxml for on-the-fly conversion	*
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCharEncFirstLineInt(xmlCharEncodingHandler *handler, xmlBufferPtr out,
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       xmlBufferPtr in, int len);
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCharEncFirstLineInt:
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @handler:	char enconding transformation data structure
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  an xmlBuffer for the output.
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  an xmlBuffer for the input
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  number of bytes to convert for the first line, or -1
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Front-end for the encoding handler input function, but handle only
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the very first line, i.e. limit itself to 45 chars.
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of byte written if success, or
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -1 general error
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -2 if the transcoding fails (for *in is not valid utf8 string or
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *        the result of transformation can't fit into the encoding we want), or
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCharEncFirstLineInt(xmlCharEncodingHandler *handler, xmlBufferPtr out,
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       xmlBufferPtr in, int len) {
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = -2;
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int written;
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int toconv;
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handler == NULL) return(-1);
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out == NULL) return(-1);
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in == NULL) return(-1);
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* calculate space available */
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    written = out->size - out->use;
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toconv = in->use;
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * echo '<?xml version="1.0" encoding="UCS4"?>' | wc -c => 38
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * 45 chars should be sufficient to reach the end of the encoding
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * declaration without going too far inside the document content.
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * on UTF-16 this means 90bytes, on UCS4 this means 180
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The actual value depending on guessed encoding is passed as @len
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * if provided
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len >= 0) {
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (toconv > len)
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            toconv = len;
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (toconv > 180)
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            toconv = 180;
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (toconv * 2 >= written) {
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlBufferGrow(out, toconv);
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	written = out->size - out->use - 1;
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handler->input != NULL) {
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = handler->input(&out->content[out->use], &written,
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                     in->content, &toconv);
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlBufferShrink(in, toconv);
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	out->use += written;
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	out->content[out->use] = 0;
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICONV_ENABLED
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (handler->iconv_in != NULL) {
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlIconvWrapper(handler->iconv_in, &out->content[out->use],
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                      &written, in->content, &toconv);
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlBufferShrink(in, toconv);
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	out->use += written;
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	out->content[out->use] = 0;
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == -1) ret = -3;
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICONV_ENABLED */
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICU_ENABLED
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (handler->uconv_in != NULL) {
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use],
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                      &written, in->content, &toconv);
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlBufferShrink(in, toconv);
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	out->use += written;
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	out->content[out->use] = 0;
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == -1) ret = -3;
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICU_ENABLED */
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (ret) {
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case 0:
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "converted %d bytes to %d bytes of input\n",
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            toconv, written);
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case -1:
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of input, %d left\n",
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            toconv, written, in->use);
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case -2:
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "input conversion failed due to input error\n");
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case -3:
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of input, %d left\n",
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            toconv, written, in->use);
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,"Unknown input conversion failed %d\n", ret);
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* DEBUG_ENCODING */
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Ignore when input buffer is not on a boundary
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == -3) ret = 0;
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == -1) ret = 0;
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCharEncFirstLine:
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @handler:	char enconding transformation data structure
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  an xmlBuffer for the output.
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  an xmlBuffer for the input
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Front-end for the encoding handler input function, but handle only
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the very first line, i.e. limit itself to 45 chars.
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of byte written if success, or
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -1 general error
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -2 if the transcoding fails (for *in is not valid utf8 string or
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *        the result of transformation can't fit into the encoding we want), or
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCharEncFirstLine(xmlCharEncodingHandler *handler, xmlBufferPtr out,
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 xmlBufferPtr in) {
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlCharEncFirstLineInt(handler, out, in, -1));
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCharEncInFunc:
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @handler:	char encoding transformation data structure
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  an xmlBuffer for the output.
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  an xmlBuffer for the input
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Generic front-end for the encoding handler input function
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of byte written if success, or
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -1 general error
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -2 if the transcoding fails (for *in is not valid utf8 string or
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *        the result of transformation can't fit into the encoding we want), or
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCharEncInFunc(xmlCharEncodingHandler * handler, xmlBufferPtr out,
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 xmlBufferPtr in)
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = -2;
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int written;
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int toconv;
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handler == NULL)
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out == NULL)
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in == NULL)
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toconv = in->use;
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (toconv == 0)
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (0);
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    written = out->size - out->use;
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (toconv * 2 >= written) {
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlBufferGrow(out, out->size + toconv * 2);
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        written = out->size - out->use - 1;
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handler->input != NULL) {
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = handler->input(&out->content[out->use], &written,
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             in->content, &toconv);
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlBufferShrink(in, toconv);
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        out->use += written;
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        out->content[out->use] = 0;
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICONV_ENABLED
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (handler->iconv_in != NULL) {
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = xmlIconvWrapper(handler->iconv_in, &out->content[out->use],
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &written, in->content, &toconv);
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlBufferShrink(in, toconv);
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        out->use += written;
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        out->content[out->use] = 0;
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ret == -1)
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = -3;
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICONV_ENABLED */
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICU_ENABLED
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (handler->uconv_in != NULL) {
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use],
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &written, in->content, &toconv);
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlBufferShrink(in, toconv);
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        out->use += written;
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        out->content[out->use] = 0;
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ret == -1)
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = -3;
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICU_ENABLED */
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (ret) {
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case 0:
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "converted %d bytes to %d bytes of input\n",
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            toconv, written);
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case -1:
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         "converted %d bytes to %d bytes of input, %d left\n",
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            toconv, written, in->use);
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case -3:
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "converted %d bytes to %d bytes of input, %d left\n",
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            toconv, written, in->use);
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case -2: {
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            char buf[50];
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X",
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     in->content[0], in->content[1],
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     in->content[2], in->content[3]);
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    buf[49] = 0;
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlEncodingErr(XML_I18N_CONV_FAILED,
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "input conversion failed due to input error, bytes %s\n",
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		           buf);
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Ignore when input buffer is not on a boundary
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == -3)
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = 0;
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (written? written : ret);
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCharEncOutFunc:
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @handler:	char enconding transformation data structure
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  an xmlBuffer for the output.
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  an xmlBuffer for the input
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Generic front-end for the encoding handler output function
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a first call with @in == NULL has to be made firs to initiate the
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * output in case of non-stateless encoding needing to initiate their
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * state or the output (like the BOM in UTF16).
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * In case of UTF8 sequence conversion errors for the given encoder,
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the content will be automatically remapped to a CharRef sequence.
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of byte written if success, or
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -1 general error
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     -2 if the transcoding fails (for *in is not valid utf8 string or
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *        the result of transformation can't fit into the encoding we want), or
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCharEncOutFunc(xmlCharEncodingHandler *handler, xmlBufferPtr out,
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  xmlBufferPtr in) {
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = -2;
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int written;
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int writtentot = 0;
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int toconv;
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int output = 0;
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handler == NULL) return(-1);
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out == NULL) return(-1);
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)retry:
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    written = out->size - out->use;
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (written > 0)
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	written--; /* Gennady: count '/0' */
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * First specific handling of in = NULL, i.e. the initialization call
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in == NULL) {
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        toconv = 0;
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (handler->output != NULL) {
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = handler->output(&out->content[out->use], &written,
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  NULL, &toconv);
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret >= 0) { /* Gennady: check return value */
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out->use += written;
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out->content[out->use] = 0;
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICONV_ENABLED
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (handler->iconv_out != NULL) {
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use],
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  &written, NULL, &toconv);
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    out->use += written;
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    out->content[out->use] = 0;
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICONV_ENABLED */
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICU_ENABLED
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (handler->uconv_out != NULL) {
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlUconvWrapper(handler->uconv_out, 0,
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &out->content[out->use],
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 				              &written, NULL, &toconv);
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    out->use += written;
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    out->content[out->use] = 0;
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICU_ENABLED */
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"initialized encoder\n");
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(0);
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Conversion itself.
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toconv = in->use;
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (toconv == 0)
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (toconv * 4 >= written) {
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlBufferGrow(out, toconv * 4);
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	written = out->size - out->use - 1;
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handler->output != NULL) {
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = handler->output(&out->content[out->use], &written,
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                      in->content, &toconv);
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (written > 0) {
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferShrink(in, toconv);
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    out->use += written;
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    writtentot += written;
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	out->content[out->use] = 0;
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICONV_ENABLED
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (handler->iconv_out != NULL) {
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use],
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                      &written, in->content, &toconv);
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlBufferShrink(in, toconv);
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	out->use += written;
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	writtentot += written;
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	out->content[out->use] = 0;
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == -1) {
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (written > 0) {
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * Can be a limitation of iconv
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 */
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto retry;
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = -3;
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICONV_ENABLED */
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICU_ENABLED
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (handler->uconv_out != NULL) {
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlUconvWrapper(handler->uconv_out, 0,
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &out->content[out->use],
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                      &written, in->content, &toconv);
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlBufferShrink(in, toconv);
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	out->use += written;
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	writtentot += written;
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	out->content[out->use] = 0;
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == -1) {
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (written > 0) {
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * Can be a limitation of iconv
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 */
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto retry;
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = -3;
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICU_ENABLED */
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlEncodingErr(XML_I18N_NO_OUTPUT,
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       "xmlCharEncOutFunc: no output function !\n", NULL);
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret >= 0) output += ret;
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Attempt to handle error cases
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (ret) {
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case 0:
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "converted %d bytes to %d bytes of output\n",
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            toconv, written);
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case -1:
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "output conversion failed by lack of space\n");
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case -3:
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of output %d left\n",
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            toconv, written, in->use);
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case -2: {
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int len = in->use;
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    const xmlChar *utf = (const xmlChar *) in->content;
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int cur;
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = xmlGetUTF8Char(utf, &len);
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur > 0) {
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar charref[20];
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"handling output conversion error\n");
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n",
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			in->content[0], in->content[1],
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			in->content[2], in->content[3]);
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * Removes the UTF8 sequence, and replace it by a charref
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * and continue the transcoding phase, hoping the error
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * did not mangle the encoder state.
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 */
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		snprintf((char *) &charref[0], sizeof(charref), "&#%d;", cur);
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlBufferShrink(in, len);
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlBufferAddHead(in, charref, -1);
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto retry;
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		char buf[50];
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X",
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 in->content[0], in->content[1],
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 in->content[2], in->content[3]);
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		buf[49] = 0;
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlEncodingErr(XML_I18N_CONV_FAILED,
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "output conversion failed due to conv error, bytes %s\n",
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       buf);
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (in->alloc != XML_BUFFER_ALLOC_IMMUTABLE)
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    in->content[0] = ' ';
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCharEncCloseFunc:
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @handler:	char enconding transformation data structure
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Generic front-end for encoding handler close function
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if success, or -1 in case of error
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) {
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handler == NULL) return(-1);
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handler->name == NULL) return(-1);
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICONV_ENABLED
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Iconv handlers can be used only once, free the whole block.
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * and the associated icon resources.
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((handler->iconv_out != NULL) || (handler->iconv_in != NULL)) {
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (handler->name != NULL)
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(handler->name);
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	handler->name = NULL;
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (handler->iconv_out != NULL) {
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (iconv_close(handler->iconv_out))
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = -1;
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handler->iconv_out = NULL;
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (handler->iconv_in != NULL) {
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (iconv_close(handler->iconv_in))
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = -1;
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handler->iconv_in = NULL;
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(handler);
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_ICONV_ENABLED */
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICU_ENABLED
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((handler->uconv_out != NULL) || (handler->uconv_in != NULL)) {
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (handler->name != NULL)
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(handler->name);
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	handler->name = NULL;
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (handler->uconv_out != NULL) {
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    closeIcuConverter(handler->uconv_out);
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handler->uconv_out = NULL;
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (handler->uconv_in != NULL) {
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    closeIcuConverter(handler->uconv_in);
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handler->uconv_in = NULL;
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(handler);
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_ENCODING
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret)
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"failed to close the encoding handler\n");
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"closed the encoding handler\n");
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlByteConsumed:
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XML parser context
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function provides the current index of the parser relative
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to the start of the current entity. This function is computed in
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * bytes from the beginning starting at zero and finishing at the
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * size in byte of the file if parsing a file. The function is
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of constant cost if the input is UTF-8 but can be costly if run
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * on non-UTF-8 input.
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the index in bytes from the beginning of the entity or -1
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         in case the index could not be computed.
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)long
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlByteConsumed(xmlParserCtxtPtr ctxt) {
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr in;
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL) return(-1);
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    in = ctxt->input;
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in == NULL)  return(-1);
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((in->buf != NULL) && (in->buf->encoder != NULL)) {
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned int unused = 0;
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCharEncodingHandler * handler = in->buf->encoder;
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Encoding conversion, compute the number of unused original
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * bytes from the input not consumed and substract that from
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * the raw consumed value, this is not a cheap operation
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (in->end - in->cur > 0) {
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    unsigned char convbuf[32000];
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    const unsigned char *cur = (const unsigned char *)in->cur;
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int toconv = in->end - in->cur, written = 32000;
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int ret;
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (handler->output != NULL) {
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        do {
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    toconv = in->end - cur;
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    written = 32000;
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = handler->output(&convbuf[0], &written,
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      cur, &toconv);
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret == -1) return(-1);
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    unused += written;
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur += toconv;
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} while (ret == -2);
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICONV_ENABLED
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (handler->iconv_out != NULL) {
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        do {
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    toconv = in->end - cur;
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    written = 32000;
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlIconvWrapper(handler->iconv_out, &convbuf[0],
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                      &written, cur, &toconv);
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret < 0) {
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        if (written > 0)
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ret = -2;
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			else
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(-1);
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    unused += written;
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur += toconv;
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} while (ret == -2);
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ICU_ENABLED
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (handler->uconv_out != NULL) {
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        do {
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    toconv = in->end - cur;
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    written = 32000;
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlUconvWrapper(handler->uconv_out, 0, &convbuf[0],
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                      &written, cur, &toconv);
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret < 0) {
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        if (written > 0)
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ret = -2;
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			else
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(-1);
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    unused += written;
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur += toconv;
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} while (ret == -2);
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        /* could not find a converter */
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        return(-1);
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (in->buf->rawconsumed < unused)
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(in->buf->rawconsumed - unused);
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(in->consumed + (in->cur - in->base));
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(LIBXML_ICONV_ENABLED) && !defined(LIBXML_ICU_ENABLED)
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_ISO8859X_ENABLED
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * UTF8ToISO8859x:
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a pointer to an array of bytes to store the result
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @out
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a pointer to an array of UTF-8 chars
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlen:  the length of @in
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @xlattable: the 2-level transcoding table
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Take a block of UTF-8 chars in and try to convert it to an ISO 8859-*
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * block of chars out.
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @inlen after return is the number of octets consumed
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     as the return value is positive, else unpredictable.
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @outlen after return is the number of ocetes consumed.
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UTF8ToISO8859x(unsigned char* out, int *outlen,
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const unsigned char* in, int *inlen,
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              unsigned char const *xlattable) {
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* outstart = out;
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* inend;
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* instart = in;
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out == NULL) || (outlen == NULL) || (inlen == NULL) ||
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (xlattable == NULL))
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in == NULL) {
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        * initialization nothing to do
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        */
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *outlen = 0;
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *inlen = 0;
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(0);
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inend = in + (*inlen);
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (in < inend) {
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned char d = *in++;
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if  (d < 0x80)  {
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *out++ = d;
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (d < 0xC0) {
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* trailing byte in leading position */
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *outlen = out - outstart;
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *inlen = in - instart - 1;
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(-2);
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (d < 0xE0) {
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unsigned char c;
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!(in < inend)) {
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                /* trailing byte not in input buffer */
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *outlen = out - outstart;
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *inlen = in - instart - 1;
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return(-2);
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c = *in++;
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((c & 0xC0) != 0x80) {
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                /* not a trailing byte */
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *outlen = out - outstart;
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *inlen = in - instart - 2;
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return(-2);
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c = c & 0x3F;
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            d = d & 0x1F;
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            d = xlattable [48 + c + xlattable [d] * 64];
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (d == 0) {
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                /* not in character set */
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *outlen = out - outstart;
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *inlen = in - instart - 2;
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return(-2);
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *out++ = d;
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (d < 0xF0) {
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unsigned char c1;
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unsigned char c2;
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!(in < inend - 1)) {
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                /* trailing bytes not in input buffer */
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *outlen = out - outstart;
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *inlen = in - instart - 1;
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return(-2);
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c1 = *in++;
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((c1 & 0xC0) != 0x80) {
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                /* not a trailing byte (c1) */
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *outlen = out - outstart;
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *inlen = in - instart - 2;
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return(-2);
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c2 = *in++;
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((c2 & 0xC0) != 0x80) {
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                /* not a trailing byte (c2) */
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *outlen = out - outstart;
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *inlen = in - instart - 2;
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return(-2);
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c1 = c1 & 0x3F;
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c2 = c2 & 0x3F;
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    d = d & 0x0F;
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    d = xlattable [48 + c2 + xlattable [48 + c1 +
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    		xlattable [32 + d] * 64] * 64];
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (d == 0) {
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                /* not in character set */
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *outlen = out - outstart;
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *inlen = in - instart - 3;
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return(-2);
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *out++ = d;
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* cannot transcode >= U+010000 */
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *outlen = out - outstart;
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *inlen = in - instart - 1;
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(-2);
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outlen = out - outstart;
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *inlen = in - instart;
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(*outlen);
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ISO8859xToUTF8
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a pointer to an array of bytes to store the result
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @out
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a pointer to an array of ISO Latin 1 chars
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlen:  the length of @in
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Take a block of ISO 8859-* chars in and try to convert it to an UTF-8
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * block of chars out.
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if success, or -1 otherwise
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @inlen after return is the number of octets consumed
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @outlen after return is the number of ocetes produced.
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ISO8859xToUTF8(unsigned char* out, int *outlen,
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const unsigned char* in, int *inlen,
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              unsigned short const *unicodetable) {
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char* outstart = out;
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char* outend;
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* instart = in;
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* inend;
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* instop;
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int c;
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out == NULL) || (outlen == NULL) || (inlen == NULL) ||
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (in == NULL) || (unicodetable == NULL))
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outend = out + *outlen;
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inend = in + *inlen;
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instop = inend;
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c = *in;
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (in < inend && out < outend - 1) {
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (c >= 0x80) {
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c = unicodetable [c - 0x80];
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (c == 0) {
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                /* undefined code point */
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *outlen = out - outstart;
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *inlen = in - instart;
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return (-1);
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (c < 0x800) {
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *out++ = ((c >>  6) & 0x1F) | 0xC0;
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *out++ = (c & 0x3F) | 0x80;
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *out++ = ((c >>  12) & 0x0F) | 0xE0;
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *out++ = ((c >>  6) & 0x3F) | 0x80;
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *out++ = (c & 0x3F) | 0x80;
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ++in;
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c = *in;
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (instop - in > outend - out) instop = in + (outend - out);
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while (c < 0x80 && in < instop) {
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *out++ =  c;
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ++in;
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c = *in;
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in < inend && out < outend && c < 0x80) {
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *out++ =  c;
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ++in;
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outlen = out - outstart;
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *inlen = in - instart;
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (*outlen);
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Lookup tables for ISO-8859-2..ISO-8859-16 transcoding                *
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned short const xmlunicodetable_ISO8859_2 [128] = {
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7,
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b,
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7,
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c,
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7,
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e,
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7,
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7,
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7,
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9,
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned char const xmltranscodetable_ISO8859_2 [48 + 6 * 64] = {
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x01\x05\x02\x04\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00"
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa0\x00\x00\x00\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\x00"
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xb0\x00\x00\x00\xb4\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00"
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\xc3\xe3\xa1\xb1\xc6\xe6\x00\x00\x00\x00\xc8\xe8\xcf\xef"
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xd0\xf0\x00\x00\x00\x00\x00\x00\xca\xea\xcc\xec\x00\x00\x00\x00"
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xe5\x00\x00\xa5\xb5\x00"
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00"
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\x00\xb2\x00\xbd\x00\x00"
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xa3\xb3\xd1\xf1\x00\x00\xd2\xf2\x00\x00\x00\x00\x00\x00\x00"
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xd5\xf5\x00\x00\xc0\xe0\x00\x00\xd8\xf8\xa6\xb6\x00\x00\xaa\xba"
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa9\xb9\xde\xfe\xab\xbb\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xf9"
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xdb\xfb\x00\x00\x00\x00\x00\x00\x00\xac\xbc\xaf\xbf\xae\xbe\x00"
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xc1\xc2\x00\xc4\x00\x00\xc7\x00\xc9\x00\xcb\x00\xcd\xce\x00"
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\xd3\xd4\x00\xd6\xd7\x00\x00\xda\x00\xdc\xdd\x00\xdf"
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xe1\xe2\x00\xe4\x00\x00\xe7\x00\xe9\x00\xeb\x00\xed\xee\x00"
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\xf3\xf4\x00\xf6\xf7\x00\x00\xfa\x00\xfc\xfd\x00\x00"
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned short const xmlunicodetable_ISO8859_3 [128] = {
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7,
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b,
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7,
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c,
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7,
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7,
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df,
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7,
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7,
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9,
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned char const xmltranscodetable_ISO8859_3 [48 + 7 * 64] = {
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x04\x00\x01\x06\x02\x05\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00"
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa0\x00\x00\xa3\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\x00"
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xb0\x00\xb2\xb3\xb4\xb5\x00\xb7\xb8\x00\x00\x00\x00\xbd\x00\x00"
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xe6\xc5\xe5\x00\x00\x00\x00"
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xf8\xab\xbb"
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xd5\xf5\x00\x00\xa6\xb6\xa1\xb1\x00\x00\x00\x00\x00\x00\x00\x00"
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa9\xb9\x00\x00\xac\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\x00\x00\x00\x00\x00\x00"
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xfe\xaa\xba"
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\xfd\x00\x00"
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\xbf\x00\x00\x00"
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xc0\xc1\xc2\x00\xc4\x00\x00\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xd1\xd2\xd3\xd4\x00\xd6\xd7\x00\xd9\xda\xdb\xdc\x00\x00\xdf"
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xe0\xe1\xe2\x00\xe4\x00\x00\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xf1\xf2\xf3\xf4\x00\xf6\xf7\x00\xf9\xfa\xfb\xfc\x00\x00\x00"
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned short const xmlunicodetable_ISO8859_4 [128] = {
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7,
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af,
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7,
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b,
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e,
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a,
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df,
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f,
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b,
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9,
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned char const xmltranscodetable_ISO8859_4 [48 + 6 * 64] = {
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x01\x05\x02\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00"
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa0\x00\x00\x00\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\xaf"
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xb0\x00\x00\x00\xb4\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00"
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xc0\xe0\x00\x00\xa1\xb1\x00\x00\x00\x00\x00\x00\xc8\xe8\x00\x00"
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xd0\xf0\xaa\xba\x00\x00\xcc\xec\xca\xea\x00\x00\x00\x00\x00\x00"
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\xab\xbb\x00\x00\x00\x00\xa5\xb5\xcf\xef\x00\x00\xc7\xe7"
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\xd3\xf3\xa2\x00\x00\xa6\xb6\x00\x00\x00"
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\xd1\xf1\x00\x00\x00\xbd\xbf\xd2\xf2\x00\x00"
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\xa3\xb3\x00\x00\x00\x00\x00\x00\x00\x00"
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa9\xb9\x00\x00\x00\x00\xac\xbc\xdd\xfd\xde\xfe\x00\x00\x00\x00"
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\xd9\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\xbe\x00"
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00"
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\xb2\x00\x00\x00\x00"
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xc1\xc2\xc3\xc4\xc5\xc6\x00\x00\xc9\x00\xcb\x00\xcd\xce\x00"
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\xd4\xd5\xd6\xd7\xd8\x00\xda\xdb\xdc\x00\x00\xdf"
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xe1\xe2\xe3\xe4\xe5\xe6\x00\x00\xe9\x00\xeb\x00\xed\xee\x00"
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\xf4\xf5\xf6\xf7\xf8\x00\xfa\xfb\xfc\x00\x00\x00"
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned short const xmlunicodetable_ISO8859_5 [128] = {
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f,
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f,
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned char const xmltranscodetable_ISO8859_5 [48 + 6 * 64] = {
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa0\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\xad\x00\x00"
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\x00\xae\xaf"
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\x00\xfe\xff"
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned short const xmlunicodetable_ISO8859_6 [128] = {
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000,
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000,
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f,
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f,
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647,
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f,
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned char const xmltranscodetable_ISO8859_6 [48 + 5 * 64] = {
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00"
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa0\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00"
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00"
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\xbf"
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\x00\x00\x00\x00\x00"
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xf0\xf1\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned short const xmlunicodetable_ISO8859_7 [128] = {
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a0, 0x2018, 0x2019, 0x00a3, 0x0000, 0x0000, 0x00a6, 0x00a7,
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015,
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7,
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f,
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7,
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000,
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned char const xmltranscodetable_ISO8859_7 [48 + 7 * 64] = {
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x06"
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa0\x00\x00\xa3\x00\x00\xa6\xa7\xa8\xa9\x00\xab\xac\xad\x00\x00"
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xb0\xb1\xb2\xb3\x00\x00\x00\xb7\x00\x00\x00\xbb\x00\xbd\x00\x00"
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\xaf\x00\x00\xa1\xa2\x00\x00\x00\x00\x00\x00"
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\xb4\xb5\xb6\x00\xb8\xb9\xba\x00\xbc\x00\xbe\xbf"
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xd0\xd1\x00\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\x00"
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned short const xmlunicodetable_ISO8859_8 [128] = {
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000,
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017,
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7,
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df,
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7,
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000,
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned char const xmltranscodetable_ISO8859_8 [48 + 7 * 64] = {
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x02\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00"
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa0\x00\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\x00\xab\xac\xad\xae\xaf"
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\x00\xbb\xbc\xbd\xbe\x00"
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00"
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00"
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\xfe"
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00"
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\x00\x00\x00\x00\x00"
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned short const xmlunicodetable_ISO8859_9 [128] = {
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff,
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned char const xmltranscodetable_ISO8859_9 [48 + 5 * 64] = {
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x01\x02\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\x00\x00\xdf"
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\x00\x00\xff"
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xf0"
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xdd\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xfe"
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned short const xmlunicodetable_ISO8859_10 [128] = {
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7,
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a,
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7,
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b,
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e,
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf,
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168,
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f,
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef,
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169,
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138,
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned char const xmltranscodetable_ISO8859_10 [48 + 7 * 64] = {
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x01\x06\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa0\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\xad\x00\x00"
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xb0\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00"
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xc0\xe0\x00\x00\xa1\xb1\x00\x00\x00\x00\x00\x00\xc8\xe8\x00\x00"
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa9\xb9\xa2\xb2\x00\x00\xcc\xec\xca\xea\x00\x00\x00\x00\x00\x00"
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\xa3\xb3\x00\x00\x00\x00\xa5\xb5\xa4\xb4\x00\x00\xc7\xe7"
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\xa6\xb6\xff\x00\x00\xa8\xb8\x00\x00\x00"
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\xd1\xf1\x00\x00\x00\xaf\xbf\xd2\xf2\x00\x00"
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xaa\xba\x00\x00\x00\x00\xab\xbb\xd7\xf7\xae\xbe\x00\x00\x00\x00"
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\xd9\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\xbc\x00"
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xc1\xc2\xc3\xc4\xc5\xc6\x00\x00\xc9\x00\xcb\x00\xcd\xce\xcf"
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xd0\x00\x00\xd3\xd4\xd5\xd6\x00\xd8\x00\xda\xdb\xdc\xdd\xde\xdf"
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xe1\xe2\xe3\xe4\xe5\xe6\x00\x00\xe9\x00\xeb\x00\xed\xee\xef"
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xf0\x00\x00\xf3\xf4\xf5\xf6\x00\xf8\x00\xfa\xfb\xfc\xfd\xfe\x00"
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned short const xmlunicodetable_ISO8859_11 [128] = {
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07,
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f,
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17,
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f,
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27,
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f,
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37,
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f,
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47,
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f,
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57,
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000,
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned char const xmltranscodetable_ISO8859_11 [48 + 6 * 64] = {
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x05\x00\x00\x00\x00\x00\x00"
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\x00\x00\x00\x00\xdf"
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\x00\x00\x00\x00"
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned short const xmlunicodetable_ISO8859_13 [128] = {
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7,
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6,
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7,
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6,
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112,
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b,
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7,
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df,
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113,
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c,
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7,
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019,
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned char const xmltranscodetable_ISO8859_13 [48 + 7 * 64] = {
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x01\x04\x06\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa0\x00\xa2\xa3\xa4\x00\xa6\xa7\x00\xa9\x00\xab\xac\xad\xae\x00"
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xb0\xb1\xb2\xb3\x00\xb5\xb6\xb7\x00\xb9\x00\xbb\xbc\xbd\xbe\x00"
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\xb4\xa1\xa5\x00"
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\xc4\xc5\xaf\x00\x00\xc9\x00\x00\x00\x00\x00\x00"
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\xd3\x00\xd5\xd6\xd7\xa8\x00\x00\x00\xdc\x00\x00\xdf"
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\xe4\xe5\xbf\x00\x00\xe9\x00\x00\x00\x00\x00\x00"
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\xf3\x00\xf5\xf6\xf7\xb8\x00\x00\x00\xfc\x00\x00\x00"
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xd9\xf9\xd1\xf1\xd2\xf2\x00\x00\x00\x00\x00\xd4\xf4\x00\x00"
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\xaa\xba\x00\x00\xda\xfa\x00\x00\x00\x00"
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xd0\xf0\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xfb\x00\x00\x00\x00"
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\xd8\xf8\x00\x00\x00\x00\x00\xca\xea\xdd\xfd\xde\xfe\x00"
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xc2\xe2\x00\x00\xc0\xe0\xc3\xe3\x00\x00\x00\x00\xc8\xe8\x00\x00"
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\xc7\xe7\x00\x00\xcb\xeb\xc6\xe6\x00\x00\x00\x00\x00\x00"
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\xcc\xec\x00\x00\x00\x00\x00\x00\xce\xee\x00\x00\xc1\xe1"
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\xcd\xed\x00\x00\x00\xcf\xef\x00\x00\x00"
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned short const xmlunicodetable_ISO8859_14 [128] = {
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7,
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178,
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56,
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61,
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a,
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df,
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b,
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff,
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned char const xmltranscodetable_ISO8859_14 [48 + 10 * 64] = {
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x01\x09\x04\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa0\x00\x00\xa3\x00\x00\x00\xa7\x00\xa9\x00\x00\x00\xad\xae\x00"
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x08\x05\x06\x00\x00\x00\x00"
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\xa1\xa2\x00\x00\x00\x00\x00\x00\xa6\xab\x00\x00\x00\x00"
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xb1"
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\xa5\x00\x00\x00\x00"
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xb2\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa8\xb8\xaa\xba\xbd\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\xac\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\xd0\xf0\xde\xfe\xaf\x00\x00\x00\x00\x00\x00\x00"
32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xb4\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\xb7\xb9\x00\x00\x00\x00\x00\x00\x00\x00"
33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xbb\xbf\x00\x00\x00\x00\x00\x00\x00\x00\xd7\xf7\x00\x00\x00\x00"
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xd1\xd2\xd3\xd4\xd5\xd6\x00\xd8\xd9\xda\xdb\xdc\xdd\x00\xdf"
33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xf1\xf2\xf3\xf4\xf5\xf6\x00\xf8\xf9\xfa\xfb\xfc\xfd\x00\xff"
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned short const xmlunicodetable_ISO8859_15 [128] = {
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7,
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7,
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf,
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff,
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned char const xmltranscodetable_ISO8859_15 [48 + 6 * 64] = {
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x01\x05\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa0\xa1\xa2\xa3\x00\xa5\x00\xa7\x00\xa9\xaa\xab\xac\xad\xae\xaf"
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xb0\xb1\xb2\xb3\x00\xb5\xb6\xb7\x00\xb9\xba\xbb\x00\x00\x00\xbf"
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00"
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\xbc\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa6\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\xb4\xb8\x00"
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned short const xmlunicodetable_ISO8859_16 [128] = {
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7,
33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b,
33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7,
33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c,
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7,
33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a,
33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df,
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7,
33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b,
33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff,
33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned char const xmltranscodetable_ISO8859_16 [48 + 9 * 64] = {
33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x01\x08\x02\x03\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00"
33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa0\x00\x00\x00\x00\x00\x00\xa7\x00\xa9\x00\xab\x00\xad\x00\x00"
33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xb0\xb1\x00\x00\x00\x00\xb6\xb7\x00\x00\x00\xbb\x00\x00\x00\x00"
33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\xc3\xe3\xa1\xa2\xc5\xe5\x00\x00\x00\x00\xb2\xb9\x00\x00"
33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xd0\xf0\x00\x00\x00\x00\x00\x00\xdd\xfd\x00\x00\x00\x00\x00\x00"
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\xa3\xb3\xd1\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xd5\xf5\xbc\xbd\x00\x00\x00\x00\x00\x00\xd7\xf7\x00\x00\x00\x00"
33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xa6\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xd8\xf8\x00\x00\x00\x00\x00\x00\xbe\xac\xae\xaf\xbf\xb4\xb8\x00"
33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x06\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00"
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\xa5\x00"
34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\xaa\xba\xde\xfe\x00\x00\x00\x00"
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xc0\xc1\xc2\x00\xc4\x00\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\xd2\xd3\xd4\x00\xd6\x00\x00\xd9\xda\xdb\xdc\x00\x00\xdf"
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\xe0\xe1\xe2\x00\xe4\x00\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\x00\x00\xf2\xf3\xf4\x00\xf6\x00\x00\xf9\xfa\xfb\xfc\x00\x00\xff"
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * auto-generated functions for ISO-8859-2 .. ISO-8859-16
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ISO8859_2ToUTF8 (unsigned char* out, int *outlen,
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_2);
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int UTF8ToISO8859_2 (unsigned char* out, int *outlen,
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_2);
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ISO8859_3ToUTF8 (unsigned char* out, int *outlen,
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_3);
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int UTF8ToISO8859_3 (unsigned char* out, int *outlen,
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_3);
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ISO8859_4ToUTF8 (unsigned char* out, int *outlen,
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_4);
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int UTF8ToISO8859_4 (unsigned char* out, int *outlen,
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_4);
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ISO8859_5ToUTF8 (unsigned char* out, int *outlen,
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_5);
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int UTF8ToISO8859_5 (unsigned char* out, int *outlen,
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_5);
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ISO8859_6ToUTF8 (unsigned char* out, int *outlen,
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_6);
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int UTF8ToISO8859_6 (unsigned char* out, int *outlen,
34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_6);
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ISO8859_7ToUTF8 (unsigned char* out, int *outlen,
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_7);
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int UTF8ToISO8859_7 (unsigned char* out, int *outlen,
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_7);
34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ISO8859_8ToUTF8 (unsigned char* out, int *outlen,
34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_8);
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int UTF8ToISO8859_8 (unsigned char* out, int *outlen,
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_8);
34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ISO8859_9ToUTF8 (unsigned char* out, int *outlen,
34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_9);
34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int UTF8ToISO8859_9 (unsigned char* out, int *outlen,
34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_9);
34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ISO8859_10ToUTF8 (unsigned char* out, int *outlen,
34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_10);
34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int UTF8ToISO8859_10 (unsigned char* out, int *outlen,
35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_10);
35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ISO8859_11ToUTF8 (unsigned char* out, int *outlen,
35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_11);
35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int UTF8ToISO8859_11 (unsigned char* out, int *outlen,
35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_11);
35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ISO8859_13ToUTF8 (unsigned char* out, int *outlen,
35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_13);
35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int UTF8ToISO8859_13 (unsigned char* out, int *outlen,
35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_13);
35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ISO8859_14ToUTF8 (unsigned char* out, int *outlen,
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_14);
35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int UTF8ToISO8859_14 (unsigned char* out, int *outlen,
35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_14);
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ISO8859_15ToUTF8 (unsigned char* out, int *outlen,
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_15);
35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int UTF8ToISO8859_15 (unsigned char* out, int *outlen,
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_15);
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ISO8859_16ToUTF8 (unsigned char* out, int *outlen,
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_16);
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int UTF8ToISO8859_16 (unsigned char* out, int *outlen,
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* in, int *inlen) {
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_16);
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRegisterCharEncodingHandlersISO8859x (void) {
35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler ("ISO-8859-2", ISO8859_2ToUTF8, UTF8ToISO8859_2);
35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler ("ISO-8859-3", ISO8859_3ToUTF8, UTF8ToISO8859_3);
35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler ("ISO-8859-4", ISO8859_4ToUTF8, UTF8ToISO8859_4);
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler ("ISO-8859-5", ISO8859_5ToUTF8, UTF8ToISO8859_5);
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler ("ISO-8859-6", ISO8859_6ToUTF8, UTF8ToISO8859_6);
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler ("ISO-8859-7", ISO8859_7ToUTF8, UTF8ToISO8859_7);
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler ("ISO-8859-8", ISO8859_8ToUTF8, UTF8ToISO8859_8);
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler ("ISO-8859-9", ISO8859_9ToUTF8, UTF8ToISO8859_9);
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler ("ISO-8859-10", ISO8859_10ToUTF8, UTF8ToISO8859_10);
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler ("ISO-8859-11", ISO8859_11ToUTF8, UTF8ToISO8859_11);
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler ("ISO-8859-13", ISO8859_13ToUTF8, UTF8ToISO8859_13);
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler ("ISO-8859-14", ISO8859_14ToUTF8, UTF8ToISO8859_14);
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler ("ISO-8859-15", ISO8859_15ToUTF8, UTF8ToISO8859_15);
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNewCharEncodingHandler ("ISO-8859-16", ISO8859_16ToUTF8, UTF8ToISO8859_16);
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define bottom_encoding
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "elfgcchack.h"
35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3573