Annotation of embedaddon/libxml2/encoding.c, revision 1.1
1.1 ! misho 1: /*
! 2: * encoding.c : implements the encoding conversion functions needed for XML
! 3: *
! 4: * Related specs:
! 5: * rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies
! 6: * rfc2781 UTF-16, an encoding of ISO 10646, P. Hoffman, F. Yergeau
! 7: * [ISO-10646] UTF-8 and UTF-16 in Annexes
! 8: * [ISO-8859-1] ISO Latin-1 characters codes.
! 9: * [UNICODE] The Unicode Consortium, "The Unicode Standard --
! 10: * Worldwide Character Encoding -- Version 1.0", Addison-
! 11: * Wesley, Volume 1, 1991, Volume 2, 1992. UTF-8 is
! 12: * described in Unicode Technical Report #4.
! 13: * [US-ASCII] Coded Character Set--7-bit American Standard Code for
! 14: * Information Interchange, ANSI X3.4-1986.
! 15: *
! 16: * See Copyright for the status of this software.
! 17: *
! 18: * daniel@veillard.com
! 19: *
! 20: * Original code for IsoLatin1 and UTF-16 by "Martin J. Duerst" <duerst@w3.org>
! 21: */
! 22:
! 23: #define IN_LIBXML
! 24: #include "libxml.h"
! 25:
! 26: #include <string.h>
! 27:
! 28: #ifdef HAVE_CTYPE_H
! 29: #include <ctype.h>
! 30: #endif
! 31: #ifdef HAVE_STDLIB_H
! 32: #include <stdlib.h>
! 33: #endif
! 34: #ifdef LIBXML_ICONV_ENABLED
! 35: #ifdef HAVE_ERRNO_H
! 36: #include <errno.h>
! 37: #endif
! 38: #endif
! 39: #include <libxml/encoding.h>
! 40: #include <libxml/xmlmemory.h>
! 41: #ifdef LIBXML_HTML_ENABLED
! 42: #include <libxml/HTMLparser.h>
! 43: #endif
! 44: #include <libxml/globals.h>
! 45: #include <libxml/xmlerror.h>
! 46:
! 47: static xmlCharEncodingHandlerPtr xmlUTF16LEHandler = NULL;
! 48: static xmlCharEncodingHandlerPtr xmlUTF16BEHandler = NULL;
! 49:
! 50: typedef struct _xmlCharEncodingAlias xmlCharEncodingAlias;
! 51: typedef xmlCharEncodingAlias *xmlCharEncodingAliasPtr;
! 52: struct _xmlCharEncodingAlias {
! 53: const char *name;
! 54: const char *alias;
! 55: };
! 56:
! 57: static xmlCharEncodingAliasPtr xmlCharEncodingAliases = NULL;
! 58: static int xmlCharEncodingAliasesNb = 0;
! 59: static int xmlCharEncodingAliasesMax = 0;
! 60:
! 61: #if defined(LIBXML_ICONV_ENABLED) || defined(LIBXML_ICU_ENABLED)
! 62: #if 0
! 63: #define DEBUG_ENCODING /* Define this to get encoding traces */
! 64: #endif
! 65: #else
! 66: #ifdef LIBXML_ISO8859X_ENABLED
! 67: static void xmlRegisterCharEncodingHandlersISO8859x (void);
! 68: #endif
! 69: #endif
! 70:
! 71: static int xmlLittleEndian = 1;
! 72:
! 73: /**
! 74: * xmlEncodingErrMemory:
! 75: * @extra: extra informations
! 76: *
! 77: * Handle an out of memory condition
! 78: */
! 79: static void
! 80: xmlEncodingErrMemory(const char *extra)
! 81: {
! 82: __xmlSimpleError(XML_FROM_I18N, XML_ERR_NO_MEMORY, NULL, NULL, extra);
! 83: }
! 84:
! 85: /**
! 86: * xmlErrEncoding:
! 87: * @error: the error number
! 88: * @msg: the error message
! 89: *
! 90: * n encoding error
! 91: */
! 92: static void
! 93: xmlEncodingErr(xmlParserErrors error, const char *msg, const char *val)
! 94: {
! 95: __xmlRaiseError(NULL, NULL, NULL, NULL, NULL,
! 96: XML_FROM_I18N, error, XML_ERR_FATAL,
! 97: NULL, 0, val, NULL, NULL, 0, 0, msg, val);
! 98: }
! 99:
! 100: #ifdef LIBXML_ICU_ENABLED
! 101: static uconv_t*
! 102: openIcuConverter(const char* name, int toUnicode)
! 103: {
! 104: UErrorCode status = U_ZERO_ERROR;
! 105: uconv_t *conv = (uconv_t *) xmlMalloc(sizeof(uconv_t));
! 106: if (conv == NULL)
! 107: return NULL;
! 108:
! 109: conv->uconv = ucnv_open(name, &status);
! 110: if (U_FAILURE(status))
! 111: goto error;
! 112:
! 113: status = U_ZERO_ERROR;
! 114: if (toUnicode) {
! 115: ucnv_setToUCallBack(conv->uconv, UCNV_TO_U_CALLBACK_STOP,
! 116: NULL, NULL, NULL, &status);
! 117: }
! 118: else {
! 119: ucnv_setFromUCallBack(conv->uconv, UCNV_FROM_U_CALLBACK_STOP,
! 120: NULL, NULL, NULL, &status);
! 121: }
! 122: if (U_FAILURE(status))
! 123: goto error;
! 124:
! 125: status = U_ZERO_ERROR;
! 126: conv->utf8 = ucnv_open("UTF-8", &status);
! 127: if (U_SUCCESS(status))
! 128: return conv;
! 129:
! 130: error:
! 131: if (conv->uconv)
! 132: ucnv_close(conv->uconv);
! 133: xmlFree(conv);
! 134: return NULL;
! 135: }
! 136:
! 137: static void
! 138: closeIcuConverter(uconv_t *conv)
! 139: {
! 140: if (conv != NULL) {
! 141: ucnv_close(conv->uconv);
! 142: ucnv_close(conv->utf8);
! 143: xmlFree(conv);
! 144: }
! 145: }
! 146: #endif /* LIBXML_ICU_ENABLED */
! 147:
! 148: /************************************************************************
! 149: * *
! 150: * Conversions To/From UTF8 encoding *
! 151: * *
! 152: ************************************************************************/
! 153:
! 154: /**
! 155: * asciiToUTF8:
! 156: * @out: a pointer to an array of bytes to store the result
! 157: * @outlen: the length of @out
! 158: * @in: a pointer to an array of ASCII chars
! 159: * @inlen: the length of @in
! 160: *
! 161: * Take a block of ASCII chars in and try to convert it to an UTF-8
! 162: * block of chars out.
! 163: * Returns 0 if success, or -1 otherwise
! 164: * The value of @inlen after return is the number of octets consumed
! 165: * if the return value is positive, else unpredictable.
! 166: * The value of @outlen after return is the number of octets consumed.
! 167: */
! 168: static int
! 169: asciiToUTF8(unsigned char* out, int *outlen,
! 170: const unsigned char* in, int *inlen) {
! 171: unsigned char* outstart = out;
! 172: const unsigned char* base = in;
! 173: const unsigned char* processed = in;
! 174: unsigned char* outend = out + *outlen;
! 175: const unsigned char* inend;
! 176: unsigned int c;
! 177:
! 178: inend = in + (*inlen);
! 179: while ((in < inend) && (out - outstart + 5 < *outlen)) {
! 180: c= *in++;
! 181:
! 182: if (out >= outend)
! 183: break;
! 184: if (c < 0x80) {
! 185: *out++ = c;
! 186: } else {
! 187: *outlen = out - outstart;
! 188: *inlen = processed - base;
! 189: return(-1);
! 190: }
! 191:
! 192: processed = (const unsigned char*) in;
! 193: }
! 194: *outlen = out - outstart;
! 195: *inlen = processed - base;
! 196: return(*outlen);
! 197: }
! 198:
! 199: #ifdef LIBXML_OUTPUT_ENABLED
! 200: /**
! 201: * UTF8Toascii:
! 202: * @out: a pointer to an array of bytes to store the result
! 203: * @outlen: the length of @out
! 204: * @in: a pointer to an array of UTF-8 chars
! 205: * @inlen: the length of @in
! 206: *
! 207: * Take a block of UTF-8 chars in and try to convert it to an ASCII
! 208: * block of chars out.
! 209: *
! 210: * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise
! 211: * The value of @inlen after return is the number of octets consumed
! 212: * if the return value is positive, else unpredictable.
! 213: * The value of @outlen after return is the number of octets consumed.
! 214: */
! 215: static int
! 216: UTF8Toascii(unsigned char* out, int *outlen,
! 217: const unsigned char* in, int *inlen) {
! 218: const unsigned char* processed = in;
! 219: const unsigned char* outend;
! 220: const unsigned char* outstart = out;
! 221: const unsigned char* instart = in;
! 222: const unsigned char* inend;
! 223: unsigned int c, d;
! 224: int trailing;
! 225:
! 226: if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1);
! 227: if (in == NULL) {
! 228: /*
! 229: * initialization nothing to do
! 230: */
! 231: *outlen = 0;
! 232: *inlen = 0;
! 233: return(0);
! 234: }
! 235: inend = in + (*inlen);
! 236: outend = out + (*outlen);
! 237: while (in < inend) {
! 238: d = *in++;
! 239: if (d < 0x80) { c= d; trailing= 0; }
! 240: else if (d < 0xC0) {
! 241: /* trailing byte in leading position */
! 242: *outlen = out - outstart;
! 243: *inlen = processed - instart;
! 244: return(-2);
! 245: } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; }
! 246: else if (d < 0xF0) { c= d & 0x0F; trailing= 2; }
! 247: else if (d < 0xF8) { c= d & 0x07; trailing= 3; }
! 248: else {
! 249: /* no chance for this in Ascii */
! 250: *outlen = out - outstart;
! 251: *inlen = processed - instart;
! 252: return(-2);
! 253: }
! 254:
! 255: if (inend - in < trailing) {
! 256: break;
! 257: }
! 258:
! 259: for ( ; trailing; trailing--) {
! 260: if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80))
! 261: break;
! 262: c <<= 6;
! 263: c |= d & 0x3F;
! 264: }
! 265:
! 266: /* assertion: c is a single UTF-4 value */
! 267: if (c < 0x80) {
! 268: if (out >= outend)
! 269: break;
! 270: *out++ = c;
! 271: } else {
! 272: /* no chance for this in Ascii */
! 273: *outlen = out - outstart;
! 274: *inlen = processed - instart;
! 275: return(-2);
! 276: }
! 277: processed = in;
! 278: }
! 279: *outlen = out - outstart;
! 280: *inlen = processed - instart;
! 281: return(*outlen);
! 282: }
! 283: #endif /* LIBXML_OUTPUT_ENABLED */
! 284:
! 285: /**
! 286: * isolat1ToUTF8:
! 287: * @out: a pointer to an array of bytes to store the result
! 288: * @outlen: the length of @out
! 289: * @in: a pointer to an array of ISO Latin 1 chars
! 290: * @inlen: the length of @in
! 291: *
! 292: * Take a block of ISO Latin 1 chars in and try to convert it to an UTF-8
! 293: * block of chars out.
! 294: * Returns the number of bytes written if success, or -1 otherwise
! 295: * The value of @inlen after return is the number of octets consumed
! 296: * if the return value is positive, else unpredictable.
! 297: * The value of @outlen after return is the number of octets consumed.
! 298: */
! 299: int
! 300: isolat1ToUTF8(unsigned char* out, int *outlen,
! 301: const unsigned char* in, int *inlen) {
! 302: unsigned char* outstart = out;
! 303: const unsigned char* base = in;
! 304: unsigned char* outend;
! 305: const unsigned char* inend;
! 306: const unsigned char* instop;
! 307:
! 308: if ((out == NULL) || (in == NULL) || (outlen == NULL) || (inlen == NULL))
! 309: return(-1);
! 310:
! 311: outend = out + *outlen;
! 312: inend = in + (*inlen);
! 313: instop = inend;
! 314:
! 315: while ((in < inend) && (out < outend - 1)) {
! 316: if (*in >= 0x80) {
! 317: *out++ = (((*in) >> 6) & 0x1F) | 0xC0;
! 318: *out++ = ((*in) & 0x3F) | 0x80;
! 319: ++in;
! 320: }
! 321: if ((instop - in) > (outend - out)) instop = in + (outend - out);
! 322: while ((in < instop) && (*in < 0x80)) {
! 323: *out++ = *in++;
! 324: }
! 325: }
! 326: if ((in < inend) && (out < outend) && (*in < 0x80)) {
! 327: *out++ = *in++;
! 328: }
! 329: *outlen = out - outstart;
! 330: *inlen = in - base;
! 331: return(*outlen);
! 332: }
! 333:
! 334: /**
! 335: * UTF8ToUTF8:
! 336: * @out: a pointer to an array of bytes to store the result
! 337: * @outlen: the length of @out
! 338: * @inb: a pointer to an array of UTF-8 chars
! 339: * @inlenb: the length of @in in UTF-8 chars
! 340: *
! 341: * No op copy operation for UTF8 handling.
! 342: *
! 343: * Returns the number of bytes written, or -1 if lack of space.
! 344: * The value of *inlen after return is the number of octets consumed
! 345: * if the return value is positive, else unpredictable.
! 346: */
! 347: static int
! 348: UTF8ToUTF8(unsigned char* out, int *outlen,
! 349: const unsigned char* inb, int *inlenb)
! 350: {
! 351: int len;
! 352:
! 353: if ((out == NULL) || (inb == NULL) || (outlen == NULL) || (inlenb == NULL))
! 354: return(-1);
! 355: if (*outlen > *inlenb) {
! 356: len = *inlenb;
! 357: } else {
! 358: len = *outlen;
! 359: }
! 360: if (len < 0)
! 361: return(-1);
! 362:
! 363: memcpy(out, inb, len);
! 364:
! 365: *outlen = len;
! 366: *inlenb = len;
! 367: return(*outlen);
! 368: }
! 369:
! 370:
! 371: #ifdef LIBXML_OUTPUT_ENABLED
! 372: /**
! 373: * UTF8Toisolat1:
! 374: * @out: a pointer to an array of bytes to store the result
! 375: * @outlen: the length of @out
! 376: * @in: a pointer to an array of UTF-8 chars
! 377: * @inlen: the length of @in
! 378: *
! 379: * Take a block of UTF-8 chars in and try to convert it to an ISO Latin 1
! 380: * block of chars out.
! 381: *
! 382: * Returns the number of bytes written if success, -2 if the transcoding fails,
! 383: or -1 otherwise
! 384: * The value of @inlen after return is the number of octets consumed
! 385: * if the return value is positive, else unpredictable.
! 386: * The value of @outlen after return is the number of octets consumed.
! 387: */
! 388: int
! 389: UTF8Toisolat1(unsigned char* out, int *outlen,
! 390: const unsigned char* in, int *inlen) {
! 391: const unsigned char* processed = in;
! 392: const unsigned char* outend;
! 393: const unsigned char* outstart = out;
! 394: const unsigned char* instart = in;
! 395: const unsigned char* inend;
! 396: unsigned int c, d;
! 397: int trailing;
! 398:
! 399: if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1);
! 400: if (in == NULL) {
! 401: /*
! 402: * initialization nothing to do
! 403: */
! 404: *outlen = 0;
! 405: *inlen = 0;
! 406: return(0);
! 407: }
! 408: inend = in + (*inlen);
! 409: outend = out + (*outlen);
! 410: while (in < inend) {
! 411: d = *in++;
! 412: if (d < 0x80) { c= d; trailing= 0; }
! 413: else if (d < 0xC0) {
! 414: /* trailing byte in leading position */
! 415: *outlen = out - outstart;
! 416: *inlen = processed - instart;
! 417: return(-2);
! 418: } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; }
! 419: else if (d < 0xF0) { c= d & 0x0F; trailing= 2; }
! 420: else if (d < 0xF8) { c= d & 0x07; trailing= 3; }
! 421: else {
! 422: /* no chance for this in IsoLat1 */
! 423: *outlen = out - outstart;
! 424: *inlen = processed - instart;
! 425: return(-2);
! 426: }
! 427:
! 428: if (inend - in < trailing) {
! 429: break;
! 430: }
! 431:
! 432: for ( ; trailing; trailing--) {
! 433: if (in >= inend)
! 434: break;
! 435: if (((d= *in++) & 0xC0) != 0x80) {
! 436: *outlen = out - outstart;
! 437: *inlen = processed - instart;
! 438: return(-2);
! 439: }
! 440: c <<= 6;
! 441: c |= d & 0x3F;
! 442: }
! 443:
! 444: /* assertion: c is a single UTF-4 value */
! 445: if (c <= 0xFF) {
! 446: if (out >= outend)
! 447: break;
! 448: *out++ = c;
! 449: } else {
! 450: /* no chance for this in IsoLat1 */
! 451: *outlen = out - outstart;
! 452: *inlen = processed - instart;
! 453: return(-2);
! 454: }
! 455: processed = in;
! 456: }
! 457: *outlen = out - outstart;
! 458: *inlen = processed - instart;
! 459: return(*outlen);
! 460: }
! 461: #endif /* LIBXML_OUTPUT_ENABLED */
! 462:
! 463: /**
! 464: * UTF16LEToUTF8:
! 465: * @out: a pointer to an array of bytes to store the result
! 466: * @outlen: the length of @out
! 467: * @inb: a pointer to an array of UTF-16LE passwd as a byte array
! 468: * @inlenb: the length of @in in UTF-16LE chars
! 469: *
! 470: * Take a block of UTF-16LE ushorts in and try to convert it to an UTF-8
! 471: * block of chars out. This function assumes the endian property
! 472: * is the same between the native type of this machine and the
! 473: * inputed one.
! 474: *
! 475: * Returns the number of bytes written, or -1 if lack of space, or -2
! 476: * if the transcoding fails (if *in is not a valid utf16 string)
! 477: * The value of *inlen after return is the number of octets consumed
! 478: * if the return value is positive, else unpredictable.
! 479: */
! 480: static int
! 481: UTF16LEToUTF8(unsigned char* out, int *outlen,
! 482: const unsigned char* inb, int *inlenb)
! 483: {
! 484: unsigned char* outstart = out;
! 485: const unsigned char* processed = inb;
! 486: unsigned char* outend = out + *outlen;
! 487: unsigned short* in = (unsigned short*) inb;
! 488: unsigned short* inend;
! 489: unsigned int c, d, inlen;
! 490: unsigned char *tmp;
! 491: int bits;
! 492:
! 493: if ((*inlenb % 2) == 1)
! 494: (*inlenb)--;
! 495: inlen = *inlenb / 2;
! 496: inend = in + inlen;
! 497: while ((in < inend) && (out - outstart + 5 < *outlen)) {
! 498: if (xmlLittleEndian) {
! 499: c= *in++;
! 500: } else {
! 501: tmp = (unsigned char *) in;
! 502: c = *tmp++;
! 503: c = c | (((unsigned int)*tmp) << 8);
! 504: in++;
! 505: }
! 506: if ((c & 0xFC00) == 0xD800) { /* surrogates */
! 507: if (in >= inend) { /* (in > inend) shouldn't happens */
! 508: break;
! 509: }
! 510: if (xmlLittleEndian) {
! 511: d = *in++;
! 512: } else {
! 513: tmp = (unsigned char *) in;
! 514: d = *tmp++;
! 515: d = d | (((unsigned int)*tmp) << 8);
! 516: in++;
! 517: }
! 518: if ((d & 0xFC00) == 0xDC00) {
! 519: c &= 0x03FF;
! 520: c <<= 10;
! 521: c |= d & 0x03FF;
! 522: c += 0x10000;
! 523: }
! 524: else {
! 525: *outlen = out - outstart;
! 526: *inlenb = processed - inb;
! 527: return(-2);
! 528: }
! 529: }
! 530:
! 531: /* assertion: c is a single UTF-4 value */
! 532: if (out >= outend)
! 533: break;
! 534: if (c < 0x80) { *out++= c; bits= -6; }
! 535: else if (c < 0x800) { *out++= ((c >> 6) & 0x1F) | 0xC0; bits= 0; }
! 536: else if (c < 0x10000) { *out++= ((c >> 12) & 0x0F) | 0xE0; bits= 6; }
! 537: else { *out++= ((c >> 18) & 0x07) | 0xF0; bits= 12; }
! 538:
! 539: for ( ; bits >= 0; bits-= 6) {
! 540: if (out >= outend)
! 541: break;
! 542: *out++= ((c >> bits) & 0x3F) | 0x80;
! 543: }
! 544: processed = (const unsigned char*) in;
! 545: }
! 546: *outlen = out - outstart;
! 547: *inlenb = processed - inb;
! 548: return(*outlen);
! 549: }
! 550:
! 551: #ifdef LIBXML_OUTPUT_ENABLED
! 552: /**
! 553: * UTF8ToUTF16LE:
! 554: * @outb: a pointer to an array of bytes to store the result
! 555: * @outlen: the length of @outb
! 556: * @in: a pointer to an array of UTF-8 chars
! 557: * @inlen: the length of @in
! 558: *
! 559: * Take a block of UTF-8 chars in and try to convert it to an UTF-16LE
! 560: * block of chars out.
! 561: *
! 562: * Returns the number of bytes written, or -1 if lack of space, or -2
! 563: * if the transcoding failed.
! 564: */
! 565: static int
! 566: UTF8ToUTF16LE(unsigned char* outb, int *outlen,
! 567: const unsigned char* in, int *inlen)
! 568: {
! 569: unsigned short* out = (unsigned short*) outb;
! 570: const unsigned char* processed = in;
! 571: const unsigned char *const instart = in;
! 572: unsigned short* outstart= out;
! 573: unsigned short* outend;
! 574: const unsigned char* inend;
! 575: unsigned int c, d;
! 576: int trailing;
! 577: unsigned char *tmp;
! 578: unsigned short tmp1, tmp2;
! 579:
! 580: /* UTF16LE encoding has no BOM */
! 581: if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1);
! 582: if (in == NULL) {
! 583: *outlen = 0;
! 584: *inlen = 0;
! 585: return(0);
! 586: }
! 587: inend= in + *inlen;
! 588: outend = out + (*outlen / 2);
! 589: while (in < inend) {
! 590: d= *in++;
! 591: if (d < 0x80) { c= d; trailing= 0; }
! 592: else if (d < 0xC0) {
! 593: /* trailing byte in leading position */
! 594: *outlen = (out - outstart) * 2;
! 595: *inlen = processed - instart;
! 596: return(-2);
! 597: } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; }
! 598: else if (d < 0xF0) { c= d & 0x0F; trailing= 2; }
! 599: else if (d < 0xF8) { c= d & 0x07; trailing= 3; }
! 600: else {
! 601: /* no chance for this in UTF-16 */
! 602: *outlen = (out - outstart) * 2;
! 603: *inlen = processed - instart;
! 604: return(-2);
! 605: }
! 606:
! 607: if (inend - in < trailing) {
! 608: break;
! 609: }
! 610:
! 611: for ( ; trailing; trailing--) {
! 612: if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80))
! 613: break;
! 614: c <<= 6;
! 615: c |= d & 0x3F;
! 616: }
! 617:
! 618: /* assertion: c is a single UTF-4 value */
! 619: if (c < 0x10000) {
! 620: if (out >= outend)
! 621: break;
! 622: if (xmlLittleEndian) {
! 623: *out++ = c;
! 624: } else {
! 625: tmp = (unsigned char *) out;
! 626: *tmp = c ;
! 627: *(tmp + 1) = c >> 8 ;
! 628: out++;
! 629: }
! 630: }
! 631: else if (c < 0x110000) {
! 632: if (out+1 >= outend)
! 633: break;
! 634: c -= 0x10000;
! 635: if (xmlLittleEndian) {
! 636: *out++ = 0xD800 | (c >> 10);
! 637: *out++ = 0xDC00 | (c & 0x03FF);
! 638: } else {
! 639: tmp1 = 0xD800 | (c >> 10);
! 640: tmp = (unsigned char *) out;
! 641: *tmp = (unsigned char) tmp1;
! 642: *(tmp + 1) = tmp1 >> 8;
! 643: out++;
! 644:
! 645: tmp2 = 0xDC00 | (c & 0x03FF);
! 646: tmp = (unsigned char *) out;
! 647: *tmp = (unsigned char) tmp2;
! 648: *(tmp + 1) = tmp2 >> 8;
! 649: out++;
! 650: }
! 651: }
! 652: else
! 653: break;
! 654: processed = in;
! 655: }
! 656: *outlen = (out - outstart) * 2;
! 657: *inlen = processed - instart;
! 658: return(*outlen);
! 659: }
! 660:
! 661: /**
! 662: * UTF8ToUTF16:
! 663: * @outb: a pointer to an array of bytes to store the result
! 664: * @outlen: the length of @outb
! 665: * @in: a pointer to an array of UTF-8 chars
! 666: * @inlen: the length of @in
! 667: *
! 668: * Take a block of UTF-8 chars in and try to convert it to an UTF-16
! 669: * block of chars out.
! 670: *
! 671: * Returns the number of bytes written, or -1 if lack of space, or -2
! 672: * if the transcoding failed.
! 673: */
! 674: static int
! 675: UTF8ToUTF16(unsigned char* outb, int *outlen,
! 676: const unsigned char* in, int *inlen)
! 677: {
! 678: if (in == NULL) {
! 679: /*
! 680: * initialization, add the Byte Order Mark for UTF-16LE
! 681: */
! 682: if (*outlen >= 2) {
! 683: outb[0] = 0xFF;
! 684: outb[1] = 0xFE;
! 685: *outlen = 2;
! 686: *inlen = 0;
! 687: #ifdef DEBUG_ENCODING
! 688: xmlGenericError(xmlGenericErrorContext,
! 689: "Added FFFE Byte Order Mark\n");
! 690: #endif
! 691: return(2);
! 692: }
! 693: *outlen = 0;
! 694: *inlen = 0;
! 695: return(0);
! 696: }
! 697: return (UTF8ToUTF16LE(outb, outlen, in, inlen));
! 698: }
! 699: #endif /* LIBXML_OUTPUT_ENABLED */
! 700:
! 701: /**
! 702: * UTF16BEToUTF8:
! 703: * @out: a pointer to an array of bytes to store the result
! 704: * @outlen: the length of @out
! 705: * @inb: a pointer to an array of UTF-16 passed as a byte array
! 706: * @inlenb: the length of @in in UTF-16 chars
! 707: *
! 708: * Take a block of UTF-16 ushorts in and try to convert it to an UTF-8
! 709: * block of chars out. This function assumes the endian property
! 710: * is the same between the native type of this machine and the
! 711: * inputed one.
! 712: *
! 713: * Returns the number of bytes written, or -1 if lack of space, or -2
! 714: * if the transcoding fails (if *in is not a valid utf16 string)
! 715: * The value of *inlen after return is the number of octets consumed
! 716: * if the return value is positive, else unpredictable.
! 717: */
! 718: static int
! 719: UTF16BEToUTF8(unsigned char* out, int *outlen,
! 720: const unsigned char* inb, int *inlenb)
! 721: {
! 722: unsigned char* outstart = out;
! 723: const unsigned char* processed = inb;
! 724: unsigned char* outend = out + *outlen;
! 725: unsigned short* in = (unsigned short*) inb;
! 726: unsigned short* inend;
! 727: unsigned int c, d, inlen;
! 728: unsigned char *tmp;
! 729: int bits;
! 730:
! 731: if ((*inlenb % 2) == 1)
! 732: (*inlenb)--;
! 733: inlen = *inlenb / 2;
! 734: inend= in + inlen;
! 735: while (in < inend) {
! 736: if (xmlLittleEndian) {
! 737: tmp = (unsigned char *) in;
! 738: c = *tmp++;
! 739: c = c << 8;
! 740: c = c | (unsigned int) *tmp;
! 741: in++;
! 742: } else {
! 743: c= *in++;
! 744: }
! 745: if ((c & 0xFC00) == 0xD800) { /* surrogates */
! 746: if (in >= inend) { /* (in > inend) shouldn't happens */
! 747: *outlen = out - outstart;
! 748: *inlenb = processed - inb;
! 749: return(-2);
! 750: }
! 751: if (xmlLittleEndian) {
! 752: tmp = (unsigned char *) in;
! 753: d = *tmp++;
! 754: d = d << 8;
! 755: d = d | (unsigned int) *tmp;
! 756: in++;
! 757: } else {
! 758: d= *in++;
! 759: }
! 760: if ((d & 0xFC00) == 0xDC00) {
! 761: c &= 0x03FF;
! 762: c <<= 10;
! 763: c |= d & 0x03FF;
! 764: c += 0x10000;
! 765: }
! 766: else {
! 767: *outlen = out - outstart;
! 768: *inlenb = processed - inb;
! 769: return(-2);
! 770: }
! 771: }
! 772:
! 773: /* assertion: c is a single UTF-4 value */
! 774: if (out >= outend)
! 775: break;
! 776: if (c < 0x80) { *out++= c; bits= -6; }
! 777: else if (c < 0x800) { *out++= ((c >> 6) & 0x1F) | 0xC0; bits= 0; }
! 778: else if (c < 0x10000) { *out++= ((c >> 12) & 0x0F) | 0xE0; bits= 6; }
! 779: else { *out++= ((c >> 18) & 0x07) | 0xF0; bits= 12; }
! 780:
! 781: for ( ; bits >= 0; bits-= 6) {
! 782: if (out >= outend)
! 783: break;
! 784: *out++= ((c >> bits) & 0x3F) | 0x80;
! 785: }
! 786: processed = (const unsigned char*) in;
! 787: }
! 788: *outlen = out - outstart;
! 789: *inlenb = processed - inb;
! 790: return(*outlen);
! 791: }
! 792:
! 793: #ifdef LIBXML_OUTPUT_ENABLED
! 794: /**
! 795: * UTF8ToUTF16BE:
! 796: * @outb: a pointer to an array of bytes to store the result
! 797: * @outlen: the length of @outb
! 798: * @in: a pointer to an array of UTF-8 chars
! 799: * @inlen: the length of @in
! 800: *
! 801: * Take a block of UTF-8 chars in and try to convert it to an UTF-16BE
! 802: * block of chars out.
! 803: *
! 804: * Returns the number of byte written, or -1 by lack of space, or -2
! 805: * if the transcoding failed.
! 806: */
! 807: static int
! 808: UTF8ToUTF16BE(unsigned char* outb, int *outlen,
! 809: const unsigned char* in, int *inlen)
! 810: {
! 811: unsigned short* out = (unsigned short*) outb;
! 812: const unsigned char* processed = in;
! 813: const unsigned char *const instart = in;
! 814: unsigned short* outstart= out;
! 815: unsigned short* outend;
! 816: const unsigned char* inend;
! 817: unsigned int c, d;
! 818: int trailing;
! 819: unsigned char *tmp;
! 820: unsigned short tmp1, tmp2;
! 821:
! 822: /* UTF-16BE has no BOM */
! 823: if ((outb == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1);
! 824: if (in == NULL) {
! 825: *outlen = 0;
! 826: *inlen = 0;
! 827: return(0);
! 828: }
! 829: inend= in + *inlen;
! 830: outend = out + (*outlen / 2);
! 831: while (in < inend) {
! 832: d= *in++;
! 833: if (d < 0x80) { c= d; trailing= 0; }
! 834: else if (d < 0xC0) {
! 835: /* trailing byte in leading position */
! 836: *outlen = out - outstart;
! 837: *inlen = processed - instart;
! 838: return(-2);
! 839: } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; }
! 840: else if (d < 0xF0) { c= d & 0x0F; trailing= 2; }
! 841: else if (d < 0xF8) { c= d & 0x07; trailing= 3; }
! 842: else {
! 843: /* no chance for this in UTF-16 */
! 844: *outlen = out - outstart;
! 845: *inlen = processed - instart;
! 846: return(-2);
! 847: }
! 848:
! 849: if (inend - in < trailing) {
! 850: break;
! 851: }
! 852:
! 853: for ( ; trailing; trailing--) {
! 854: if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) break;
! 855: c <<= 6;
! 856: c |= d & 0x3F;
! 857: }
! 858:
! 859: /* assertion: c is a single UTF-4 value */
! 860: if (c < 0x10000) {
! 861: if (out >= outend) break;
! 862: if (xmlLittleEndian) {
! 863: tmp = (unsigned char *) out;
! 864: *tmp = c >> 8;
! 865: *(tmp + 1) = c;
! 866: out++;
! 867: } else {
! 868: *out++ = c;
! 869: }
! 870: }
! 871: else if (c < 0x110000) {
! 872: if (out+1 >= outend) break;
! 873: c -= 0x10000;
! 874: if (xmlLittleEndian) {
! 875: tmp1 = 0xD800 | (c >> 10);
! 876: tmp = (unsigned char *) out;
! 877: *tmp = tmp1 >> 8;
! 878: *(tmp + 1) = (unsigned char) tmp1;
! 879: out++;
! 880:
! 881: tmp2 = 0xDC00 | (c & 0x03FF);
! 882: tmp = (unsigned char *) out;
! 883: *tmp = tmp2 >> 8;
! 884: *(tmp + 1) = (unsigned char) tmp2;
! 885: out++;
! 886: } else {
! 887: *out++ = 0xD800 | (c >> 10);
! 888: *out++ = 0xDC00 | (c & 0x03FF);
! 889: }
! 890: }
! 891: else
! 892: break;
! 893: processed = in;
! 894: }
! 895: *outlen = (out - outstart) * 2;
! 896: *inlen = processed - instart;
! 897: return(*outlen);
! 898: }
! 899: #endif /* LIBXML_OUTPUT_ENABLED */
! 900:
! 901: /************************************************************************
! 902: * *
! 903: * Generic encoding handling routines *
! 904: * *
! 905: ************************************************************************/
! 906:
! 907: /**
! 908: * xmlDetectCharEncoding:
! 909: * @in: a pointer to the first bytes of the XML entity, must be at least
! 910: * 2 bytes long (at least 4 if encoding is UTF4 variant).
! 911: * @len: pointer to the length of the buffer
! 912: *
! 913: * Guess the encoding of the entity using the first bytes of the entity content
! 914: * according to the non-normative appendix F of the XML-1.0 recommendation.
! 915: *
! 916: * Returns one of the XML_CHAR_ENCODING_... values.
! 917: */
! 918: xmlCharEncoding
! 919: xmlDetectCharEncoding(const unsigned char* in, int len)
! 920: {
! 921: if (in == NULL)
! 922: return(XML_CHAR_ENCODING_NONE);
! 923: if (len >= 4) {
! 924: if ((in[0] == 0x00) && (in[1] == 0x00) &&
! 925: (in[2] == 0x00) && (in[3] == 0x3C))
! 926: return(XML_CHAR_ENCODING_UCS4BE);
! 927: if ((in[0] == 0x3C) && (in[1] == 0x00) &&
! 928: (in[2] == 0x00) && (in[3] == 0x00))
! 929: return(XML_CHAR_ENCODING_UCS4LE);
! 930: if ((in[0] == 0x00) && (in[1] == 0x00) &&
! 931: (in[2] == 0x3C) && (in[3] == 0x00))
! 932: return(XML_CHAR_ENCODING_UCS4_2143);
! 933: if ((in[0] == 0x00) && (in[1] == 0x3C) &&
! 934: (in[2] == 0x00) && (in[3] == 0x00))
! 935: return(XML_CHAR_ENCODING_UCS4_3412);
! 936: if ((in[0] == 0x4C) && (in[1] == 0x6F) &&
! 937: (in[2] == 0xA7) && (in[3] == 0x94))
! 938: return(XML_CHAR_ENCODING_EBCDIC);
! 939: if ((in[0] == 0x3C) && (in[1] == 0x3F) &&
! 940: (in[2] == 0x78) && (in[3] == 0x6D))
! 941: return(XML_CHAR_ENCODING_UTF8);
! 942: /*
! 943: * Although not part of the recommendation, we also
! 944: * attempt an "auto-recognition" of UTF-16LE and
! 945: * UTF-16BE encodings.
! 946: */
! 947: if ((in[0] == 0x3C) && (in[1] == 0x00) &&
! 948: (in[2] == 0x3F) && (in[3] == 0x00))
! 949: return(XML_CHAR_ENCODING_UTF16LE);
! 950: if ((in[0] == 0x00) && (in[1] == 0x3C) &&
! 951: (in[2] == 0x00) && (in[3] == 0x3F))
! 952: return(XML_CHAR_ENCODING_UTF16BE);
! 953: }
! 954: if (len >= 3) {
! 955: /*
! 956: * Errata on XML-1.0 June 20 2001
! 957: * We now allow an UTF8 encoded BOM
! 958: */
! 959: if ((in[0] == 0xEF) && (in[1] == 0xBB) &&
! 960: (in[2] == 0xBF))
! 961: return(XML_CHAR_ENCODING_UTF8);
! 962: }
! 963: /* For UTF-16 we can recognize by the BOM */
! 964: if (len >= 2) {
! 965: if ((in[0] == 0xFE) && (in[1] == 0xFF))
! 966: return(XML_CHAR_ENCODING_UTF16BE);
! 967: if ((in[0] == 0xFF) && (in[1] == 0xFE))
! 968: return(XML_CHAR_ENCODING_UTF16LE);
! 969: }
! 970: return(XML_CHAR_ENCODING_NONE);
! 971: }
! 972:
! 973: /**
! 974: * xmlCleanupEncodingAliases:
! 975: *
! 976: * Unregisters all aliases
! 977: */
! 978: void
! 979: xmlCleanupEncodingAliases(void) {
! 980: int i;
! 981:
! 982: if (xmlCharEncodingAliases == NULL)
! 983: return;
! 984:
! 985: for (i = 0;i < xmlCharEncodingAliasesNb;i++) {
! 986: if (xmlCharEncodingAliases[i].name != NULL)
! 987: xmlFree((char *) xmlCharEncodingAliases[i].name);
! 988: if (xmlCharEncodingAliases[i].alias != NULL)
! 989: xmlFree((char *) xmlCharEncodingAliases[i].alias);
! 990: }
! 991: xmlCharEncodingAliasesNb = 0;
! 992: xmlCharEncodingAliasesMax = 0;
! 993: xmlFree(xmlCharEncodingAliases);
! 994: xmlCharEncodingAliases = NULL;
! 995: }
! 996:
! 997: /**
! 998: * xmlGetEncodingAlias:
! 999: * @alias: the alias name as parsed, in UTF-8 format (ASCII actually)
! 1000: *
! 1001: * Lookup an encoding name for the given alias.
! 1002: *
! 1003: * Returns NULL if not found, otherwise the original name
! 1004: */
! 1005: const char *
! 1006: xmlGetEncodingAlias(const char *alias) {
! 1007: int i;
! 1008: char upper[100];
! 1009:
! 1010: if (alias == NULL)
! 1011: return(NULL);
! 1012:
! 1013: if (xmlCharEncodingAliases == NULL)
! 1014: return(NULL);
! 1015:
! 1016: for (i = 0;i < 99;i++) {
! 1017: upper[i] = toupper(alias[i]);
! 1018: if (upper[i] == 0) break;
! 1019: }
! 1020: upper[i] = 0;
! 1021:
! 1022: /*
! 1023: * Walk down the list looking for a definition of the alias
! 1024: */
! 1025: for (i = 0;i < xmlCharEncodingAliasesNb;i++) {
! 1026: if (!strcmp(xmlCharEncodingAliases[i].alias, upper)) {
! 1027: return(xmlCharEncodingAliases[i].name);
! 1028: }
! 1029: }
! 1030: return(NULL);
! 1031: }
! 1032:
! 1033: /**
! 1034: * xmlAddEncodingAlias:
! 1035: * @name: the encoding name as parsed, in UTF-8 format (ASCII actually)
! 1036: * @alias: the alias name as parsed, in UTF-8 format (ASCII actually)
! 1037: *
! 1038: * Registers an alias @alias for an encoding named @name. Existing alias
! 1039: * will be overwritten.
! 1040: *
! 1041: * Returns 0 in case of success, -1 in case of error
! 1042: */
! 1043: int
! 1044: xmlAddEncodingAlias(const char *name, const char *alias) {
! 1045: int i;
! 1046: char upper[100];
! 1047:
! 1048: if ((name == NULL) || (alias == NULL))
! 1049: return(-1);
! 1050:
! 1051: for (i = 0;i < 99;i++) {
! 1052: upper[i] = toupper(alias[i]);
! 1053: if (upper[i] == 0) break;
! 1054: }
! 1055: upper[i] = 0;
! 1056:
! 1057: if (xmlCharEncodingAliases == NULL) {
! 1058: xmlCharEncodingAliasesNb = 0;
! 1059: xmlCharEncodingAliasesMax = 20;
! 1060: xmlCharEncodingAliases = (xmlCharEncodingAliasPtr)
! 1061: xmlMalloc(xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias));
! 1062: if (xmlCharEncodingAliases == NULL)
! 1063: return(-1);
! 1064: } else if (xmlCharEncodingAliasesNb >= xmlCharEncodingAliasesMax) {
! 1065: xmlCharEncodingAliasesMax *= 2;
! 1066: xmlCharEncodingAliases = (xmlCharEncodingAliasPtr)
! 1067: xmlRealloc(xmlCharEncodingAliases,
! 1068: xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias));
! 1069: }
! 1070: /*
! 1071: * Walk down the list looking for a definition of the alias
! 1072: */
! 1073: for (i = 0;i < xmlCharEncodingAliasesNb;i++) {
! 1074: if (!strcmp(xmlCharEncodingAliases[i].alias, upper)) {
! 1075: /*
! 1076: * Replace the definition.
! 1077: */
! 1078: xmlFree((char *) xmlCharEncodingAliases[i].name);
! 1079: xmlCharEncodingAliases[i].name = xmlMemStrdup(name);
! 1080: return(0);
! 1081: }
! 1082: }
! 1083: /*
! 1084: * Add the definition
! 1085: */
! 1086: xmlCharEncodingAliases[xmlCharEncodingAliasesNb].name = xmlMemStrdup(name);
! 1087: xmlCharEncodingAliases[xmlCharEncodingAliasesNb].alias = xmlMemStrdup(upper);
! 1088: xmlCharEncodingAliasesNb++;
! 1089: return(0);
! 1090: }
! 1091:
! 1092: /**
! 1093: * xmlDelEncodingAlias:
! 1094: * @alias: the alias name as parsed, in UTF-8 format (ASCII actually)
! 1095: *
! 1096: * Unregisters an encoding alias @alias
! 1097: *
! 1098: * Returns 0 in case of success, -1 in case of error
! 1099: */
! 1100: int
! 1101: xmlDelEncodingAlias(const char *alias) {
! 1102: int i;
! 1103:
! 1104: if (alias == NULL)
! 1105: return(-1);
! 1106:
! 1107: if (xmlCharEncodingAliases == NULL)
! 1108: return(-1);
! 1109: /*
! 1110: * Walk down the list looking for a definition of the alias
! 1111: */
! 1112: for (i = 0;i < xmlCharEncodingAliasesNb;i++) {
! 1113: if (!strcmp(xmlCharEncodingAliases[i].alias, alias)) {
! 1114: xmlFree((char *) xmlCharEncodingAliases[i].name);
! 1115: xmlFree((char *) xmlCharEncodingAliases[i].alias);
! 1116: xmlCharEncodingAliasesNb--;
! 1117: memmove(&xmlCharEncodingAliases[i], &xmlCharEncodingAliases[i + 1],
! 1118: sizeof(xmlCharEncodingAlias) * (xmlCharEncodingAliasesNb - i));
! 1119: return(0);
! 1120: }
! 1121: }
! 1122: return(-1);
! 1123: }
! 1124:
! 1125: /**
! 1126: * xmlParseCharEncoding:
! 1127: * @name: the encoding name as parsed, in UTF-8 format (ASCII actually)
! 1128: *
! 1129: * Compare the string to the encoding schemes already known. Note
! 1130: * that the comparison is case insensitive accordingly to the section
! 1131: * [XML] 4.3.3 Character Encoding in Entities.
! 1132: *
! 1133: * Returns one of the XML_CHAR_ENCODING_... values or XML_CHAR_ENCODING_NONE
! 1134: * if not recognized.
! 1135: */
! 1136: xmlCharEncoding
! 1137: xmlParseCharEncoding(const char* name)
! 1138: {
! 1139: const char *alias;
! 1140: char upper[500];
! 1141: int i;
! 1142:
! 1143: if (name == NULL)
! 1144: return(XML_CHAR_ENCODING_NONE);
! 1145:
! 1146: /*
! 1147: * Do the alias resolution
! 1148: */
! 1149: alias = xmlGetEncodingAlias(name);
! 1150: if (alias != NULL)
! 1151: name = alias;
! 1152:
! 1153: for (i = 0;i < 499;i++) {
! 1154: upper[i] = toupper(name[i]);
! 1155: if (upper[i] == 0) break;
! 1156: }
! 1157: upper[i] = 0;
! 1158:
! 1159: if (!strcmp(upper, "")) return(XML_CHAR_ENCODING_NONE);
! 1160: if (!strcmp(upper, "UTF-8")) return(XML_CHAR_ENCODING_UTF8);
! 1161: if (!strcmp(upper, "UTF8")) return(XML_CHAR_ENCODING_UTF8);
! 1162:
! 1163: /*
! 1164: * NOTE: if we were able to parse this, the endianness of UTF16 is
! 1165: * already found and in use
! 1166: */
! 1167: if (!strcmp(upper, "UTF-16")) return(XML_CHAR_ENCODING_UTF16LE);
! 1168: if (!strcmp(upper, "UTF16")) return(XML_CHAR_ENCODING_UTF16LE);
! 1169:
! 1170: if (!strcmp(upper, "ISO-10646-UCS-2")) return(XML_CHAR_ENCODING_UCS2);
! 1171: if (!strcmp(upper, "UCS-2")) return(XML_CHAR_ENCODING_UCS2);
! 1172: if (!strcmp(upper, "UCS2")) return(XML_CHAR_ENCODING_UCS2);
! 1173:
! 1174: /*
! 1175: * NOTE: if we were able to parse this, the endianness of UCS4 is
! 1176: * already found and in use
! 1177: */
! 1178: if (!strcmp(upper, "ISO-10646-UCS-4")) return(XML_CHAR_ENCODING_UCS4LE);
! 1179: if (!strcmp(upper, "UCS-4")) return(XML_CHAR_ENCODING_UCS4LE);
! 1180: if (!strcmp(upper, "UCS4")) return(XML_CHAR_ENCODING_UCS4LE);
! 1181:
! 1182:
! 1183: if (!strcmp(upper, "ISO-8859-1")) return(XML_CHAR_ENCODING_8859_1);
! 1184: if (!strcmp(upper, "ISO-LATIN-1")) return(XML_CHAR_ENCODING_8859_1);
! 1185: if (!strcmp(upper, "ISO LATIN 1")) return(XML_CHAR_ENCODING_8859_1);
! 1186:
! 1187: if (!strcmp(upper, "ISO-8859-2")) return(XML_CHAR_ENCODING_8859_2);
! 1188: if (!strcmp(upper, "ISO-LATIN-2")) return(XML_CHAR_ENCODING_8859_2);
! 1189: if (!strcmp(upper, "ISO LATIN 2")) return(XML_CHAR_ENCODING_8859_2);
! 1190:
! 1191: if (!strcmp(upper, "ISO-8859-3")) return(XML_CHAR_ENCODING_8859_3);
! 1192: if (!strcmp(upper, "ISO-8859-4")) return(XML_CHAR_ENCODING_8859_4);
! 1193: if (!strcmp(upper, "ISO-8859-5")) return(XML_CHAR_ENCODING_8859_5);
! 1194: if (!strcmp(upper, "ISO-8859-6")) return(XML_CHAR_ENCODING_8859_6);
! 1195: if (!strcmp(upper, "ISO-8859-7")) return(XML_CHAR_ENCODING_8859_7);
! 1196: if (!strcmp(upper, "ISO-8859-8")) return(XML_CHAR_ENCODING_8859_8);
! 1197: if (!strcmp(upper, "ISO-8859-9")) return(XML_CHAR_ENCODING_8859_9);
! 1198:
! 1199: if (!strcmp(upper, "ISO-2022-JP")) return(XML_CHAR_ENCODING_2022_JP);
! 1200: if (!strcmp(upper, "SHIFT_JIS")) return(XML_CHAR_ENCODING_SHIFT_JIS);
! 1201: if (!strcmp(upper, "EUC-JP")) return(XML_CHAR_ENCODING_EUC_JP);
! 1202:
! 1203: #ifdef DEBUG_ENCODING
! 1204: xmlGenericError(xmlGenericErrorContext, "Unknown encoding %s\n", name);
! 1205: #endif
! 1206: return(XML_CHAR_ENCODING_ERROR);
! 1207: }
! 1208:
! 1209: /**
! 1210: * xmlGetCharEncodingName:
! 1211: * @enc: the encoding
! 1212: *
! 1213: * The "canonical" name for XML encoding.
! 1214: * C.f. http://www.w3.org/TR/REC-xml#charencoding
! 1215: * Section 4.3.3 Character Encoding in Entities
! 1216: *
! 1217: * Returns the canonical name for the given encoding
! 1218: */
! 1219:
! 1220: const char*
! 1221: xmlGetCharEncodingName(xmlCharEncoding enc) {
! 1222: switch (enc) {
! 1223: case XML_CHAR_ENCODING_ERROR:
! 1224: return(NULL);
! 1225: case XML_CHAR_ENCODING_NONE:
! 1226: return(NULL);
! 1227: case XML_CHAR_ENCODING_UTF8:
! 1228: return("UTF-8");
! 1229: case XML_CHAR_ENCODING_UTF16LE:
! 1230: return("UTF-16");
! 1231: case XML_CHAR_ENCODING_UTF16BE:
! 1232: return("UTF-16");
! 1233: case XML_CHAR_ENCODING_EBCDIC:
! 1234: return("EBCDIC");
! 1235: case XML_CHAR_ENCODING_UCS4LE:
! 1236: return("ISO-10646-UCS-4");
! 1237: case XML_CHAR_ENCODING_UCS4BE:
! 1238: return("ISO-10646-UCS-4");
! 1239: case XML_CHAR_ENCODING_UCS4_2143:
! 1240: return("ISO-10646-UCS-4");
! 1241: case XML_CHAR_ENCODING_UCS4_3412:
! 1242: return("ISO-10646-UCS-4");
! 1243: case XML_CHAR_ENCODING_UCS2:
! 1244: return("ISO-10646-UCS-2");
! 1245: case XML_CHAR_ENCODING_8859_1:
! 1246: return("ISO-8859-1");
! 1247: case XML_CHAR_ENCODING_8859_2:
! 1248: return("ISO-8859-2");
! 1249: case XML_CHAR_ENCODING_8859_3:
! 1250: return("ISO-8859-3");
! 1251: case XML_CHAR_ENCODING_8859_4:
! 1252: return("ISO-8859-4");
! 1253: case XML_CHAR_ENCODING_8859_5:
! 1254: return("ISO-8859-5");
! 1255: case XML_CHAR_ENCODING_8859_6:
! 1256: return("ISO-8859-6");
! 1257: case XML_CHAR_ENCODING_8859_7:
! 1258: return("ISO-8859-7");
! 1259: case XML_CHAR_ENCODING_8859_8:
! 1260: return("ISO-8859-8");
! 1261: case XML_CHAR_ENCODING_8859_9:
! 1262: return("ISO-8859-9");
! 1263: case XML_CHAR_ENCODING_2022_JP:
! 1264: return("ISO-2022-JP");
! 1265: case XML_CHAR_ENCODING_SHIFT_JIS:
! 1266: return("Shift-JIS");
! 1267: case XML_CHAR_ENCODING_EUC_JP:
! 1268: return("EUC-JP");
! 1269: case XML_CHAR_ENCODING_ASCII:
! 1270: return(NULL);
! 1271: }
! 1272: return(NULL);
! 1273: }
! 1274:
! 1275: /************************************************************************
! 1276: * *
! 1277: * Char encoding handlers *
! 1278: * *
! 1279: ************************************************************************/
! 1280:
! 1281:
! 1282: /* the size should be growable, but it's not a big deal ... */
! 1283: #define MAX_ENCODING_HANDLERS 50
! 1284: static xmlCharEncodingHandlerPtr *handlers = NULL;
! 1285: static int nbCharEncodingHandler = 0;
! 1286:
! 1287: /*
! 1288: * The default is UTF-8 for XML, that's also the default used for the
! 1289: * parser internals, so the default encoding handler is NULL
! 1290: */
! 1291:
! 1292: static xmlCharEncodingHandlerPtr xmlDefaultCharEncodingHandler = NULL;
! 1293:
! 1294: /**
! 1295: * xmlNewCharEncodingHandler:
! 1296: * @name: the encoding name, in UTF-8 format (ASCII actually)
! 1297: * @input: the xmlCharEncodingInputFunc to read that encoding
! 1298: * @output: the xmlCharEncodingOutputFunc to write that encoding
! 1299: *
! 1300: * Create and registers an xmlCharEncodingHandler.
! 1301: *
! 1302: * Returns the xmlCharEncodingHandlerPtr created (or NULL in case of error).
! 1303: */
! 1304: xmlCharEncodingHandlerPtr
! 1305: xmlNewCharEncodingHandler(const char *name,
! 1306: xmlCharEncodingInputFunc input,
! 1307: xmlCharEncodingOutputFunc output) {
! 1308: xmlCharEncodingHandlerPtr handler;
! 1309: const char *alias;
! 1310: char upper[500];
! 1311: int i;
! 1312: char *up = NULL;
! 1313:
! 1314: /*
! 1315: * Do the alias resolution
! 1316: */
! 1317: alias = xmlGetEncodingAlias(name);
! 1318: if (alias != NULL)
! 1319: name = alias;
! 1320:
! 1321: /*
! 1322: * Keep only the uppercase version of the encoding.
! 1323: */
! 1324: if (name == NULL) {
! 1325: xmlEncodingErr(XML_I18N_NO_NAME,
! 1326: "xmlNewCharEncodingHandler : no name !\n", NULL);
! 1327: return(NULL);
! 1328: }
! 1329: for (i = 0;i < 499;i++) {
! 1330: upper[i] = toupper(name[i]);
! 1331: if (upper[i] == 0) break;
! 1332: }
! 1333: upper[i] = 0;
! 1334: up = xmlMemStrdup(upper);
! 1335: if (up == NULL) {
! 1336: xmlEncodingErrMemory("xmlNewCharEncodingHandler : out of memory !\n");
! 1337: return(NULL);
! 1338: }
! 1339:
! 1340: /*
! 1341: * allocate and fill-up an handler block.
! 1342: */
! 1343: handler = (xmlCharEncodingHandlerPtr)
! 1344: xmlMalloc(sizeof(xmlCharEncodingHandler));
! 1345: if (handler == NULL) {
! 1346: xmlFree(up);
! 1347: xmlEncodingErrMemory("xmlNewCharEncodingHandler : out of memory !\n");
! 1348: return(NULL);
! 1349: }
! 1350: memset(handler, 0, sizeof(xmlCharEncodingHandler));
! 1351: handler->input = input;
! 1352: handler->output = output;
! 1353: handler->name = up;
! 1354:
! 1355: #ifdef LIBXML_ICONV_ENABLED
! 1356: handler->iconv_in = NULL;
! 1357: handler->iconv_out = NULL;
! 1358: #endif
! 1359: #ifdef LIBXML_ICU_ENABLED
! 1360: handler->uconv_in = NULL;
! 1361: handler->uconv_out = NULL;
! 1362: #endif
! 1363:
! 1364: /*
! 1365: * registers and returns the handler.
! 1366: */
! 1367: xmlRegisterCharEncodingHandler(handler);
! 1368: #ifdef DEBUG_ENCODING
! 1369: xmlGenericError(xmlGenericErrorContext,
! 1370: "Registered encoding handler for %s\n", name);
! 1371: #endif
! 1372: return(handler);
! 1373: }
! 1374:
! 1375: /**
! 1376: * xmlInitCharEncodingHandlers:
! 1377: *
! 1378: * Initialize the char encoding support, it registers the default
! 1379: * encoding supported.
! 1380: * NOTE: while public, this function usually doesn't need to be called
! 1381: * in normal processing.
! 1382: */
! 1383: void
! 1384: xmlInitCharEncodingHandlers(void) {
! 1385: unsigned short int tst = 0x1234;
! 1386: unsigned char *ptr = (unsigned char *) &tst;
! 1387:
! 1388: if (handlers != NULL) return;
! 1389:
! 1390: handlers = (xmlCharEncodingHandlerPtr *)
! 1391: xmlMalloc(MAX_ENCODING_HANDLERS * sizeof(xmlCharEncodingHandlerPtr));
! 1392:
! 1393: if (*ptr == 0x12) xmlLittleEndian = 0;
! 1394: else if (*ptr == 0x34) xmlLittleEndian = 1;
! 1395: else {
! 1396: xmlEncodingErr(XML_ERR_INTERNAL_ERROR,
! 1397: "Odd problem at endianness detection\n", NULL);
! 1398: }
! 1399:
! 1400: if (handlers == NULL) {
! 1401: xmlEncodingErrMemory("xmlInitCharEncodingHandlers : out of memory !\n");
! 1402: return;
! 1403: }
! 1404: xmlNewCharEncodingHandler("UTF-8", UTF8ToUTF8, UTF8ToUTF8);
! 1405: #ifdef LIBXML_OUTPUT_ENABLED
! 1406: xmlUTF16LEHandler =
! 1407: xmlNewCharEncodingHandler("UTF-16LE", UTF16LEToUTF8, UTF8ToUTF16LE);
! 1408: xmlUTF16BEHandler =
! 1409: xmlNewCharEncodingHandler("UTF-16BE", UTF16BEToUTF8, UTF8ToUTF16BE);
! 1410: xmlNewCharEncodingHandler("UTF-16", UTF16LEToUTF8, UTF8ToUTF16);
! 1411: xmlNewCharEncodingHandler("ISO-8859-1", isolat1ToUTF8, UTF8Toisolat1);
! 1412: xmlNewCharEncodingHandler("ASCII", asciiToUTF8, UTF8Toascii);
! 1413: xmlNewCharEncodingHandler("US-ASCII", asciiToUTF8, UTF8Toascii);
! 1414: #ifdef LIBXML_HTML_ENABLED
! 1415: xmlNewCharEncodingHandler("HTML", NULL, UTF8ToHtml);
! 1416: #endif
! 1417: #else
! 1418: xmlUTF16LEHandler =
! 1419: xmlNewCharEncodingHandler("UTF-16LE", UTF16LEToUTF8, NULL);
! 1420: xmlUTF16BEHandler =
! 1421: xmlNewCharEncodingHandler("UTF-16BE", UTF16BEToUTF8, NULL);
! 1422: xmlNewCharEncodingHandler("UTF-16", UTF16LEToUTF8, NULL);
! 1423: xmlNewCharEncodingHandler("ISO-8859-1", isolat1ToUTF8, NULL);
! 1424: xmlNewCharEncodingHandler("ASCII", asciiToUTF8, NULL);
! 1425: xmlNewCharEncodingHandler("US-ASCII", asciiToUTF8, NULL);
! 1426: #endif /* LIBXML_OUTPUT_ENABLED */
! 1427: #if !defined(LIBXML_ICONV_ENABLED) && !defined(LIBXML_ICU_ENABLED)
! 1428: #ifdef LIBXML_ISO8859X_ENABLED
! 1429: xmlRegisterCharEncodingHandlersISO8859x ();
! 1430: #endif
! 1431: #endif
! 1432:
! 1433: }
! 1434:
! 1435: /**
! 1436: * xmlCleanupCharEncodingHandlers:
! 1437: *
! 1438: * Cleanup the memory allocated for the char encoding support, it
! 1439: * unregisters all the encoding handlers and the aliases.
! 1440: */
! 1441: void
! 1442: xmlCleanupCharEncodingHandlers(void) {
! 1443: xmlCleanupEncodingAliases();
! 1444:
! 1445: if (handlers == NULL) return;
! 1446:
! 1447: for (;nbCharEncodingHandler > 0;) {
! 1448: nbCharEncodingHandler--;
! 1449: if (handlers[nbCharEncodingHandler] != NULL) {
! 1450: if (handlers[nbCharEncodingHandler]->name != NULL)
! 1451: xmlFree(handlers[nbCharEncodingHandler]->name);
! 1452: xmlFree(handlers[nbCharEncodingHandler]);
! 1453: }
! 1454: }
! 1455: xmlFree(handlers);
! 1456: handlers = NULL;
! 1457: nbCharEncodingHandler = 0;
! 1458: xmlDefaultCharEncodingHandler = NULL;
! 1459: }
! 1460:
! 1461: /**
! 1462: * xmlRegisterCharEncodingHandler:
! 1463: * @handler: the xmlCharEncodingHandlerPtr handler block
! 1464: *
! 1465: * Register the char encoding handler, surprising, isn't it ?
! 1466: */
! 1467: void
! 1468: xmlRegisterCharEncodingHandler(xmlCharEncodingHandlerPtr handler) {
! 1469: if (handlers == NULL) xmlInitCharEncodingHandlers();
! 1470: if ((handler == NULL) || (handlers == NULL)) {
! 1471: xmlEncodingErr(XML_I18N_NO_HANDLER,
! 1472: "xmlRegisterCharEncodingHandler: NULL handler !\n", NULL);
! 1473: return;
! 1474: }
! 1475:
! 1476: if (nbCharEncodingHandler >= MAX_ENCODING_HANDLERS) {
! 1477: xmlEncodingErr(XML_I18N_EXCESS_HANDLER,
! 1478: "xmlRegisterCharEncodingHandler: Too many handler registered, see %s\n",
! 1479: "MAX_ENCODING_HANDLERS");
! 1480: return;
! 1481: }
! 1482: handlers[nbCharEncodingHandler++] = handler;
! 1483: }
! 1484:
! 1485: /**
! 1486: * xmlGetCharEncodingHandler:
! 1487: * @enc: an xmlCharEncoding value.
! 1488: *
! 1489: * Search in the registered set the handler able to read/write that encoding.
! 1490: *
! 1491: * Returns the handler or NULL if not found
! 1492: */
! 1493: xmlCharEncodingHandlerPtr
! 1494: xmlGetCharEncodingHandler(xmlCharEncoding enc) {
! 1495: xmlCharEncodingHandlerPtr handler;
! 1496:
! 1497: if (handlers == NULL) xmlInitCharEncodingHandlers();
! 1498: switch (enc) {
! 1499: case XML_CHAR_ENCODING_ERROR:
! 1500: return(NULL);
! 1501: case XML_CHAR_ENCODING_NONE:
! 1502: return(NULL);
! 1503: case XML_CHAR_ENCODING_UTF8:
! 1504: return(NULL);
! 1505: case XML_CHAR_ENCODING_UTF16LE:
! 1506: return(xmlUTF16LEHandler);
! 1507: case XML_CHAR_ENCODING_UTF16BE:
! 1508: return(xmlUTF16BEHandler);
! 1509: case XML_CHAR_ENCODING_EBCDIC:
! 1510: handler = xmlFindCharEncodingHandler("EBCDIC");
! 1511: if (handler != NULL) return(handler);
! 1512: handler = xmlFindCharEncodingHandler("ebcdic");
! 1513: if (handler != NULL) return(handler);
! 1514: handler = xmlFindCharEncodingHandler("EBCDIC-US");
! 1515: if (handler != NULL) return(handler);
! 1516: break;
! 1517: case XML_CHAR_ENCODING_UCS4BE:
! 1518: handler = xmlFindCharEncodingHandler("ISO-10646-UCS-4");
! 1519: if (handler != NULL) return(handler);
! 1520: handler = xmlFindCharEncodingHandler("UCS-4");
! 1521: if (handler != NULL) return(handler);
! 1522: handler = xmlFindCharEncodingHandler("UCS4");
! 1523: if (handler != NULL) return(handler);
! 1524: break;
! 1525: case XML_CHAR_ENCODING_UCS4LE:
! 1526: handler = xmlFindCharEncodingHandler("ISO-10646-UCS-4");
! 1527: if (handler != NULL) return(handler);
! 1528: handler = xmlFindCharEncodingHandler("UCS-4");
! 1529: if (handler != NULL) return(handler);
! 1530: handler = xmlFindCharEncodingHandler("UCS4");
! 1531: if (handler != NULL) return(handler);
! 1532: break;
! 1533: case XML_CHAR_ENCODING_UCS4_2143:
! 1534: break;
! 1535: case XML_CHAR_ENCODING_UCS4_3412:
! 1536: break;
! 1537: case XML_CHAR_ENCODING_UCS2:
! 1538: handler = xmlFindCharEncodingHandler("ISO-10646-UCS-2");
! 1539: if (handler != NULL) return(handler);
! 1540: handler = xmlFindCharEncodingHandler("UCS-2");
! 1541: if (handler != NULL) return(handler);
! 1542: handler = xmlFindCharEncodingHandler("UCS2");
! 1543: if (handler != NULL) return(handler);
! 1544: break;
! 1545:
! 1546: /*
! 1547: * We used to keep ISO Latin encodings native in the
! 1548: * generated data. This led to so many problems that
! 1549: * this has been removed. One can still change this
! 1550: * back by registering no-ops encoders for those
! 1551: */
! 1552: case XML_CHAR_ENCODING_8859_1:
! 1553: handler = xmlFindCharEncodingHandler("ISO-8859-1");
! 1554: if (handler != NULL) return(handler);
! 1555: break;
! 1556: case XML_CHAR_ENCODING_8859_2:
! 1557: handler = xmlFindCharEncodingHandler("ISO-8859-2");
! 1558: if (handler != NULL) return(handler);
! 1559: break;
! 1560: case XML_CHAR_ENCODING_8859_3:
! 1561: handler = xmlFindCharEncodingHandler("ISO-8859-3");
! 1562: if (handler != NULL) return(handler);
! 1563: break;
! 1564: case XML_CHAR_ENCODING_8859_4:
! 1565: handler = xmlFindCharEncodingHandler("ISO-8859-4");
! 1566: if (handler != NULL) return(handler);
! 1567: break;
! 1568: case XML_CHAR_ENCODING_8859_5:
! 1569: handler = xmlFindCharEncodingHandler("ISO-8859-5");
! 1570: if (handler != NULL) return(handler);
! 1571: break;
! 1572: case XML_CHAR_ENCODING_8859_6:
! 1573: handler = xmlFindCharEncodingHandler("ISO-8859-6");
! 1574: if (handler != NULL) return(handler);
! 1575: break;
! 1576: case XML_CHAR_ENCODING_8859_7:
! 1577: handler = xmlFindCharEncodingHandler("ISO-8859-7");
! 1578: if (handler != NULL) return(handler);
! 1579: break;
! 1580: case XML_CHAR_ENCODING_8859_8:
! 1581: handler = xmlFindCharEncodingHandler("ISO-8859-8");
! 1582: if (handler != NULL) return(handler);
! 1583: break;
! 1584: case XML_CHAR_ENCODING_8859_9:
! 1585: handler = xmlFindCharEncodingHandler("ISO-8859-9");
! 1586: if (handler != NULL) return(handler);
! 1587: break;
! 1588:
! 1589:
! 1590: case XML_CHAR_ENCODING_2022_JP:
! 1591: handler = xmlFindCharEncodingHandler("ISO-2022-JP");
! 1592: if (handler != NULL) return(handler);
! 1593: break;
! 1594: case XML_CHAR_ENCODING_SHIFT_JIS:
! 1595: handler = xmlFindCharEncodingHandler("SHIFT-JIS");
! 1596: if (handler != NULL) return(handler);
! 1597: handler = xmlFindCharEncodingHandler("SHIFT_JIS");
! 1598: if (handler != NULL) return(handler);
! 1599: handler = xmlFindCharEncodingHandler("Shift_JIS");
! 1600: if (handler != NULL) return(handler);
! 1601: break;
! 1602: case XML_CHAR_ENCODING_EUC_JP:
! 1603: handler = xmlFindCharEncodingHandler("EUC-JP");
! 1604: if (handler != NULL) return(handler);
! 1605: break;
! 1606: default:
! 1607: break;
! 1608: }
! 1609:
! 1610: #ifdef DEBUG_ENCODING
! 1611: xmlGenericError(xmlGenericErrorContext,
! 1612: "No handler found for encoding %d\n", enc);
! 1613: #endif
! 1614: return(NULL);
! 1615: }
! 1616:
! 1617: /**
! 1618: * xmlFindCharEncodingHandler:
! 1619: * @name: a string describing the char encoding.
! 1620: *
! 1621: * Search in the registered set the handler able to read/write that encoding.
! 1622: *
! 1623: * Returns the handler or NULL if not found
! 1624: */
! 1625: xmlCharEncodingHandlerPtr
! 1626: xmlFindCharEncodingHandler(const char *name) {
! 1627: const char *nalias;
! 1628: const char *norig;
! 1629: xmlCharEncoding alias;
! 1630: #ifdef LIBXML_ICONV_ENABLED
! 1631: xmlCharEncodingHandlerPtr enc;
! 1632: iconv_t icv_in, icv_out;
! 1633: #endif /* LIBXML_ICONV_ENABLED */
! 1634: #ifdef LIBXML_ICU_ENABLED
! 1635: xmlCharEncodingHandlerPtr encu;
! 1636: uconv_t *ucv_in, *ucv_out;
! 1637: #endif /* LIBXML_ICU_ENABLED */
! 1638: char upper[100];
! 1639: int i;
! 1640:
! 1641: if (handlers == NULL) xmlInitCharEncodingHandlers();
! 1642: if (name == NULL) return(xmlDefaultCharEncodingHandler);
! 1643: if (name[0] == 0) return(xmlDefaultCharEncodingHandler);
! 1644:
! 1645: /*
! 1646: * Do the alias resolution
! 1647: */
! 1648: norig = name;
! 1649: nalias = xmlGetEncodingAlias(name);
! 1650: if (nalias != NULL)
! 1651: name = nalias;
! 1652:
! 1653: /*
! 1654: * Check first for directly registered encoding names
! 1655: */
! 1656: for (i = 0;i < 99;i++) {
! 1657: upper[i] = toupper(name[i]);
! 1658: if (upper[i] == 0) break;
! 1659: }
! 1660: upper[i] = 0;
! 1661:
! 1662: if (handlers != NULL) {
! 1663: for (i = 0;i < nbCharEncodingHandler; i++) {
! 1664: if (!strcmp(upper, handlers[i]->name)) {
! 1665: #ifdef DEBUG_ENCODING
! 1666: xmlGenericError(xmlGenericErrorContext,
! 1667: "Found registered handler for encoding %s\n", name);
! 1668: #endif
! 1669: return(handlers[i]);
! 1670: }
! 1671: }
! 1672: }
! 1673:
! 1674: #ifdef LIBXML_ICONV_ENABLED
! 1675: /* check whether iconv can handle this */
! 1676: icv_in = iconv_open("UTF-8", name);
! 1677: icv_out = iconv_open(name, "UTF-8");
! 1678: if (icv_in == (iconv_t) -1) {
! 1679: icv_in = iconv_open("UTF-8", upper);
! 1680: }
! 1681: if (icv_out == (iconv_t) -1) {
! 1682: icv_out = iconv_open(upper, "UTF-8");
! 1683: }
! 1684: if ((icv_in != (iconv_t) -1) && (icv_out != (iconv_t) -1)) {
! 1685: enc = (xmlCharEncodingHandlerPtr)
! 1686: xmlMalloc(sizeof(xmlCharEncodingHandler));
! 1687: if (enc == NULL) {
! 1688: iconv_close(icv_in);
! 1689: iconv_close(icv_out);
! 1690: return(NULL);
! 1691: }
! 1692: memset(enc, 0, sizeof(xmlCharEncodingHandler));
! 1693: enc->name = xmlMemStrdup(name);
! 1694: enc->input = NULL;
! 1695: enc->output = NULL;
! 1696: enc->iconv_in = icv_in;
! 1697: enc->iconv_out = icv_out;
! 1698: #ifdef DEBUG_ENCODING
! 1699: xmlGenericError(xmlGenericErrorContext,
! 1700: "Found iconv handler for encoding %s\n", name);
! 1701: #endif
! 1702: return enc;
! 1703: } else if ((icv_in != (iconv_t) -1) || icv_out != (iconv_t) -1) {
! 1704: xmlEncodingErr(XML_ERR_INTERNAL_ERROR,
! 1705: "iconv : problems with filters for '%s'\n", name);
! 1706: }
! 1707: #endif /* LIBXML_ICONV_ENABLED */
! 1708: #ifdef LIBXML_ICU_ENABLED
! 1709: /* check whether icu can handle this */
! 1710: ucv_in = openIcuConverter(name, 1);
! 1711: ucv_out = openIcuConverter(name, 0);
! 1712: if (ucv_in != NULL && ucv_out != NULL) {
! 1713: encu = (xmlCharEncodingHandlerPtr)
! 1714: xmlMalloc(sizeof(xmlCharEncodingHandler));
! 1715: if (encu == NULL) {
! 1716: closeIcuConverter(ucv_in);
! 1717: closeIcuConverter(ucv_out);
! 1718: return(NULL);
! 1719: }
! 1720: memset(encu, 0, sizeof(xmlCharEncodingHandler));
! 1721: encu->name = xmlMemStrdup(name);
! 1722: encu->input = NULL;
! 1723: encu->output = NULL;
! 1724: encu->uconv_in = ucv_in;
! 1725: encu->uconv_out = ucv_out;
! 1726: #ifdef DEBUG_ENCODING
! 1727: xmlGenericError(xmlGenericErrorContext,
! 1728: "Found ICU converter handler for encoding %s\n", name);
! 1729: #endif
! 1730: return encu;
! 1731: } else if (ucv_in != NULL || ucv_out != NULL) {
! 1732: closeIcuConverter(ucv_in);
! 1733: closeIcuConverter(ucv_out);
! 1734: xmlEncodingErr(XML_ERR_INTERNAL_ERROR,
! 1735: "ICU converter : problems with filters for '%s'\n", name);
! 1736: }
! 1737: #endif /* LIBXML_ICU_ENABLED */
! 1738:
! 1739: #ifdef DEBUG_ENCODING
! 1740: xmlGenericError(xmlGenericErrorContext,
! 1741: "No handler found for encoding %s\n", name);
! 1742: #endif
! 1743:
! 1744: /*
! 1745: * Fallback using the canonical names
! 1746: */
! 1747: alias = xmlParseCharEncoding(norig);
! 1748: if (alias != XML_CHAR_ENCODING_ERROR) {
! 1749: const char* canon;
! 1750: canon = xmlGetCharEncodingName(alias);
! 1751: if ((canon != NULL) && (strcmp(name, canon))) {
! 1752: return(xmlFindCharEncodingHandler(canon));
! 1753: }
! 1754: }
! 1755:
! 1756: /* If "none of the above", give up */
! 1757: return(NULL);
! 1758: }
! 1759:
! 1760: /************************************************************************
! 1761: * *
! 1762: * ICONV based generic conversion functions *
! 1763: * *
! 1764: ************************************************************************/
! 1765:
! 1766: #ifdef LIBXML_ICONV_ENABLED
! 1767: /**
! 1768: * xmlIconvWrapper:
! 1769: * @cd: iconv converter data structure
! 1770: * @out: a pointer to an array of bytes to store the result
! 1771: * @outlen: the length of @out
! 1772: * @in: a pointer to an array of ISO Latin 1 chars
! 1773: * @inlen: the length of @in
! 1774: *
! 1775: * Returns 0 if success, or
! 1776: * -1 by lack of space, or
! 1777: * -2 if the transcoding fails (for *in is not valid utf8 string or
! 1778: * the result of transformation can't fit into the encoding we want), or
! 1779: * -3 if there the last byte can't form a single output char.
! 1780: *
! 1781: * The value of @inlen after return is the number of octets consumed
! 1782: * as the return value is positive, else unpredictable.
! 1783: * The value of @outlen after return is the number of ocetes consumed.
! 1784: */
! 1785: static int
! 1786: xmlIconvWrapper(iconv_t cd, unsigned char *out, int *outlen,
! 1787: const unsigned char *in, int *inlen) {
! 1788: size_t icv_inlen, icv_outlen;
! 1789: const char *icv_in = (const char *) in;
! 1790: char *icv_out = (char *) out;
! 1791: int ret;
! 1792:
! 1793: if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) {
! 1794: if (outlen != NULL) *outlen = 0;
! 1795: return(-1);
! 1796: }
! 1797: icv_inlen = *inlen;
! 1798: icv_outlen = *outlen;
! 1799: ret = iconv(cd, (ICONV_CONST char **) &icv_in, &icv_inlen, &icv_out, &icv_outlen);
! 1800: *inlen -= icv_inlen;
! 1801: *outlen -= icv_outlen;
! 1802: if ((icv_inlen != 0) || (ret == -1)) {
! 1803: #ifdef EILSEQ
! 1804: if (errno == EILSEQ) {
! 1805: return -2;
! 1806: } else
! 1807: #endif
! 1808: #ifdef E2BIG
! 1809: if (errno == E2BIG) {
! 1810: return -1;
! 1811: } else
! 1812: #endif
! 1813: #ifdef EINVAL
! 1814: if (errno == EINVAL) {
! 1815: return -3;
! 1816: } else
! 1817: #endif
! 1818: {
! 1819: return -3;
! 1820: }
! 1821: }
! 1822: return 0;
! 1823: }
! 1824: #endif /* LIBXML_ICONV_ENABLED */
! 1825:
! 1826: /************************************************************************
! 1827: * *
! 1828: * ICU based generic conversion functions *
! 1829: * *
! 1830: ************************************************************************/
! 1831:
! 1832: #ifdef LIBXML_ICU_ENABLED
! 1833: /**
! 1834: * xmlUconvWrapper:
! 1835: * @cd: ICU uconverter data structure
! 1836: * @toUnicode : non-zero if toUnicode. 0 otherwise.
! 1837: * @out: a pointer to an array of bytes to store the result
! 1838: * @outlen: the length of @out
! 1839: * @in: a pointer to an array of ISO Latin 1 chars
! 1840: * @inlen: the length of @in
! 1841: *
! 1842: * Returns 0 if success, or
! 1843: * -1 by lack of space, or
! 1844: * -2 if the transcoding fails (for *in is not valid utf8 string or
! 1845: * the result of transformation can't fit into the encoding we want), or
! 1846: * -3 if there the last byte can't form a single output char.
! 1847: *
! 1848: * The value of @inlen after return is the number of octets consumed
! 1849: * as the return value is positive, else unpredictable.
! 1850: * The value of @outlen after return is the number of ocetes consumed.
! 1851: */
! 1852: static int
! 1853: xmlUconvWrapper(uconv_t *cd, int toUnicode, unsigned char *out, int *outlen,
! 1854: const unsigned char *in, int *inlen) {
! 1855: const char *ucv_in = (const char *) in;
! 1856: char *ucv_out = (char *) out;
! 1857: UErrorCode err = U_ZERO_ERROR;
! 1858:
! 1859: if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) {
! 1860: if (outlen != NULL) *outlen = 0;
! 1861: return(-1);
! 1862: }
! 1863:
! 1864: /*
! 1865: * TODO(jungshik)
! 1866: * 1. is ucnv_convert(To|From)Algorithmic better?
! 1867: * 2. had we better use an explicit pivot buffer?
! 1868: * 3. error returned comes from 'fromUnicode' only even
! 1869: * when toUnicode is true !
! 1870: */
! 1871: if (toUnicode) {
! 1872: /* encoding => UTF-16 => UTF-8 */
! 1873: ucnv_convertEx(cd->utf8, cd->uconv, &ucv_out, ucv_out + *outlen,
! 1874: &ucv_in, ucv_in + *inlen, NULL, NULL, NULL, NULL,
! 1875: 0, TRUE, &err);
! 1876: } else {
! 1877: /* UTF-8 => UTF-16 => encoding */
! 1878: ucnv_convertEx(cd->uconv, cd->utf8, &ucv_out, ucv_out + *outlen,
! 1879: &ucv_in, ucv_in + *inlen, NULL, NULL, NULL, NULL,
! 1880: 0, TRUE, &err);
! 1881: }
! 1882: *inlen = ucv_in - (const char*) in;
! 1883: *outlen = ucv_out - (char *) out;
! 1884: if (U_SUCCESS(err))
! 1885: return 0;
! 1886: if (err == U_BUFFER_OVERFLOW_ERROR)
! 1887: return -1;
! 1888: if (err == U_INVALID_CHAR_FOUND || err == U_ILLEGAL_CHAR_FOUND)
! 1889: return -2;
! 1890: /* if (err == U_TRUNCATED_CHAR_FOUND) */
! 1891: return -3;
! 1892: }
! 1893: #endif /* LIBXML_ICU_ENABLED */
! 1894:
! 1895: /************************************************************************
! 1896: * *
! 1897: * The real API used by libxml for on-the-fly conversion *
! 1898: * *
! 1899: ************************************************************************/
! 1900: int
! 1901: xmlCharEncFirstLineInt(xmlCharEncodingHandler *handler, xmlBufferPtr out,
! 1902: xmlBufferPtr in, int len);
! 1903:
! 1904: /**
! 1905: * xmlCharEncFirstLineInt:
! 1906: * @handler: char enconding transformation data structure
! 1907: * @out: an xmlBuffer for the output.
! 1908: * @in: an xmlBuffer for the input
! 1909: * @len: number of bytes to convert for the first line, or -1
! 1910: *
! 1911: * Front-end for the encoding handler input function, but handle only
! 1912: * the very first line, i.e. limit itself to 45 chars.
! 1913: *
! 1914: * Returns the number of byte written if success, or
! 1915: * -1 general error
! 1916: * -2 if the transcoding fails (for *in is not valid utf8 string or
! 1917: * the result of transformation can't fit into the encoding we want), or
! 1918: */
! 1919: int
! 1920: xmlCharEncFirstLineInt(xmlCharEncodingHandler *handler, xmlBufferPtr out,
! 1921: xmlBufferPtr in, int len) {
! 1922: int ret = -2;
! 1923: int written;
! 1924: int toconv;
! 1925:
! 1926: if (handler == NULL) return(-1);
! 1927: if (out == NULL) return(-1);
! 1928: if (in == NULL) return(-1);
! 1929:
! 1930: /* calculate space available */
! 1931: written = out->size - out->use;
! 1932: toconv = in->use;
! 1933: /*
! 1934: * echo '<?xml version="1.0" encoding="UCS4"?>' | wc -c => 38
! 1935: * 45 chars should be sufficient to reach the end of the encoding
! 1936: * declaration without going too far inside the document content.
! 1937: * on UTF-16 this means 90bytes, on UCS4 this means 180
! 1938: * The actual value depending on guessed encoding is passed as @len
! 1939: * if provided
! 1940: */
! 1941: if (len >= 0) {
! 1942: if (toconv > len)
! 1943: toconv = len;
! 1944: } else {
! 1945: if (toconv > 180)
! 1946: toconv = 180;
! 1947: }
! 1948: if (toconv * 2 >= written) {
! 1949: xmlBufferGrow(out, toconv);
! 1950: written = out->size - out->use - 1;
! 1951: }
! 1952:
! 1953: if (handler->input != NULL) {
! 1954: ret = handler->input(&out->content[out->use], &written,
! 1955: in->content, &toconv);
! 1956: xmlBufferShrink(in, toconv);
! 1957: out->use += written;
! 1958: out->content[out->use] = 0;
! 1959: }
! 1960: #ifdef LIBXML_ICONV_ENABLED
! 1961: else if (handler->iconv_in != NULL) {
! 1962: ret = xmlIconvWrapper(handler->iconv_in, &out->content[out->use],
! 1963: &written, in->content, &toconv);
! 1964: xmlBufferShrink(in, toconv);
! 1965: out->use += written;
! 1966: out->content[out->use] = 0;
! 1967: if (ret == -1) ret = -3;
! 1968: }
! 1969: #endif /* LIBXML_ICONV_ENABLED */
! 1970: #ifdef LIBXML_ICU_ENABLED
! 1971: else if (handler->uconv_in != NULL) {
! 1972: ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use],
! 1973: &written, in->content, &toconv);
! 1974: xmlBufferShrink(in, toconv);
! 1975: out->use += written;
! 1976: out->content[out->use] = 0;
! 1977: if (ret == -1) ret = -3;
! 1978: }
! 1979: #endif /* LIBXML_ICU_ENABLED */
! 1980: #ifdef DEBUG_ENCODING
! 1981: switch (ret) {
! 1982: case 0:
! 1983: xmlGenericError(xmlGenericErrorContext,
! 1984: "converted %d bytes to %d bytes of input\n",
! 1985: toconv, written);
! 1986: break;
! 1987: case -1:
! 1988: xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of input, %d left\n",
! 1989: toconv, written, in->use);
! 1990: break;
! 1991: case -2:
! 1992: xmlGenericError(xmlGenericErrorContext,
! 1993: "input conversion failed due to input error\n");
! 1994: break;
! 1995: case -3:
! 1996: xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of input, %d left\n",
! 1997: toconv, written, in->use);
! 1998: break;
! 1999: default:
! 2000: xmlGenericError(xmlGenericErrorContext,"Unknown input conversion failed %d\n", ret);
! 2001: }
! 2002: #endif /* DEBUG_ENCODING */
! 2003: /*
! 2004: * Ignore when input buffer is not on a boundary
! 2005: */
! 2006: if (ret == -3) ret = 0;
! 2007: if (ret == -1) ret = 0;
! 2008: return(ret);
! 2009: }
! 2010:
! 2011: /**
! 2012: * xmlCharEncFirstLine:
! 2013: * @handler: char enconding transformation data structure
! 2014: * @out: an xmlBuffer for the output.
! 2015: * @in: an xmlBuffer for the input
! 2016: *
! 2017: * Front-end for the encoding handler input function, but handle only
! 2018: * the very first line, i.e. limit itself to 45 chars.
! 2019: *
! 2020: * Returns the number of byte written if success, or
! 2021: * -1 general error
! 2022: * -2 if the transcoding fails (for *in is not valid utf8 string or
! 2023: * the result of transformation can't fit into the encoding we want), or
! 2024: */
! 2025: int
! 2026: xmlCharEncFirstLine(xmlCharEncodingHandler *handler, xmlBufferPtr out,
! 2027: xmlBufferPtr in) {
! 2028: return(xmlCharEncFirstLineInt(handler, out, in, -1));
! 2029: }
! 2030:
! 2031: /**
! 2032: * xmlCharEncInFunc:
! 2033: * @handler: char encoding transformation data structure
! 2034: * @out: an xmlBuffer for the output.
! 2035: * @in: an xmlBuffer for the input
! 2036: *
! 2037: * Generic front-end for the encoding handler input function
! 2038: *
! 2039: * Returns the number of byte written if success, or
! 2040: * -1 general error
! 2041: * -2 if the transcoding fails (for *in is not valid utf8 string or
! 2042: * the result of transformation can't fit into the encoding we want), or
! 2043: */
! 2044: int
! 2045: xmlCharEncInFunc(xmlCharEncodingHandler * handler, xmlBufferPtr out,
! 2046: xmlBufferPtr in)
! 2047: {
! 2048: int ret = -2;
! 2049: int written;
! 2050: int toconv;
! 2051:
! 2052: if (handler == NULL)
! 2053: return (-1);
! 2054: if (out == NULL)
! 2055: return (-1);
! 2056: if (in == NULL)
! 2057: return (-1);
! 2058:
! 2059: toconv = in->use;
! 2060: if (toconv == 0)
! 2061: return (0);
! 2062: written = out->size - out->use;
! 2063: if (toconv * 2 >= written) {
! 2064: xmlBufferGrow(out, out->size + toconv * 2);
! 2065: written = out->size - out->use - 1;
! 2066: }
! 2067: if (handler->input != NULL) {
! 2068: ret = handler->input(&out->content[out->use], &written,
! 2069: in->content, &toconv);
! 2070: xmlBufferShrink(in, toconv);
! 2071: out->use += written;
! 2072: out->content[out->use] = 0;
! 2073: }
! 2074: #ifdef LIBXML_ICONV_ENABLED
! 2075: else if (handler->iconv_in != NULL) {
! 2076: ret = xmlIconvWrapper(handler->iconv_in, &out->content[out->use],
! 2077: &written, in->content, &toconv);
! 2078: xmlBufferShrink(in, toconv);
! 2079: out->use += written;
! 2080: out->content[out->use] = 0;
! 2081: if (ret == -1)
! 2082: ret = -3;
! 2083: }
! 2084: #endif /* LIBXML_ICONV_ENABLED */
! 2085: #ifdef LIBXML_ICU_ENABLED
! 2086: else if (handler->uconv_in != NULL) {
! 2087: ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use],
! 2088: &written, in->content, &toconv);
! 2089: xmlBufferShrink(in, toconv);
! 2090: out->use += written;
! 2091: out->content[out->use] = 0;
! 2092: if (ret == -1)
! 2093: ret = -3;
! 2094: }
! 2095: #endif /* LIBXML_ICU_ENABLED */
! 2096: switch (ret) {
! 2097: case 0:
! 2098: #ifdef DEBUG_ENCODING
! 2099: xmlGenericError(xmlGenericErrorContext,
! 2100: "converted %d bytes to %d bytes of input\n",
! 2101: toconv, written);
! 2102: #endif
! 2103: break;
! 2104: case -1:
! 2105: #ifdef DEBUG_ENCODING
! 2106: xmlGenericError(xmlGenericErrorContext,
! 2107: "converted %d bytes to %d bytes of input, %d left\n",
! 2108: toconv, written, in->use);
! 2109: #endif
! 2110: break;
! 2111: case -3:
! 2112: #ifdef DEBUG_ENCODING
! 2113: xmlGenericError(xmlGenericErrorContext,
! 2114: "converted %d bytes to %d bytes of input, %d left\n",
! 2115: toconv, written, in->use);
! 2116: #endif
! 2117: break;
! 2118: case -2: {
! 2119: char buf[50];
! 2120:
! 2121: snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X",
! 2122: in->content[0], in->content[1],
! 2123: in->content[2], in->content[3]);
! 2124: buf[49] = 0;
! 2125: xmlEncodingErr(XML_I18N_CONV_FAILED,
! 2126: "input conversion failed due to input error, bytes %s\n",
! 2127: buf);
! 2128: }
! 2129: }
! 2130: /*
! 2131: * Ignore when input buffer is not on a boundary
! 2132: */
! 2133: if (ret == -3)
! 2134: ret = 0;
! 2135: return (written? written : ret);
! 2136: }
! 2137:
! 2138: /**
! 2139: * xmlCharEncOutFunc:
! 2140: * @handler: char enconding transformation data structure
! 2141: * @out: an xmlBuffer for the output.
! 2142: * @in: an xmlBuffer for the input
! 2143: *
! 2144: * Generic front-end for the encoding handler output function
! 2145: * a first call with @in == NULL has to be made firs to initiate the
! 2146: * output in case of non-stateless encoding needing to initiate their
! 2147: * state or the output (like the BOM in UTF16).
! 2148: * In case of UTF8 sequence conversion errors for the given encoder,
! 2149: * the content will be automatically remapped to a CharRef sequence.
! 2150: *
! 2151: * Returns the number of byte written if success, or
! 2152: * -1 general error
! 2153: * -2 if the transcoding fails (for *in is not valid utf8 string or
! 2154: * the result of transformation can't fit into the encoding we want), or
! 2155: */
! 2156: int
! 2157: xmlCharEncOutFunc(xmlCharEncodingHandler *handler, xmlBufferPtr out,
! 2158: xmlBufferPtr in) {
! 2159: int ret = -2;
! 2160: int written;
! 2161: int writtentot = 0;
! 2162: int toconv;
! 2163: int output = 0;
! 2164:
! 2165: if (handler == NULL) return(-1);
! 2166: if (out == NULL) return(-1);
! 2167:
! 2168: retry:
! 2169:
! 2170: written = out->size - out->use;
! 2171:
! 2172: if (written > 0)
! 2173: written--; /* Gennady: count '/0' */
! 2174:
! 2175: /*
! 2176: * First specific handling of in = NULL, i.e. the initialization call
! 2177: */
! 2178: if (in == NULL) {
! 2179: toconv = 0;
! 2180: if (handler->output != NULL) {
! 2181: ret = handler->output(&out->content[out->use], &written,
! 2182: NULL, &toconv);
! 2183: if (ret >= 0) { /* Gennady: check return value */
! 2184: out->use += written;
! 2185: out->content[out->use] = 0;
! 2186: }
! 2187: }
! 2188: #ifdef LIBXML_ICONV_ENABLED
! 2189: else if (handler->iconv_out != NULL) {
! 2190: ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use],
! 2191: &written, NULL, &toconv);
! 2192: out->use += written;
! 2193: out->content[out->use] = 0;
! 2194: }
! 2195: #endif /* LIBXML_ICONV_ENABLED */
! 2196: #ifdef LIBXML_ICU_ENABLED
! 2197: else if (handler->uconv_out != NULL) {
! 2198: ret = xmlUconvWrapper(handler->uconv_out, 0,
! 2199: &out->content[out->use],
! 2200: &written, NULL, &toconv);
! 2201: out->use += written;
! 2202: out->content[out->use] = 0;
! 2203: }
! 2204: #endif /* LIBXML_ICU_ENABLED */
! 2205: #ifdef DEBUG_ENCODING
! 2206: xmlGenericError(xmlGenericErrorContext,
! 2207: "initialized encoder\n");
! 2208: #endif
! 2209: return(0);
! 2210: }
! 2211:
! 2212: /*
! 2213: * Conversion itself.
! 2214: */
! 2215: toconv = in->use;
! 2216: if (toconv == 0)
! 2217: return(0);
! 2218: if (toconv * 4 >= written) {
! 2219: xmlBufferGrow(out, toconv * 4);
! 2220: written = out->size - out->use - 1;
! 2221: }
! 2222: if (handler->output != NULL) {
! 2223: ret = handler->output(&out->content[out->use], &written,
! 2224: in->content, &toconv);
! 2225: if (written > 0) {
! 2226: xmlBufferShrink(in, toconv);
! 2227: out->use += written;
! 2228: writtentot += written;
! 2229: }
! 2230: out->content[out->use] = 0;
! 2231: }
! 2232: #ifdef LIBXML_ICONV_ENABLED
! 2233: else if (handler->iconv_out != NULL) {
! 2234: ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use],
! 2235: &written, in->content, &toconv);
! 2236: xmlBufferShrink(in, toconv);
! 2237: out->use += written;
! 2238: writtentot += written;
! 2239: out->content[out->use] = 0;
! 2240: if (ret == -1) {
! 2241: if (written > 0) {
! 2242: /*
! 2243: * Can be a limitation of iconv
! 2244: */
! 2245: goto retry;
! 2246: }
! 2247: ret = -3;
! 2248: }
! 2249: }
! 2250: #endif /* LIBXML_ICONV_ENABLED */
! 2251: #ifdef LIBXML_ICU_ENABLED
! 2252: else if (handler->uconv_out != NULL) {
! 2253: ret = xmlUconvWrapper(handler->uconv_out, 0,
! 2254: &out->content[out->use],
! 2255: &written, in->content, &toconv);
! 2256: xmlBufferShrink(in, toconv);
! 2257: out->use += written;
! 2258: writtentot += written;
! 2259: out->content[out->use] = 0;
! 2260: if (ret == -1) {
! 2261: if (written > 0) {
! 2262: /*
! 2263: * Can be a limitation of iconv
! 2264: */
! 2265: goto retry;
! 2266: }
! 2267: ret = -3;
! 2268: }
! 2269: }
! 2270: #endif /* LIBXML_ICU_ENABLED */
! 2271: else {
! 2272: xmlEncodingErr(XML_I18N_NO_OUTPUT,
! 2273: "xmlCharEncOutFunc: no output function !\n", NULL);
! 2274: return(-1);
! 2275: }
! 2276:
! 2277: if (ret >= 0) output += ret;
! 2278:
! 2279: /*
! 2280: * Attempt to handle error cases
! 2281: */
! 2282: switch (ret) {
! 2283: case 0:
! 2284: #ifdef DEBUG_ENCODING
! 2285: xmlGenericError(xmlGenericErrorContext,
! 2286: "converted %d bytes to %d bytes of output\n",
! 2287: toconv, written);
! 2288: #endif
! 2289: break;
! 2290: case -1:
! 2291: #ifdef DEBUG_ENCODING
! 2292: xmlGenericError(xmlGenericErrorContext,
! 2293: "output conversion failed by lack of space\n");
! 2294: #endif
! 2295: break;
! 2296: case -3:
! 2297: #ifdef DEBUG_ENCODING
! 2298: xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of output %d left\n",
! 2299: toconv, written, in->use);
! 2300: #endif
! 2301: break;
! 2302: case -2: {
! 2303: int len = in->use;
! 2304: const xmlChar *utf = (const xmlChar *) in->content;
! 2305: int cur;
! 2306:
! 2307: cur = xmlGetUTF8Char(utf, &len);
! 2308: if (cur > 0) {
! 2309: xmlChar charref[20];
! 2310:
! 2311: #ifdef DEBUG_ENCODING
! 2312: xmlGenericError(xmlGenericErrorContext,
! 2313: "handling output conversion error\n");
! 2314: xmlGenericError(xmlGenericErrorContext,
! 2315: "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n",
! 2316: in->content[0], in->content[1],
! 2317: in->content[2], in->content[3]);
! 2318: #endif
! 2319: /*
! 2320: * Removes the UTF8 sequence, and replace it by a charref
! 2321: * and continue the transcoding phase, hoping the error
! 2322: * did not mangle the encoder state.
! 2323: */
! 2324: snprintf((char *) &charref[0], sizeof(charref), "&#%d;", cur);
! 2325: xmlBufferShrink(in, len);
! 2326: xmlBufferAddHead(in, charref, -1);
! 2327:
! 2328: goto retry;
! 2329: } else {
! 2330: char buf[50];
! 2331:
! 2332: snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X",
! 2333: in->content[0], in->content[1],
! 2334: in->content[2], in->content[3]);
! 2335: buf[49] = 0;
! 2336: xmlEncodingErr(XML_I18N_CONV_FAILED,
! 2337: "output conversion failed due to conv error, bytes %s\n",
! 2338: buf);
! 2339: if (in->alloc != XML_BUFFER_ALLOC_IMMUTABLE)
! 2340: in->content[0] = ' ';
! 2341: }
! 2342: break;
! 2343: }
! 2344: }
! 2345: return(ret);
! 2346: }
! 2347:
! 2348: /**
! 2349: * xmlCharEncCloseFunc:
! 2350: * @handler: char enconding transformation data structure
! 2351: *
! 2352: * Generic front-end for encoding handler close function
! 2353: *
! 2354: * Returns 0 if success, or -1 in case of error
! 2355: */
! 2356: int
! 2357: xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) {
! 2358: int ret = 0;
! 2359: int tofree = 0;
! 2360: if (handler == NULL) return(-1);
! 2361: if (handler->name == NULL) return(-1);
! 2362: #ifdef LIBXML_ICONV_ENABLED
! 2363: /*
! 2364: * Iconv handlers can be used only once, free the whole block.
! 2365: * and the associated icon resources.
! 2366: */
! 2367: if ((handler->iconv_out != NULL) || (handler->iconv_in != NULL)) {
! 2368: tofree = 1;
! 2369: if (handler->iconv_out != NULL) {
! 2370: if (iconv_close(handler->iconv_out))
! 2371: ret = -1;
! 2372: handler->iconv_out = NULL;
! 2373: }
! 2374: if (handler->iconv_in != NULL) {
! 2375: if (iconv_close(handler->iconv_in))
! 2376: ret = -1;
! 2377: handler->iconv_in = NULL;
! 2378: }
! 2379: }
! 2380: #endif /* LIBXML_ICONV_ENABLED */
! 2381: #ifdef LIBXML_ICU_ENABLED
! 2382: if ((handler->uconv_out != NULL) || (handler->uconv_in != NULL)) {
! 2383: tofree = 1;
! 2384: if (handler->uconv_out != NULL) {
! 2385: closeIcuConverter(handler->uconv_out);
! 2386: handler->uconv_out = NULL;
! 2387: }
! 2388: if (handler->uconv_in != NULL) {
! 2389: closeIcuConverter(handler->uconv_in);
! 2390: handler->uconv_in = NULL;
! 2391: }
! 2392: }
! 2393: #endif
! 2394: if (tofree) {
! 2395: /* free up only dynamic handlers iconv/uconv */
! 2396: if (handler->name != NULL)
! 2397: xmlFree(handler->name);
! 2398: handler->name = NULL;
! 2399: xmlFree(handler);
! 2400: }
! 2401: #ifdef DEBUG_ENCODING
! 2402: if (ret)
! 2403: xmlGenericError(xmlGenericErrorContext,
! 2404: "failed to close the encoding handler\n");
! 2405: else
! 2406: xmlGenericError(xmlGenericErrorContext,
! 2407: "closed the encoding handler\n");
! 2408: #endif
! 2409:
! 2410: return(ret);
! 2411: }
! 2412:
! 2413: /**
! 2414: * xmlByteConsumed:
! 2415: * @ctxt: an XML parser context
! 2416: *
! 2417: * This function provides the current index of the parser relative
! 2418: * to the start of the current entity. This function is computed in
! 2419: * bytes from the beginning starting at zero and finishing at the
! 2420: * size in byte of the file if parsing a file. The function is
! 2421: * of constant cost if the input is UTF-8 but can be costly if run
! 2422: * on non-UTF-8 input.
! 2423: *
! 2424: * Returns the index in bytes from the beginning of the entity or -1
! 2425: * in case the index could not be computed.
! 2426: */
! 2427: long
! 2428: xmlByteConsumed(xmlParserCtxtPtr ctxt) {
! 2429: xmlParserInputPtr in;
! 2430:
! 2431: if (ctxt == NULL) return(-1);
! 2432: in = ctxt->input;
! 2433: if (in == NULL) return(-1);
! 2434: if ((in->buf != NULL) && (in->buf->encoder != NULL)) {
! 2435: unsigned int unused = 0;
! 2436: xmlCharEncodingHandler * handler = in->buf->encoder;
! 2437: /*
! 2438: * Encoding conversion, compute the number of unused original
! 2439: * bytes from the input not consumed and substract that from
! 2440: * the raw consumed value, this is not a cheap operation
! 2441: */
! 2442: if (in->end - in->cur > 0) {
! 2443: unsigned char convbuf[32000];
! 2444: const unsigned char *cur = (const unsigned char *)in->cur;
! 2445: int toconv = in->end - in->cur, written = 32000;
! 2446:
! 2447: int ret;
! 2448:
! 2449: if (handler->output != NULL) {
! 2450: do {
! 2451: toconv = in->end - cur;
! 2452: written = 32000;
! 2453: ret = handler->output(&convbuf[0], &written,
! 2454: cur, &toconv);
! 2455: if (ret == -1) return(-1);
! 2456: unused += written;
! 2457: cur += toconv;
! 2458: } while (ret == -2);
! 2459: #ifdef LIBXML_ICONV_ENABLED
! 2460: } else if (handler->iconv_out != NULL) {
! 2461: do {
! 2462: toconv = in->end - cur;
! 2463: written = 32000;
! 2464: ret = xmlIconvWrapper(handler->iconv_out, &convbuf[0],
! 2465: &written, cur, &toconv);
! 2466: if (ret < 0) {
! 2467: if (written > 0)
! 2468: ret = -2;
! 2469: else
! 2470: return(-1);
! 2471: }
! 2472: unused += written;
! 2473: cur += toconv;
! 2474: } while (ret == -2);
! 2475: #endif
! 2476: #ifdef LIBXML_ICU_ENABLED
! 2477: } else if (handler->uconv_out != NULL) {
! 2478: do {
! 2479: toconv = in->end - cur;
! 2480: written = 32000;
! 2481: ret = xmlUconvWrapper(handler->uconv_out, 0, &convbuf[0],
! 2482: &written, cur, &toconv);
! 2483: if (ret < 0) {
! 2484: if (written > 0)
! 2485: ret = -2;
! 2486: else
! 2487: return(-1);
! 2488: }
! 2489: unused += written;
! 2490: cur += toconv;
! 2491: } while (ret == -2);
! 2492: #endif
! 2493: } else {
! 2494: /* could not find a converter */
! 2495: return(-1);
! 2496: }
! 2497: }
! 2498: if (in->buf->rawconsumed < unused)
! 2499: return(-1);
! 2500: return(in->buf->rawconsumed - unused);
! 2501: }
! 2502: return(in->consumed + (in->cur - in->base));
! 2503: }
! 2504:
! 2505: #if !defined(LIBXML_ICONV_ENABLED) && !defined(LIBXML_ICU_ENABLED)
! 2506: #ifdef LIBXML_ISO8859X_ENABLED
! 2507:
! 2508: /**
! 2509: * UTF8ToISO8859x:
! 2510: * @out: a pointer to an array of bytes to store the result
! 2511: * @outlen: the length of @out
! 2512: * @in: a pointer to an array of UTF-8 chars
! 2513: * @inlen: the length of @in
! 2514: * @xlattable: the 2-level transcoding table
! 2515: *
! 2516: * Take a block of UTF-8 chars in and try to convert it to an ISO 8859-*
! 2517: * block of chars out.
! 2518: *
! 2519: * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise
! 2520: * The value of @inlen after return is the number of octets consumed
! 2521: * as the return value is positive, else unpredictable.
! 2522: * The value of @outlen after return is the number of ocetes consumed.
! 2523: */
! 2524: static int
! 2525: UTF8ToISO8859x(unsigned char* out, int *outlen,
! 2526: const unsigned char* in, int *inlen,
! 2527: unsigned char const *xlattable) {
! 2528: const unsigned char* outstart = out;
! 2529: const unsigned char* inend;
! 2530: const unsigned char* instart = in;
! 2531: const unsigned char* processed = in;
! 2532:
! 2533: if ((out == NULL) || (outlen == NULL) || (inlen == NULL) ||
! 2534: (xlattable == NULL))
! 2535: return(-1);
! 2536: if (in == NULL) {
! 2537: /*
! 2538: * initialization nothing to do
! 2539: */
! 2540: *outlen = 0;
! 2541: *inlen = 0;
! 2542: return(0);
! 2543: }
! 2544: inend = in + (*inlen);
! 2545: while (in < inend) {
! 2546: unsigned char d = *in++;
! 2547: if (d < 0x80) {
! 2548: *out++ = d;
! 2549: } else if (d < 0xC0) {
! 2550: /* trailing byte in leading position */
! 2551: *outlen = out - outstart;
! 2552: *inlen = processed - instart;
! 2553: return(-2);
! 2554: } else if (d < 0xE0) {
! 2555: unsigned char c;
! 2556: if (!(in < inend)) {
! 2557: /* trailing byte not in input buffer */
! 2558: *outlen = out - outstart;
! 2559: *inlen = processed - instart;
! 2560: return(-3);
! 2561: }
! 2562: c = *in++;
! 2563: if ((c & 0xC0) != 0x80) {
! 2564: /* not a trailing byte */
! 2565: *outlen = out - outstart;
! 2566: *inlen = processed - instart;
! 2567: return(-2);
! 2568: }
! 2569: c = c & 0x3F;
! 2570: d = d & 0x1F;
! 2571: d = xlattable [48 + c + xlattable [d] * 64];
! 2572: if (d == 0) {
! 2573: /* not in character set */
! 2574: *outlen = out - outstart;
! 2575: *inlen = processed - instart;
! 2576: return(-2);
! 2577: }
! 2578: *out++ = d;
! 2579: } else if (d < 0xF0) {
! 2580: unsigned char c1;
! 2581: unsigned char c2;
! 2582: if (!(in < inend - 1)) {
! 2583: /* trailing bytes not in input buffer */
! 2584: *outlen = out - outstart;
! 2585: *inlen = processed - instart;
! 2586: return(-3);
! 2587: }
! 2588: c1 = *in++;
! 2589: if ((c1 & 0xC0) != 0x80) {
! 2590: /* not a trailing byte (c1) */
! 2591: *outlen = out - outstart;
! 2592: *inlen = processed - instart;
! 2593: return(-2);
! 2594: }
! 2595: c2 = *in++;
! 2596: if ((c2 & 0xC0) != 0x80) {
! 2597: /* not a trailing byte (c2) */
! 2598: *outlen = out - outstart;
! 2599: *inlen = processed - instart;
! 2600: return(-2);
! 2601: }
! 2602: c1 = c1 & 0x3F;
! 2603: c2 = c2 & 0x3F;
! 2604: d = d & 0x0F;
! 2605: d = xlattable [48 + c2 + xlattable [48 + c1 +
! 2606: xlattable [32 + d] * 64] * 64];
! 2607: if (d == 0) {
! 2608: /* not in character set */
! 2609: *outlen = out - outstart;
! 2610: *inlen = processed - instart;
! 2611: return(-2);
! 2612: }
! 2613: *out++ = d;
! 2614: } else {
! 2615: /* cannot transcode >= U+010000 */
! 2616: *outlen = out - outstart;
! 2617: *inlen = processed - instart;
! 2618: return(-2);
! 2619: }
! 2620: processed = in;
! 2621: }
! 2622: *outlen = out - outstart;
! 2623: *inlen = processed - instart;
! 2624: return(*outlen);
! 2625: }
! 2626:
! 2627: /**
! 2628: * ISO8859xToUTF8
! 2629: * @out: a pointer to an array of bytes to store the result
! 2630: * @outlen: the length of @out
! 2631: * @in: a pointer to an array of ISO Latin 1 chars
! 2632: * @inlen: the length of @in
! 2633: *
! 2634: * Take a block of ISO 8859-* chars in and try to convert it to an UTF-8
! 2635: * block of chars out.
! 2636: * Returns 0 if success, or -1 otherwise
! 2637: * The value of @inlen after return is the number of octets consumed
! 2638: * The value of @outlen after return is the number of ocetes produced.
! 2639: */
! 2640: static int
! 2641: ISO8859xToUTF8(unsigned char* out, int *outlen,
! 2642: const unsigned char* in, int *inlen,
! 2643: unsigned short const *unicodetable) {
! 2644: unsigned char* outstart = out;
! 2645: unsigned char* outend;
! 2646: const unsigned char* instart = in;
! 2647: const unsigned char* inend;
! 2648: const unsigned char* instop;
! 2649: unsigned int c;
! 2650:
! 2651: if ((out == NULL) || (outlen == NULL) || (inlen == NULL) ||
! 2652: (in == NULL) || (unicodetable == NULL))
! 2653: return(-1);
! 2654: outend = out + *outlen;
! 2655: inend = in + *inlen;
! 2656: instop = inend;
! 2657:
! 2658: while ((in < inend) && (out < outend - 2)) {
! 2659: if (*in >= 0x80) {
! 2660: c = unicodetable [*in - 0x80];
! 2661: if (c == 0) {
! 2662: /* undefined code point */
! 2663: *outlen = out - outstart;
! 2664: *inlen = in - instart;
! 2665: return (-1);
! 2666: }
! 2667: if (c < 0x800) {
! 2668: *out++ = ((c >> 6) & 0x1F) | 0xC0;
! 2669: *out++ = (c & 0x3F) | 0x80;
! 2670: } else {
! 2671: *out++ = ((c >> 12) & 0x0F) | 0xE0;
! 2672: *out++ = ((c >> 6) & 0x3F) | 0x80;
! 2673: *out++ = (c & 0x3F) | 0x80;
! 2674: }
! 2675: ++in;
! 2676: }
! 2677: if (instop - in > outend - out) instop = in + (outend - out);
! 2678: while ((*in < 0x80) && (in < instop)) {
! 2679: *out++ = *in++;
! 2680: }
! 2681: }
! 2682: if ((in < inend) && (out < outend) && (*in < 0x80)) {
! 2683: *out++ = *in++;
! 2684: }
! 2685: if ((in < inend) && (out < outend) && (*in < 0x80)) {
! 2686: *out++ = *in++;
! 2687: }
! 2688: *outlen = out - outstart;
! 2689: *inlen = in - instart;
! 2690: return (*outlen);
! 2691: }
! 2692:
! 2693:
! 2694: /************************************************************************
! 2695: * Lookup tables for ISO-8859-2..ISO-8859-16 transcoding *
! 2696: ************************************************************************/
! 2697:
! 2698: static unsigned short const xmlunicodetable_ISO8859_2 [128] = {
! 2699: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
! 2700: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
! 2701: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
! 2702: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
! 2703: 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7,
! 2704: 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b,
! 2705: 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7,
! 2706: 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c,
! 2707: 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7,
! 2708: 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e,
! 2709: 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7,
! 2710: 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
! 2711: 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7,
! 2712: 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
! 2713: 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7,
! 2714: 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9,
! 2715: };
! 2716:
! 2717: static unsigned char const xmltranscodetable_ISO8859_2 [48 + 6 * 64] = {
! 2718: "\x00\x00\x01\x05\x02\x04\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00"
! 2719: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2720: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2721: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2722: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2723: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2724: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2725: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
! 2726: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
! 2727: "\xa0\x00\x00\x00\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\x00"
! 2728: "\xb0\x00\x00\x00\xb4\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00"
! 2729: "\x00\x00\xc3\xe3\xa1\xb1\xc6\xe6\x00\x00\x00\x00\xc8\xe8\xcf\xef"
! 2730: "\xd0\xf0\x00\x00\x00\x00\x00\x00\xca\xea\xcc\xec\x00\x00\x00\x00"
! 2731: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2732: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xe5\x00\x00\xa5\xb5\x00"
! 2733: "\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00"
! 2734: "\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\x00\xb2\x00\xbd\x00\x00"
! 2735: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2736: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2737: "\x00\xa3\xb3\xd1\xf1\x00\x00\xd2\xf2\x00\x00\x00\x00\x00\x00\x00"
! 2738: "\xd5\xf5\x00\x00\xc0\xe0\x00\x00\xd8\xf8\xa6\xb6\x00\x00\xaa\xba"
! 2739: "\xa9\xb9\xde\xfe\xab\xbb\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xf9"
! 2740: "\xdb\xfb\x00\x00\x00\x00\x00\x00\x00\xac\xbc\xaf\xbf\xae\xbe\x00"
! 2741: "\x00\xc1\xc2\x00\xc4\x00\x00\xc7\x00\xc9\x00\xcb\x00\xcd\xce\x00"
! 2742: "\x00\x00\x00\xd3\xd4\x00\xd6\xd7\x00\x00\xda\x00\xdc\xdd\x00\xdf"
! 2743: "\x00\xe1\xe2\x00\xe4\x00\x00\xe7\x00\xe9\x00\xeb\x00\xed\xee\x00"
! 2744: "\x00\x00\x00\xf3\xf4\x00\xf6\xf7\x00\x00\xfa\x00\xfc\xfd\x00\x00"
! 2745: };
! 2746:
! 2747: static unsigned short const xmlunicodetable_ISO8859_3 [128] = {
! 2748: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
! 2749: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
! 2750: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
! 2751: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
! 2752: 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7,
! 2753: 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b,
! 2754: 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7,
! 2755: 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c,
! 2756: 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7,
! 2757: 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
! 2758: 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7,
! 2759: 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df,
! 2760: 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7,
! 2761: 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
! 2762: 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7,
! 2763: 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9,
! 2764: };
! 2765:
! 2766: static unsigned char const xmltranscodetable_ISO8859_3 [48 + 7 * 64] = {
! 2767: "\x04\x00\x01\x06\x02\x05\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00"
! 2768: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2769: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2770: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2771: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2772: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2773: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2774: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
! 2775: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
! 2776: "\xa0\x00\x00\xa3\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\x00"
! 2777: "\xb0\x00\xb2\xb3\xb4\xb5\x00\xb7\xb8\x00\x00\x00\x00\xbd\x00\x00"
! 2778: "\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xe6\xc5\xe5\x00\x00\x00\x00"
! 2779: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xf8\xab\xbb"
! 2780: "\xd5\xf5\x00\x00\xa6\xb6\xa1\xb1\x00\x00\x00\x00\x00\x00\x00\x00"
! 2781: "\xa9\xb9\x00\x00\xac\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2782: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2783: "\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\x00\x00\x00\x00\x00\x00"
! 2784: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2785: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2786: "\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2787: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2788: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2789: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2790: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2791: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xfe\xaa\xba"
! 2792: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\xfd\x00\x00"
! 2793: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\xbf\x00\x00\x00"
! 2794: "\xc0\xc1\xc2\x00\xc4\x00\x00\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
! 2795: "\x00\xd1\xd2\xd3\xd4\x00\xd6\xd7\x00\xd9\xda\xdb\xdc\x00\x00\xdf"
! 2796: "\xe0\xe1\xe2\x00\xe4\x00\x00\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
! 2797: "\x00\xf1\xf2\xf3\xf4\x00\xf6\xf7\x00\xf9\xfa\xfb\xfc\x00\x00\x00"
! 2798: };
! 2799:
! 2800: static unsigned short const xmlunicodetable_ISO8859_4 [128] = {
! 2801: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
! 2802: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
! 2803: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
! 2804: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
! 2805: 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7,
! 2806: 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af,
! 2807: 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7,
! 2808: 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b,
! 2809: 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e,
! 2810: 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a,
! 2811: 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
! 2812: 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df,
! 2813: 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f,
! 2814: 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b,
! 2815: 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
! 2816: 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9,
! 2817: };
! 2818:
! 2819: static unsigned char const xmltranscodetable_ISO8859_4 [48 + 6 * 64] = {
! 2820: "\x00\x00\x01\x05\x02\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00"
! 2821: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2822: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2823: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2824: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2825: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2826: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2827: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
! 2828: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
! 2829: "\xa0\x00\x00\x00\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\xaf"
! 2830: "\xb0\x00\x00\x00\xb4\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00"
! 2831: "\xc0\xe0\x00\x00\xa1\xb1\x00\x00\x00\x00\x00\x00\xc8\xe8\x00\x00"
! 2832: "\xd0\xf0\xaa\xba\x00\x00\xcc\xec\xca\xea\x00\x00\x00\x00\x00\x00"
! 2833: "\x00\x00\xab\xbb\x00\x00\x00\x00\xa5\xb5\xcf\xef\x00\x00\xc7\xe7"
! 2834: "\x00\x00\x00\x00\x00\x00\xd3\xf3\xa2\x00\x00\xa6\xb6\x00\x00\x00"
! 2835: "\x00\x00\x00\x00\x00\xd1\xf1\x00\x00\x00\xbd\xbf\xd2\xf2\x00\x00"
! 2836: "\x00\x00\x00\x00\x00\x00\xa3\xb3\x00\x00\x00\x00\x00\x00\x00\x00"
! 2837: "\xa9\xb9\x00\x00\x00\x00\xac\xbc\xdd\xfd\xde\xfe\x00\x00\x00\x00"
! 2838: "\x00\x00\xd9\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\xbe\x00"
! 2839: "\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00"
! 2840: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\xb2\x00\x00\x00\x00"
! 2841: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2842: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2843: "\x00\xc1\xc2\xc3\xc4\xc5\xc6\x00\x00\xc9\x00\xcb\x00\xcd\xce\x00"
! 2844: "\x00\x00\x00\x00\xd4\xd5\xd6\xd7\xd8\x00\xda\xdb\xdc\x00\x00\xdf"
! 2845: "\x00\xe1\xe2\xe3\xe4\xe5\xe6\x00\x00\xe9\x00\xeb\x00\xed\xee\x00"
! 2846: "\x00\x00\x00\x00\xf4\xf5\xf6\xf7\xf8\x00\xfa\xfb\xfc\x00\x00\x00"
! 2847: };
! 2848:
! 2849: static unsigned short const xmlunicodetable_ISO8859_5 [128] = {
! 2850: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
! 2851: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
! 2852: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
! 2853: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
! 2854: 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
! 2855: 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f,
! 2856: 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
! 2857: 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
! 2858: 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
! 2859: 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
! 2860: 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
! 2861: 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
! 2862: 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
! 2863: 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
! 2864: 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
! 2865: 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f,
! 2866: };
! 2867:
! 2868: static unsigned char const xmltranscodetable_ISO8859_5 [48 + 6 * 64] = {
! 2869: "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2870: "\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2871: "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2872: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2873: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2874: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2875: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2876: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
! 2877: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
! 2878: "\xa0\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\xad\x00\x00"
! 2879: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2880: "\x00\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\x00\xae\xaf"
! 2881: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
! 2882: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
! 2883: "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
! 2884: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
! 2885: "\x00\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\x00\xfe\xff"
! 2886: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2887: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2888: "\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2889: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2890: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2891: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2892: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2893: "\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2894: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2895: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2896: };
! 2897:
! 2898: static unsigned short const xmlunicodetable_ISO8859_6 [128] = {
! 2899: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
! 2900: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
! 2901: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
! 2902: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
! 2903: 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000,
! 2904: 0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000,
! 2905: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
! 2906: 0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f,
! 2907: 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
! 2908: 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f,
! 2909: 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
! 2910: 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
! 2911: 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647,
! 2912: 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f,
! 2913: 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
! 2914: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
! 2915: };
! 2916:
! 2917: static unsigned char const xmltranscodetable_ISO8859_6 [48 + 5 * 64] = {
! 2918: "\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2919: "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00"
! 2920: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2921: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2922: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2923: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2924: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2925: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
! 2926: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
! 2927: "\xa0\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00"
! 2928: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2929: "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2930: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2931: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2932: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2933: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00"
! 2934: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\xbf"
! 2935: "\x00\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
! 2936: "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\x00\x00\x00\x00\x00"
! 2937: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
! 2938: "\xf0\xf1\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2939: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2940: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2941: };
! 2942:
! 2943: static unsigned short const xmlunicodetable_ISO8859_7 [128] = {
! 2944: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
! 2945: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
! 2946: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
! 2947: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
! 2948: 0x00a0, 0x2018, 0x2019, 0x00a3, 0x0000, 0x0000, 0x00a6, 0x00a7,
! 2949: 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015,
! 2950: 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7,
! 2951: 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f,
! 2952: 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
! 2953: 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
! 2954: 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
! 2955: 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
! 2956: 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
! 2957: 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
! 2958: 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7,
! 2959: 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000,
! 2960: };
! 2961:
! 2962: static unsigned char const xmltranscodetable_ISO8859_7 [48 + 7 * 64] = {
! 2963: "\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x06"
! 2964: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2965: "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2966: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2967: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2968: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2969: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2970: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
! 2971: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
! 2972: "\xa0\x00\x00\xa3\x00\x00\xa6\xa7\xa8\xa9\x00\xab\xac\xad\x00\x00"
! 2973: "\xb0\xb1\xb2\xb3\x00\x00\x00\xb7\x00\x00\x00\xbb\x00\xbd\x00\x00"
! 2974: "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2975: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2976: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2977: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2978: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2979: "\x00\x00\x00\x00\x00\xaf\x00\x00\xa1\xa2\x00\x00\x00\x00\x00\x00"
! 2980: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2981: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2982: "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2983: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2984: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2985: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2986: "\x00\x00\x00\x00\xb4\xb5\xb6\x00\xb8\xb9\xba\x00\xbc\x00\xbe\xbf"
! 2987: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
! 2988: "\xd0\xd1\x00\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
! 2989: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
! 2990: "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\x00"
! 2991: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2992: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2993: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 2994: };
! 2995:
! 2996: static unsigned short const xmlunicodetable_ISO8859_8 [128] = {
! 2997: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
! 2998: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
! 2999: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
! 3000: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
! 3001: 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
! 3002: 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
! 3003: 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
! 3004: 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000,
! 3005: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
! 3006: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
! 3007: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
! 3008: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017,
! 3009: 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7,
! 3010: 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df,
! 3011: 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7,
! 3012: 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000,
! 3013: };
! 3014:
! 3015: static unsigned char const xmltranscodetable_ISO8859_8 [48 + 7 * 64] = {
! 3016: "\x02\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3017: "\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00"
! 3018: "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3019: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3020: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3021: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3022: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3023: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
! 3024: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
! 3025: "\xa0\x00\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\x00\xab\xac\xad\xae\xaf"
! 3026: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\x00\xbb\xbc\xbd\xbe\x00"
! 3027: "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3028: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3029: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3030: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3031: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3032: "\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00"
! 3033: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3034: "\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00"
! 3035: "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3036: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3037: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3038: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3039: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\xfe"
! 3040: "\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00"
! 3041: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3042: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3043: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3044: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
! 3045: "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\x00\x00\x00\x00\x00"
! 3046: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3047: };
! 3048:
! 3049: static unsigned short const xmlunicodetable_ISO8859_9 [128] = {
! 3050: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
! 3051: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
! 3052: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
! 3053: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
! 3054: 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
! 3055: 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
! 3056: 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
! 3057: 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
! 3058: 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
! 3059: 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
! 3060: 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
! 3061: 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
! 3062: 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
! 3063: 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
! 3064: 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
! 3065: 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff,
! 3066: };
! 3067:
! 3068: static unsigned char const xmltranscodetable_ISO8859_9 [48 + 5 * 64] = {
! 3069: "\x00\x00\x01\x02\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3070: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3071: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3072: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3073: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3074: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3075: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3076: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
! 3077: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
! 3078: "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
! 3079: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
! 3080: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
! 3081: "\x00\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\x00\x00\xdf"
! 3082: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
! 3083: "\x00\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\x00\x00\xff"
! 3084: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3085: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xf0"
! 3086: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3087: "\xdd\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3088: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3089: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xfe"
! 3090: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3091: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3092: };
! 3093:
! 3094: static unsigned short const xmlunicodetable_ISO8859_10 [128] = {
! 3095: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
! 3096: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
! 3097: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
! 3098: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
! 3099: 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7,
! 3100: 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a,
! 3101: 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7,
! 3102: 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b,
! 3103: 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e,
! 3104: 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf,
! 3105: 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168,
! 3106: 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
! 3107: 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f,
! 3108: 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef,
! 3109: 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169,
! 3110: 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138,
! 3111: };
! 3112:
! 3113: static unsigned char const xmltranscodetable_ISO8859_10 [48 + 7 * 64] = {
! 3114: "\x00\x00\x01\x06\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3115: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3116: "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3117: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3118: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3119: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3120: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3121: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
! 3122: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
! 3123: "\xa0\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\xad\x00\x00"
! 3124: "\xb0\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00"
! 3125: "\xc0\xe0\x00\x00\xa1\xb1\x00\x00\x00\x00\x00\x00\xc8\xe8\x00\x00"
! 3126: "\xa9\xb9\xa2\xb2\x00\x00\xcc\xec\xca\xea\x00\x00\x00\x00\x00\x00"
! 3127: "\x00\x00\xa3\xb3\x00\x00\x00\x00\xa5\xb5\xa4\xb4\x00\x00\xc7\xe7"
! 3128: "\x00\x00\x00\x00\x00\x00\xa6\xb6\xff\x00\x00\xa8\xb8\x00\x00\x00"
! 3129: "\x00\x00\x00\x00\x00\xd1\xf1\x00\x00\x00\xaf\xbf\xd2\xf2\x00\x00"
! 3130: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3131: "\xaa\xba\x00\x00\x00\x00\xab\xbb\xd7\xf7\xae\xbe\x00\x00\x00\x00"
! 3132: "\x00\x00\xd9\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\xbc\x00"
! 3133: "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3134: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3135: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3136: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3137: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3138: "\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3139: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3140: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3141: "\x00\xc1\xc2\xc3\xc4\xc5\xc6\x00\x00\xc9\x00\xcb\x00\xcd\xce\xcf"
! 3142: "\xd0\x00\x00\xd3\xd4\xd5\xd6\x00\xd8\x00\xda\xdb\xdc\xdd\xde\xdf"
! 3143: "\x00\xe1\xe2\xe3\xe4\xe5\xe6\x00\x00\xe9\x00\xeb\x00\xed\xee\xef"
! 3144: "\xf0\x00\x00\xf3\xf4\xf5\xf6\x00\xf8\x00\xfa\xfb\xfc\xfd\xfe\x00"
! 3145: };
! 3146:
! 3147: static unsigned short const xmlunicodetable_ISO8859_11 [128] = {
! 3148: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
! 3149: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
! 3150: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
! 3151: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
! 3152: 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07,
! 3153: 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f,
! 3154: 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17,
! 3155: 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f,
! 3156: 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27,
! 3157: 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f,
! 3158: 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37,
! 3159: 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f,
! 3160: 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47,
! 3161: 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f,
! 3162: 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57,
! 3163: 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000,
! 3164: };
! 3165:
! 3166: static unsigned char const xmltranscodetable_ISO8859_11 [48 + 6 * 64] = {
! 3167: "\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3168: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3169: "\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3170: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3171: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3172: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3173: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3174: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
! 3175: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
! 3176: "\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3177: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3178: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3179: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3180: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3181: "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x05\x00\x00\x00\x00\x00\x00"
! 3182: "\x00\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
! 3183: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
! 3184: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
! 3185: "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\x00\x00\x00\x00\xdf"
! 3186: "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3187: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3188: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3189: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3190: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
! 3191: "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\x00\x00\x00\x00"
! 3192: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3193: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3194: };
! 3195:
! 3196: static unsigned short const xmlunicodetable_ISO8859_13 [128] = {
! 3197: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
! 3198: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
! 3199: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
! 3200: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
! 3201: 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7,
! 3202: 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6,
! 3203: 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7,
! 3204: 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6,
! 3205: 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112,
! 3206: 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b,
! 3207: 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7,
! 3208: 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df,
! 3209: 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113,
! 3210: 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c,
! 3211: 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7,
! 3212: 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019,
! 3213: };
! 3214:
! 3215: static unsigned char const xmltranscodetable_ISO8859_13 [48 + 7 * 64] = {
! 3216: "\x00\x00\x01\x04\x06\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3217: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3218: "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3219: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3220: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3221: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3222: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3223: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
! 3224: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
! 3225: "\xa0\x00\xa2\xa3\xa4\x00\xa6\xa7\x00\xa9\x00\xab\xac\xad\xae\x00"
! 3226: "\xb0\xb1\xb2\xb3\x00\xb5\xb6\xb7\x00\xb9\x00\xbb\xbc\xbd\xbe\x00"
! 3227: "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3228: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3229: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3230: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3231: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3232: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\xb4\xa1\xa5\x00"
! 3233: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3234: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3235: "\x00\x00\x00\x00\xc4\xc5\xaf\x00\x00\xc9\x00\x00\x00\x00\x00\x00"
! 3236: "\x00\x00\x00\xd3\x00\xd5\xd6\xd7\xa8\x00\x00\x00\xdc\x00\x00\xdf"
! 3237: "\x00\x00\x00\x00\xe4\xe5\xbf\x00\x00\xe9\x00\x00\x00\x00\x00\x00"
! 3238: "\x00\x00\x00\xf3\x00\xf5\xf6\xf7\xb8\x00\x00\x00\xfc\x00\x00\x00"
! 3239: "\x00\xd9\xf9\xd1\xf1\xd2\xf2\x00\x00\x00\x00\x00\xd4\xf4\x00\x00"
! 3240: "\x00\x00\x00\x00\x00\x00\xaa\xba\x00\x00\xda\xfa\x00\x00\x00\x00"
! 3241: "\xd0\xf0\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xfb\x00\x00\x00\x00"
! 3242: "\x00\x00\xd8\xf8\x00\x00\x00\x00\x00\xca\xea\xdd\xfd\xde\xfe\x00"
! 3243: "\xc2\xe2\x00\x00\xc0\xe0\xc3\xe3\x00\x00\x00\x00\xc8\xe8\x00\x00"
! 3244: "\x00\x00\xc7\xe7\x00\x00\xcb\xeb\xc6\xe6\x00\x00\x00\x00\x00\x00"
! 3245: "\x00\x00\xcc\xec\x00\x00\x00\x00\x00\x00\xce\xee\x00\x00\xc1\xe1"
! 3246: "\x00\x00\x00\x00\x00\x00\xcd\xed\x00\x00\x00\xcf\xef\x00\x00\x00"
! 3247: };
! 3248:
! 3249: static unsigned short const xmlunicodetable_ISO8859_14 [128] = {
! 3250: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
! 3251: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
! 3252: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
! 3253: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
! 3254: 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7,
! 3255: 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178,
! 3256: 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56,
! 3257: 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61,
! 3258: 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
! 3259: 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
! 3260: 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a,
! 3261: 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df,
! 3262: 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
! 3263: 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
! 3264: 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b,
! 3265: 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff,
! 3266: };
! 3267:
! 3268: static unsigned char const xmltranscodetable_ISO8859_14 [48 + 10 * 64] = {
! 3269: "\x00\x00\x01\x09\x04\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3270: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3271: "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3272: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3273: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3274: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3275: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3276: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
! 3277: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
! 3278: "\xa0\x00\x00\xa3\x00\x00\x00\xa7\x00\xa9\x00\x00\x00\xad\xae\x00"
! 3279: "\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3280: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3281: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3282: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3283: "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x08\x05\x06\x00\x00\x00\x00"
! 3284: "\x00\x00\xa1\xa2\x00\x00\x00\x00\x00\x00\xa6\xab\x00\x00\x00\x00"
! 3285: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xb1"
! 3286: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3287: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3288: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\xa5\x00\x00\x00\x00"
! 3289: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3290: "\xb2\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3291: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3292: "\xa8\xb8\xaa\xba\xbd\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3293: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3294: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3295: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3296: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3297: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3298: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3299: "\x00\x00\xac\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3300: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3301: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3302: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3303: "\x00\x00\x00\x00\xd0\xf0\xde\xfe\xaf\x00\x00\x00\x00\x00\x00\x00"
! 3304: "\xb4\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3305: "\x00\x00\x00\x00\x00\x00\xb7\xb9\x00\x00\x00\x00\x00\x00\x00\x00"
! 3306: "\xbb\xbf\x00\x00\x00\x00\x00\x00\x00\x00\xd7\xf7\x00\x00\x00\x00"
! 3307: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3308: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
! 3309: "\x00\xd1\xd2\xd3\xd4\xd5\xd6\x00\xd8\xd9\xda\xdb\xdc\xdd\x00\xdf"
! 3310: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
! 3311: "\x00\xf1\xf2\xf3\xf4\xf5\xf6\x00\xf8\xf9\xfa\xfb\xfc\xfd\x00\xff"
! 3312: };
! 3313:
! 3314: static unsigned short const xmlunicodetable_ISO8859_15 [128] = {
! 3315: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
! 3316: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
! 3317: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
! 3318: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
! 3319: 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7,
! 3320: 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
! 3321: 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7,
! 3322: 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf,
! 3323: 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
! 3324: 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
! 3325: 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
! 3326: 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
! 3327: 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
! 3328: 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
! 3329: 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
! 3330: 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff,
! 3331: };
! 3332:
! 3333: static unsigned char const xmltranscodetable_ISO8859_15 [48 + 6 * 64] = {
! 3334: "\x00\x00\x01\x05\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3335: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3336: "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3337: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3338: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3339: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3340: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3341: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
! 3342: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
! 3343: "\xa0\xa1\xa2\xa3\x00\xa5\x00\xa7\x00\xa9\xaa\xab\xac\xad\xae\xaf"
! 3344: "\xb0\xb1\xb2\xb3\x00\xb5\xb6\xb7\x00\xb9\xba\xbb\x00\x00\x00\xbf"
! 3345: "\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3346: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3347: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3348: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3349: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3350: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3351: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00"
! 3352: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3353: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3354: "\x00\x00\xbc\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3355: "\xa6\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3356: "\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\xb4\xb8\x00"
! 3357: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
! 3358: "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
! 3359: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
! 3360: "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
! 3361: };
! 3362:
! 3363: static unsigned short const xmlunicodetable_ISO8859_16 [128] = {
! 3364: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
! 3365: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
! 3366: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
! 3367: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
! 3368: 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7,
! 3369: 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b,
! 3370: 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7,
! 3371: 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c,
! 3372: 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7,
! 3373: 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
! 3374: 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a,
! 3375: 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df,
! 3376: 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7,
! 3377: 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
! 3378: 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b,
! 3379: 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff,
! 3380: };
! 3381:
! 3382: static unsigned char const xmltranscodetable_ISO8859_16 [48 + 9 * 64] = {
! 3383: "\x00\x00\x01\x08\x02\x03\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00"
! 3384: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3385: "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3386: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3387: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3388: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3389: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3390: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
! 3391: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
! 3392: "\xa0\x00\x00\x00\x00\x00\x00\xa7\x00\xa9\x00\xab\x00\xad\x00\x00"
! 3393: "\xb0\xb1\x00\x00\x00\x00\xb6\xb7\x00\x00\x00\xbb\x00\x00\x00\x00"
! 3394: "\x00\x00\xc3\xe3\xa1\xa2\xc5\xe5\x00\x00\x00\x00\xb2\xb9\x00\x00"
! 3395: "\xd0\xf0\x00\x00\x00\x00\x00\x00\xdd\xfd\x00\x00\x00\x00\x00\x00"
! 3396: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3397: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3398: "\x00\xa3\xb3\xd1\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3399: "\xd5\xf5\xbc\xbd\x00\x00\x00\x00\x00\x00\xd7\xf7\x00\x00\x00\x00"
! 3400: "\xa6\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3401: "\xd8\xf8\x00\x00\x00\x00\x00\x00\xbe\xac\xae\xaf\xbf\xb4\xb8\x00"
! 3402: "\x06\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3403: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3404: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3405: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3406: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3407: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3408: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00"
! 3409: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3410: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3411: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\xa5\x00"
! 3412: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3413: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3414: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3415: "\x00\x00\x00\x00\x00\x00\x00\x00\xaa\xba\xde\xfe\x00\x00\x00\x00"
! 3416: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3417: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
! 3418: "\xc0\xc1\xc2\x00\xc4\x00\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
! 3419: "\x00\x00\xd2\xd3\xd4\x00\xd6\x00\x00\xd9\xda\xdb\xdc\x00\x00\xdf"
! 3420: "\xe0\xe1\xe2\x00\xe4\x00\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
! 3421: "\x00\x00\xf2\xf3\xf4\x00\xf6\x00\x00\xf9\xfa\xfb\xfc\x00\x00\xff"
! 3422: };
! 3423:
! 3424:
! 3425: /*
! 3426: * auto-generated functions for ISO-8859-2 .. ISO-8859-16
! 3427: */
! 3428:
! 3429: static int ISO8859_2ToUTF8 (unsigned char* out, int *outlen,
! 3430: const unsigned char* in, int *inlen) {
! 3431: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_2);
! 3432: }
! 3433: static int UTF8ToISO8859_2 (unsigned char* out, int *outlen,
! 3434: const unsigned char* in, int *inlen) {
! 3435: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_2);
! 3436: }
! 3437:
! 3438: static int ISO8859_3ToUTF8 (unsigned char* out, int *outlen,
! 3439: const unsigned char* in, int *inlen) {
! 3440: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_3);
! 3441: }
! 3442: static int UTF8ToISO8859_3 (unsigned char* out, int *outlen,
! 3443: const unsigned char* in, int *inlen) {
! 3444: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_3);
! 3445: }
! 3446:
! 3447: static int ISO8859_4ToUTF8 (unsigned char* out, int *outlen,
! 3448: const unsigned char* in, int *inlen) {
! 3449: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_4);
! 3450: }
! 3451: static int UTF8ToISO8859_4 (unsigned char* out, int *outlen,
! 3452: const unsigned char* in, int *inlen) {
! 3453: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_4);
! 3454: }
! 3455:
! 3456: static int ISO8859_5ToUTF8 (unsigned char* out, int *outlen,
! 3457: const unsigned char* in, int *inlen) {
! 3458: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_5);
! 3459: }
! 3460: static int UTF8ToISO8859_5 (unsigned char* out, int *outlen,
! 3461: const unsigned char* in, int *inlen) {
! 3462: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_5);
! 3463: }
! 3464:
! 3465: static int ISO8859_6ToUTF8 (unsigned char* out, int *outlen,
! 3466: const unsigned char* in, int *inlen) {
! 3467: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_6);
! 3468: }
! 3469: static int UTF8ToISO8859_6 (unsigned char* out, int *outlen,
! 3470: const unsigned char* in, int *inlen) {
! 3471: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_6);
! 3472: }
! 3473:
! 3474: static int ISO8859_7ToUTF8 (unsigned char* out, int *outlen,
! 3475: const unsigned char* in, int *inlen) {
! 3476: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_7);
! 3477: }
! 3478: static int UTF8ToISO8859_7 (unsigned char* out, int *outlen,
! 3479: const unsigned char* in, int *inlen) {
! 3480: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_7);
! 3481: }
! 3482:
! 3483: static int ISO8859_8ToUTF8 (unsigned char* out, int *outlen,
! 3484: const unsigned char* in, int *inlen) {
! 3485: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_8);
! 3486: }
! 3487: static int UTF8ToISO8859_8 (unsigned char* out, int *outlen,
! 3488: const unsigned char* in, int *inlen) {
! 3489: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_8);
! 3490: }
! 3491:
! 3492: static int ISO8859_9ToUTF8 (unsigned char* out, int *outlen,
! 3493: const unsigned char* in, int *inlen) {
! 3494: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_9);
! 3495: }
! 3496: static int UTF8ToISO8859_9 (unsigned char* out, int *outlen,
! 3497: const unsigned char* in, int *inlen) {
! 3498: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_9);
! 3499: }
! 3500:
! 3501: static int ISO8859_10ToUTF8 (unsigned char* out, int *outlen,
! 3502: const unsigned char* in, int *inlen) {
! 3503: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_10);
! 3504: }
! 3505: static int UTF8ToISO8859_10 (unsigned char* out, int *outlen,
! 3506: const unsigned char* in, int *inlen) {
! 3507: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_10);
! 3508: }
! 3509:
! 3510: static int ISO8859_11ToUTF8 (unsigned char* out, int *outlen,
! 3511: const unsigned char* in, int *inlen) {
! 3512: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_11);
! 3513: }
! 3514: static int UTF8ToISO8859_11 (unsigned char* out, int *outlen,
! 3515: const unsigned char* in, int *inlen) {
! 3516: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_11);
! 3517: }
! 3518:
! 3519: static int ISO8859_13ToUTF8 (unsigned char* out, int *outlen,
! 3520: const unsigned char* in, int *inlen) {
! 3521: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_13);
! 3522: }
! 3523: static int UTF8ToISO8859_13 (unsigned char* out, int *outlen,
! 3524: const unsigned char* in, int *inlen) {
! 3525: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_13);
! 3526: }
! 3527:
! 3528: static int ISO8859_14ToUTF8 (unsigned char* out, int *outlen,
! 3529: const unsigned char* in, int *inlen) {
! 3530: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_14);
! 3531: }
! 3532: static int UTF8ToISO8859_14 (unsigned char* out, int *outlen,
! 3533: const unsigned char* in, int *inlen) {
! 3534: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_14);
! 3535: }
! 3536:
! 3537: static int ISO8859_15ToUTF8 (unsigned char* out, int *outlen,
! 3538: const unsigned char* in, int *inlen) {
! 3539: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_15);
! 3540: }
! 3541: static int UTF8ToISO8859_15 (unsigned char* out, int *outlen,
! 3542: const unsigned char* in, int *inlen) {
! 3543: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_15);
! 3544: }
! 3545:
! 3546: static int ISO8859_16ToUTF8 (unsigned char* out, int *outlen,
! 3547: const unsigned char* in, int *inlen) {
! 3548: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_16);
! 3549: }
! 3550: static int UTF8ToISO8859_16 (unsigned char* out, int *outlen,
! 3551: const unsigned char* in, int *inlen) {
! 3552: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_16);
! 3553: }
! 3554:
! 3555: static void
! 3556: xmlRegisterCharEncodingHandlersISO8859x (void) {
! 3557: xmlNewCharEncodingHandler ("ISO-8859-2", ISO8859_2ToUTF8, UTF8ToISO8859_2);
! 3558: xmlNewCharEncodingHandler ("ISO-8859-3", ISO8859_3ToUTF8, UTF8ToISO8859_3);
! 3559: xmlNewCharEncodingHandler ("ISO-8859-4", ISO8859_4ToUTF8, UTF8ToISO8859_4);
! 3560: xmlNewCharEncodingHandler ("ISO-8859-5", ISO8859_5ToUTF8, UTF8ToISO8859_5);
! 3561: xmlNewCharEncodingHandler ("ISO-8859-6", ISO8859_6ToUTF8, UTF8ToISO8859_6);
! 3562: xmlNewCharEncodingHandler ("ISO-8859-7", ISO8859_7ToUTF8, UTF8ToISO8859_7);
! 3563: xmlNewCharEncodingHandler ("ISO-8859-8", ISO8859_8ToUTF8, UTF8ToISO8859_8);
! 3564: xmlNewCharEncodingHandler ("ISO-8859-9", ISO8859_9ToUTF8, UTF8ToISO8859_9);
! 3565: xmlNewCharEncodingHandler ("ISO-8859-10", ISO8859_10ToUTF8, UTF8ToISO8859_10);
! 3566: xmlNewCharEncodingHandler ("ISO-8859-11", ISO8859_11ToUTF8, UTF8ToISO8859_11);
! 3567: xmlNewCharEncodingHandler ("ISO-8859-13", ISO8859_13ToUTF8, UTF8ToISO8859_13);
! 3568: xmlNewCharEncodingHandler ("ISO-8859-14", ISO8859_14ToUTF8, UTF8ToISO8859_14);
! 3569: xmlNewCharEncodingHandler ("ISO-8859-15", ISO8859_15ToUTF8, UTF8ToISO8859_15);
! 3570: xmlNewCharEncodingHandler ("ISO-8859-16", ISO8859_16ToUTF8, UTF8ToISO8859_16);
! 3571: }
! 3572:
! 3573: #endif
! 3574: #endif
! 3575:
! 3576: #define bottom_encoding
! 3577: #include "elfgcchack.h"
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>