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