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>