Annotation of embedaddon/libxml2/encoding.c, revision 1.1.1.2
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 */
1.1.1.2 ! misho 1931: written = out->size - out->use - 1; /* count '\0' */
1.1 misho 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);
1.1.1.2 ! misho 2062: written = out->size - out->use -1; /* count '\0' */
1.1 misho 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;
1.1.1.2 ! misho 2164: int charref_len = 0;
1.1 misho 2165:
2166: if (handler == NULL) return(-1);
2167: if (out == NULL) return(-1);
2168:
2169: retry:
2170:
2171: written = out->size - out->use;
2172:
2173: if (written > 0)
2174: written--; /* Gennady: count '/0' */
2175:
2176: /*
2177: * First specific handling of in = NULL, i.e. the initialization call
2178: */
2179: if (in == NULL) {
2180: toconv = 0;
2181: if (handler->output != NULL) {
2182: ret = handler->output(&out->content[out->use], &written,
2183: NULL, &toconv);
2184: if (ret >= 0) { /* Gennady: check return value */
2185: out->use += written;
2186: out->content[out->use] = 0;
2187: }
2188: }
2189: #ifdef LIBXML_ICONV_ENABLED
2190: else if (handler->iconv_out != NULL) {
2191: ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use],
2192: &written, NULL, &toconv);
2193: out->use += written;
2194: out->content[out->use] = 0;
2195: }
2196: #endif /* LIBXML_ICONV_ENABLED */
2197: #ifdef LIBXML_ICU_ENABLED
2198: else if (handler->uconv_out != NULL) {
2199: ret = xmlUconvWrapper(handler->uconv_out, 0,
2200: &out->content[out->use],
2201: &written, NULL, &toconv);
2202: out->use += written;
2203: out->content[out->use] = 0;
2204: }
2205: #endif /* LIBXML_ICU_ENABLED */
2206: #ifdef DEBUG_ENCODING
2207: xmlGenericError(xmlGenericErrorContext,
2208: "initialized encoder\n");
2209: #endif
2210: return(0);
2211: }
2212:
2213: /*
2214: * Conversion itself.
2215: */
2216: toconv = in->use;
2217: if (toconv == 0)
2218: return(0);
2219: if (toconv * 4 >= written) {
2220: xmlBufferGrow(out, toconv * 4);
2221: written = out->size - out->use - 1;
2222: }
2223: if (handler->output != NULL) {
2224: ret = handler->output(&out->content[out->use], &written,
2225: in->content, &toconv);
2226: if (written > 0) {
2227: xmlBufferShrink(in, toconv);
2228: out->use += written;
2229: writtentot += written;
2230: }
2231: out->content[out->use] = 0;
2232: }
2233: #ifdef LIBXML_ICONV_ENABLED
2234: else if (handler->iconv_out != NULL) {
2235: ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use],
2236: &written, in->content, &toconv);
2237: xmlBufferShrink(in, toconv);
2238: out->use += written;
2239: writtentot += written;
2240: out->content[out->use] = 0;
2241: if (ret == -1) {
2242: if (written > 0) {
2243: /*
2244: * Can be a limitation of iconv
2245: */
1.1.1.2 ! misho 2246: charref_len = 0;
1.1 misho 2247: goto retry;
2248: }
2249: ret = -3;
2250: }
2251: }
2252: #endif /* LIBXML_ICONV_ENABLED */
2253: #ifdef LIBXML_ICU_ENABLED
2254: else if (handler->uconv_out != NULL) {
2255: ret = xmlUconvWrapper(handler->uconv_out, 0,
2256: &out->content[out->use],
2257: &written, in->content, &toconv);
2258: xmlBufferShrink(in, toconv);
2259: out->use += written;
2260: writtentot += written;
2261: out->content[out->use] = 0;
2262: if (ret == -1) {
2263: if (written > 0) {
2264: /*
2265: * Can be a limitation of iconv
2266: */
1.1.1.2 ! misho 2267: charref_len = 0;
1.1 misho 2268: goto retry;
2269: }
2270: ret = -3;
2271: }
2272: }
2273: #endif /* LIBXML_ICU_ENABLED */
2274: else {
2275: xmlEncodingErr(XML_I18N_NO_OUTPUT,
2276: "xmlCharEncOutFunc: no output function !\n", NULL);
2277: return(-1);
2278: }
2279:
2280: if (ret >= 0) output += ret;
2281:
2282: /*
2283: * Attempt to handle error cases
2284: */
2285: switch (ret) {
2286: case 0:
2287: #ifdef DEBUG_ENCODING
2288: xmlGenericError(xmlGenericErrorContext,
2289: "converted %d bytes to %d bytes of output\n",
2290: toconv, written);
2291: #endif
2292: break;
2293: case -1:
2294: #ifdef DEBUG_ENCODING
2295: xmlGenericError(xmlGenericErrorContext,
2296: "output conversion failed by lack of space\n");
2297: #endif
2298: break;
2299: case -3:
2300: #ifdef DEBUG_ENCODING
2301: xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of output %d left\n",
2302: toconv, written, in->use);
2303: #endif
2304: break;
2305: case -2: {
2306: int len = in->use;
2307: const xmlChar *utf = (const xmlChar *) in->content;
2308: int cur;
2309:
2310: cur = xmlGetUTF8Char(utf, &len);
1.1.1.2 ! misho 2311: if ((charref_len != 0) && (written < charref_len)) {
! 2312: /*
! 2313: * We attempted to insert a character reference and failed.
! 2314: * Undo what was written and skip the remaining charref.
! 2315: */
! 2316: out->use -= written;
! 2317: writtentot -= written;
! 2318: xmlBufferShrink(in, charref_len - written);
! 2319: charref_len = 0;
! 2320:
! 2321: ret = -1;
! 2322: break;
! 2323: } else if (cur > 0) {
1.1 misho 2324: xmlChar charref[20];
2325:
2326: #ifdef DEBUG_ENCODING
2327: xmlGenericError(xmlGenericErrorContext,
2328: "handling output conversion error\n");
2329: xmlGenericError(xmlGenericErrorContext,
2330: "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n",
2331: in->content[0], in->content[1],
2332: in->content[2], in->content[3]);
2333: #endif
2334: /*
2335: * Removes the UTF8 sequence, and replace it by a charref
2336: * and continue the transcoding phase, hoping the error
2337: * did not mangle the encoder state.
2338: */
1.1.1.2 ! misho 2339: charref_len = snprintf((char *) &charref[0], sizeof(charref),
! 2340: "&#%d;", cur);
1.1 misho 2341: xmlBufferShrink(in, len);
2342: xmlBufferAddHead(in, charref, -1);
2343:
2344: goto retry;
2345: } else {
2346: char buf[50];
2347:
2348: snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X",
2349: in->content[0], in->content[1],
2350: in->content[2], in->content[3]);
2351: buf[49] = 0;
2352: xmlEncodingErr(XML_I18N_CONV_FAILED,
2353: "output conversion failed due to conv error, bytes %s\n",
2354: buf);
2355: if (in->alloc != XML_BUFFER_ALLOC_IMMUTABLE)
2356: in->content[0] = ' ';
2357: }
2358: break;
2359: }
2360: }
2361: return(ret);
2362: }
2363:
2364: /**
2365: * xmlCharEncCloseFunc:
2366: * @handler: char enconding transformation data structure
2367: *
2368: * Generic front-end for encoding handler close function
2369: *
2370: * Returns 0 if success, or -1 in case of error
2371: */
2372: int
2373: xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) {
2374: int ret = 0;
2375: int tofree = 0;
2376: if (handler == NULL) return(-1);
2377: if (handler->name == NULL) return(-1);
2378: #ifdef LIBXML_ICONV_ENABLED
2379: /*
2380: * Iconv handlers can be used only once, free the whole block.
2381: * and the associated icon resources.
2382: */
2383: if ((handler->iconv_out != NULL) || (handler->iconv_in != NULL)) {
2384: tofree = 1;
2385: if (handler->iconv_out != NULL) {
2386: if (iconv_close(handler->iconv_out))
2387: ret = -1;
2388: handler->iconv_out = NULL;
2389: }
2390: if (handler->iconv_in != NULL) {
2391: if (iconv_close(handler->iconv_in))
2392: ret = -1;
2393: handler->iconv_in = NULL;
2394: }
2395: }
2396: #endif /* LIBXML_ICONV_ENABLED */
2397: #ifdef LIBXML_ICU_ENABLED
2398: if ((handler->uconv_out != NULL) || (handler->uconv_in != NULL)) {
2399: tofree = 1;
2400: if (handler->uconv_out != NULL) {
2401: closeIcuConverter(handler->uconv_out);
2402: handler->uconv_out = NULL;
2403: }
2404: if (handler->uconv_in != NULL) {
2405: closeIcuConverter(handler->uconv_in);
2406: handler->uconv_in = NULL;
2407: }
2408: }
2409: #endif
2410: if (tofree) {
2411: /* free up only dynamic handlers iconv/uconv */
2412: if (handler->name != NULL)
2413: xmlFree(handler->name);
2414: handler->name = NULL;
2415: xmlFree(handler);
2416: }
2417: #ifdef DEBUG_ENCODING
2418: if (ret)
2419: xmlGenericError(xmlGenericErrorContext,
2420: "failed to close the encoding handler\n");
2421: else
2422: xmlGenericError(xmlGenericErrorContext,
2423: "closed the encoding handler\n");
2424: #endif
2425:
2426: return(ret);
2427: }
2428:
2429: /**
2430: * xmlByteConsumed:
2431: * @ctxt: an XML parser context
2432: *
2433: * This function provides the current index of the parser relative
2434: * to the start of the current entity. This function is computed in
2435: * bytes from the beginning starting at zero and finishing at the
2436: * size in byte of the file if parsing a file. The function is
2437: * of constant cost if the input is UTF-8 but can be costly if run
2438: * on non-UTF-8 input.
2439: *
2440: * Returns the index in bytes from the beginning of the entity or -1
2441: * in case the index could not be computed.
2442: */
2443: long
2444: xmlByteConsumed(xmlParserCtxtPtr ctxt) {
2445: xmlParserInputPtr in;
2446:
2447: if (ctxt == NULL) return(-1);
2448: in = ctxt->input;
2449: if (in == NULL) return(-1);
2450: if ((in->buf != NULL) && (in->buf->encoder != NULL)) {
2451: unsigned int unused = 0;
2452: xmlCharEncodingHandler * handler = in->buf->encoder;
2453: /*
2454: * Encoding conversion, compute the number of unused original
2455: * bytes from the input not consumed and substract that from
2456: * the raw consumed value, this is not a cheap operation
2457: */
2458: if (in->end - in->cur > 0) {
2459: unsigned char convbuf[32000];
2460: const unsigned char *cur = (const unsigned char *)in->cur;
2461: int toconv = in->end - in->cur, written = 32000;
2462:
2463: int ret;
2464:
2465: if (handler->output != NULL) {
2466: do {
2467: toconv = in->end - cur;
2468: written = 32000;
2469: ret = handler->output(&convbuf[0], &written,
2470: cur, &toconv);
2471: if (ret == -1) return(-1);
2472: unused += written;
2473: cur += toconv;
2474: } while (ret == -2);
2475: #ifdef LIBXML_ICONV_ENABLED
2476: } else if (handler->iconv_out != NULL) {
2477: do {
2478: toconv = in->end - cur;
2479: written = 32000;
2480: ret = xmlIconvWrapper(handler->iconv_out, &convbuf[0],
2481: &written, cur, &toconv);
2482: if (ret < 0) {
2483: if (written > 0)
2484: ret = -2;
2485: else
2486: return(-1);
2487: }
2488: unused += written;
2489: cur += toconv;
2490: } while (ret == -2);
2491: #endif
2492: #ifdef LIBXML_ICU_ENABLED
2493: } else if (handler->uconv_out != NULL) {
2494: do {
2495: toconv = in->end - cur;
2496: written = 32000;
2497: ret = xmlUconvWrapper(handler->uconv_out, 0, &convbuf[0],
2498: &written, cur, &toconv);
2499: if (ret < 0) {
2500: if (written > 0)
2501: ret = -2;
2502: else
2503: return(-1);
2504: }
2505: unused += written;
2506: cur += toconv;
2507: } while (ret == -2);
2508: #endif
2509: } else {
2510: /* could not find a converter */
2511: return(-1);
2512: }
2513: }
2514: if (in->buf->rawconsumed < unused)
2515: return(-1);
2516: return(in->buf->rawconsumed - unused);
2517: }
2518: return(in->consumed + (in->cur - in->base));
2519: }
2520:
2521: #if !defined(LIBXML_ICONV_ENABLED) && !defined(LIBXML_ICU_ENABLED)
2522: #ifdef LIBXML_ISO8859X_ENABLED
2523:
2524: /**
2525: * UTF8ToISO8859x:
2526: * @out: a pointer to an array of bytes to store the result
2527: * @outlen: the length of @out
2528: * @in: a pointer to an array of UTF-8 chars
2529: * @inlen: the length of @in
2530: * @xlattable: the 2-level transcoding table
2531: *
2532: * Take a block of UTF-8 chars in and try to convert it to an ISO 8859-*
2533: * block of chars out.
2534: *
2535: * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise
2536: * The value of @inlen after return is the number of octets consumed
2537: * as the return value is positive, else unpredictable.
2538: * The value of @outlen after return is the number of ocetes consumed.
2539: */
2540: static int
2541: UTF8ToISO8859x(unsigned char* out, int *outlen,
2542: const unsigned char* in, int *inlen,
2543: unsigned char const *xlattable) {
2544: const unsigned char* outstart = out;
2545: const unsigned char* inend;
2546: const unsigned char* instart = in;
2547: const unsigned char* processed = in;
2548:
2549: if ((out == NULL) || (outlen == NULL) || (inlen == NULL) ||
2550: (xlattable == NULL))
2551: return(-1);
2552: if (in == NULL) {
2553: /*
2554: * initialization nothing to do
2555: */
2556: *outlen = 0;
2557: *inlen = 0;
2558: return(0);
2559: }
2560: inend = in + (*inlen);
2561: while (in < inend) {
2562: unsigned char d = *in++;
2563: if (d < 0x80) {
2564: *out++ = d;
2565: } else if (d < 0xC0) {
2566: /* trailing byte in leading position */
2567: *outlen = out - outstart;
2568: *inlen = processed - instart;
2569: return(-2);
2570: } else if (d < 0xE0) {
2571: unsigned char c;
2572: if (!(in < inend)) {
2573: /* trailing byte not in input buffer */
2574: *outlen = out - outstart;
2575: *inlen = processed - instart;
2576: return(-3);
2577: }
2578: c = *in++;
2579: if ((c & 0xC0) != 0x80) {
2580: /* not a trailing byte */
2581: *outlen = out - outstart;
2582: *inlen = processed - instart;
2583: return(-2);
2584: }
2585: c = c & 0x3F;
2586: d = d & 0x1F;
2587: d = xlattable [48 + c + xlattable [d] * 64];
2588: if (d == 0) {
2589: /* not in character set */
2590: *outlen = out - outstart;
2591: *inlen = processed - instart;
2592: return(-2);
2593: }
2594: *out++ = d;
2595: } else if (d < 0xF0) {
2596: unsigned char c1;
2597: unsigned char c2;
2598: if (!(in < inend - 1)) {
2599: /* trailing bytes not in input buffer */
2600: *outlen = out - outstart;
2601: *inlen = processed - instart;
2602: return(-3);
2603: }
2604: c1 = *in++;
2605: if ((c1 & 0xC0) != 0x80) {
2606: /* not a trailing byte (c1) */
2607: *outlen = out - outstart;
2608: *inlen = processed - instart;
2609: return(-2);
2610: }
2611: c2 = *in++;
2612: if ((c2 & 0xC0) != 0x80) {
2613: /* not a trailing byte (c2) */
2614: *outlen = out - outstart;
2615: *inlen = processed - instart;
2616: return(-2);
2617: }
2618: c1 = c1 & 0x3F;
2619: c2 = c2 & 0x3F;
2620: d = d & 0x0F;
2621: d = xlattable [48 + c2 + xlattable [48 + c1 +
2622: xlattable [32 + d] * 64] * 64];
2623: if (d == 0) {
2624: /* not in character set */
2625: *outlen = out - outstart;
2626: *inlen = processed - instart;
2627: return(-2);
2628: }
2629: *out++ = d;
2630: } else {
2631: /* cannot transcode >= U+010000 */
2632: *outlen = out - outstart;
2633: *inlen = processed - instart;
2634: return(-2);
2635: }
2636: processed = in;
2637: }
2638: *outlen = out - outstart;
2639: *inlen = processed - instart;
2640: return(*outlen);
2641: }
2642:
2643: /**
2644: * ISO8859xToUTF8
2645: * @out: a pointer to an array of bytes to store the result
2646: * @outlen: the length of @out
2647: * @in: a pointer to an array of ISO Latin 1 chars
2648: * @inlen: the length of @in
2649: *
2650: * Take a block of ISO 8859-* chars in and try to convert it to an UTF-8
2651: * block of chars out.
2652: * Returns 0 if success, or -1 otherwise
2653: * The value of @inlen after return is the number of octets consumed
2654: * The value of @outlen after return is the number of ocetes produced.
2655: */
2656: static int
2657: ISO8859xToUTF8(unsigned char* out, int *outlen,
2658: const unsigned char* in, int *inlen,
2659: unsigned short const *unicodetable) {
2660: unsigned char* outstart = out;
2661: unsigned char* outend;
2662: const unsigned char* instart = in;
2663: const unsigned char* inend;
2664: const unsigned char* instop;
2665: unsigned int c;
2666:
2667: if ((out == NULL) || (outlen == NULL) || (inlen == NULL) ||
2668: (in == NULL) || (unicodetable == NULL))
2669: return(-1);
2670: outend = out + *outlen;
2671: inend = in + *inlen;
2672: instop = inend;
2673:
2674: while ((in < inend) && (out < outend - 2)) {
2675: if (*in >= 0x80) {
2676: c = unicodetable [*in - 0x80];
2677: if (c == 0) {
2678: /* undefined code point */
2679: *outlen = out - outstart;
2680: *inlen = in - instart;
2681: return (-1);
2682: }
2683: if (c < 0x800) {
2684: *out++ = ((c >> 6) & 0x1F) | 0xC0;
2685: *out++ = (c & 0x3F) | 0x80;
2686: } else {
2687: *out++ = ((c >> 12) & 0x0F) | 0xE0;
2688: *out++ = ((c >> 6) & 0x3F) | 0x80;
2689: *out++ = (c & 0x3F) | 0x80;
2690: }
2691: ++in;
2692: }
2693: if (instop - in > outend - out) instop = in + (outend - out);
2694: while ((*in < 0x80) && (in < instop)) {
2695: *out++ = *in++;
2696: }
2697: }
2698: if ((in < inend) && (out < outend) && (*in < 0x80)) {
2699: *out++ = *in++;
2700: }
2701: if ((in < inend) && (out < outend) && (*in < 0x80)) {
2702: *out++ = *in++;
2703: }
2704: *outlen = out - outstart;
2705: *inlen = in - instart;
2706: return (*outlen);
2707: }
2708:
2709:
2710: /************************************************************************
2711: * Lookup tables for ISO-8859-2..ISO-8859-16 transcoding *
2712: ************************************************************************/
2713:
2714: static unsigned short const xmlunicodetable_ISO8859_2 [128] = {
2715: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
2716: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
2717: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
2718: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
2719: 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7,
2720: 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b,
2721: 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7,
2722: 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c,
2723: 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7,
2724: 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e,
2725: 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7,
2726: 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
2727: 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7,
2728: 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
2729: 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7,
2730: 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9,
2731: };
2732:
2733: static unsigned char const xmltranscodetable_ISO8859_2 [48 + 6 * 64] = {
2734: "\x00\x00\x01\x05\x02\x04\x00\x00\x00\x00\x00\x03\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2738: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2739: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2740: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2741: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
2742: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
2743: "\xa0\x00\x00\x00\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\x00"
2744: "\xb0\x00\x00\x00\xb4\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00"
2745: "\x00\x00\xc3\xe3\xa1\xb1\xc6\xe6\x00\x00\x00\x00\xc8\xe8\xcf\xef"
2746: "\xd0\xf0\x00\x00\x00\x00\x00\x00\xca\xea\xcc\xec\x00\x00\x00\x00"
2747: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2748: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xe5\x00\x00\xa5\xb5\x00"
2749: "\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00"
2750: "\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\x00\xb2\x00\xbd\x00\x00"
2751: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2752: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2753: "\x00\xa3\xb3\xd1\xf1\x00\x00\xd2\xf2\x00\x00\x00\x00\x00\x00\x00"
2754: "\xd5\xf5\x00\x00\xc0\xe0\x00\x00\xd8\xf8\xa6\xb6\x00\x00\xaa\xba"
2755: "\xa9\xb9\xde\xfe\xab\xbb\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xf9"
2756: "\xdb\xfb\x00\x00\x00\x00\x00\x00\x00\xac\xbc\xaf\xbf\xae\xbe\x00"
2757: "\x00\xc1\xc2\x00\xc4\x00\x00\xc7\x00\xc9\x00\xcb\x00\xcd\xce\x00"
2758: "\x00\x00\x00\xd3\xd4\x00\xd6\xd7\x00\x00\xda\x00\xdc\xdd\x00\xdf"
2759: "\x00\xe1\xe2\x00\xe4\x00\x00\xe7\x00\xe9\x00\xeb\x00\xed\xee\x00"
2760: "\x00\x00\x00\xf3\xf4\x00\xf6\xf7\x00\x00\xfa\x00\xfc\xfd\x00\x00"
2761: };
2762:
2763: static unsigned short const xmlunicodetable_ISO8859_3 [128] = {
2764: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
2765: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
2766: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
2767: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
2768: 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7,
2769: 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b,
2770: 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7,
2771: 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c,
2772: 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7,
2773: 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
2774: 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7,
2775: 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df,
2776: 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7,
2777: 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
2778: 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7,
2779: 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9,
2780: };
2781:
2782: static unsigned char const xmltranscodetable_ISO8859_3 [48 + 7 * 64] = {
2783: "\x04\x00\x01\x06\x02\x05\x00\x00\x00\x00\x00\x03\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: "\x00\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: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
2791: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
2792: "\xa0\x00\x00\xa3\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\x00"
2793: "\xb0\x00\xb2\xb3\xb4\xb5\x00\xb7\xb8\x00\x00\x00\x00\xbd\x00\x00"
2794: "\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xe6\xc5\xe5\x00\x00\x00\x00"
2795: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xf8\xab\xbb"
2796: "\xd5\xf5\x00\x00\xa6\xb6\xa1\xb1\x00\x00\x00\x00\x00\x00\x00\x00"
2797: "\xa9\xb9\x00\x00\xac\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2798: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2799: "\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\x00\x00\x00\x00\x00\x00"
2800: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2801: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2802: "\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2803: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2804: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2805: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2806: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2807: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xfe\xaa\xba"
2808: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\xfd\x00\x00"
2809: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\xbf\x00\x00\x00"
2810: "\xc0\xc1\xc2\x00\xc4\x00\x00\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
2811: "\x00\xd1\xd2\xd3\xd4\x00\xd6\xd7\x00\xd9\xda\xdb\xdc\x00\x00\xdf"
2812: "\xe0\xe1\xe2\x00\xe4\x00\x00\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
2813: "\x00\xf1\xf2\xf3\xf4\x00\xf6\xf7\x00\xf9\xfa\xfb\xfc\x00\x00\x00"
2814: };
2815:
2816: static unsigned short const xmlunicodetable_ISO8859_4 [128] = {
2817: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
2818: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
2819: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
2820: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
2821: 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7,
2822: 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af,
2823: 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7,
2824: 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b,
2825: 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e,
2826: 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a,
2827: 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
2828: 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df,
2829: 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f,
2830: 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b,
2831: 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
2832: 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9,
2833: };
2834:
2835: static unsigned char const xmltranscodetable_ISO8859_4 [48 + 6 * 64] = {
2836: "\x00\x00\x01\x05\x02\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00"
2837: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2838: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2839: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2840: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
2844: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
2845: "\xa0\x00\x00\x00\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\xaf"
2846: "\xb0\x00\x00\x00\xb4\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00"
2847: "\xc0\xe0\x00\x00\xa1\xb1\x00\x00\x00\x00\x00\x00\xc8\xe8\x00\x00"
2848: "\xd0\xf0\xaa\xba\x00\x00\xcc\xec\xca\xea\x00\x00\x00\x00\x00\x00"
2849: "\x00\x00\xab\xbb\x00\x00\x00\x00\xa5\xb5\xcf\xef\x00\x00\xc7\xe7"
2850: "\x00\x00\x00\x00\x00\x00\xd3\xf3\xa2\x00\x00\xa6\xb6\x00\x00\x00"
2851: "\x00\x00\x00\x00\x00\xd1\xf1\x00\x00\x00\xbd\xbf\xd2\xf2\x00\x00"
2852: "\x00\x00\x00\x00\x00\x00\xa3\xb3\x00\x00\x00\x00\x00\x00\x00\x00"
2853: "\xa9\xb9\x00\x00\x00\x00\xac\xbc\xdd\xfd\xde\xfe\x00\x00\x00\x00"
2854: "\x00\x00\xd9\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\xbe\x00"
2855: "\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00"
2856: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\xb2\x00\x00\x00\x00"
2857: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2858: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2859: "\x00\xc1\xc2\xc3\xc4\xc5\xc6\x00\x00\xc9\x00\xcb\x00\xcd\xce\x00"
2860: "\x00\x00\x00\x00\xd4\xd5\xd6\xd7\xd8\x00\xda\xdb\xdc\x00\x00\xdf"
2861: "\x00\xe1\xe2\xe3\xe4\xe5\xe6\x00\x00\xe9\x00\xeb\x00\xed\xee\x00"
2862: "\x00\x00\x00\x00\xf4\xf5\xf6\xf7\xf8\x00\xfa\xfb\xfc\x00\x00\x00"
2863: };
2864:
2865: static unsigned short const xmlunicodetable_ISO8859_5 [128] = {
2866: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
2867: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
2868: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
2869: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
2870: 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
2871: 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f,
2872: 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
2873: 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
2874: 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
2875: 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
2876: 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
2877: 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
2878: 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
2879: 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
2880: 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
2881: 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f,
2882: };
2883:
2884: static unsigned char const xmltranscodetable_ISO8859_5 [48 + 6 * 64] = {
2885: "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2886: "\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2887: "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2888: "\x00\x00\x00\x00\x00\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: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
2893: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
2894: "\xa0\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\xad\x00\x00"
2895: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2896: "\x00\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\x00\xae\xaf"
2897: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
2898: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
2899: "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
2900: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
2901: "\x00\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\x00\xfe\xff"
2902: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2903: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2904: "\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2905: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2906: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2907: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2908: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2909: "\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2910: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2911: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2912: };
2913:
2914: static unsigned short const xmlunicodetable_ISO8859_6 [128] = {
2915: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
2916: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
2917: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
2918: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
2919: 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000,
2920: 0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000,
2921: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
2922: 0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f,
2923: 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
2924: 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f,
2925: 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
2926: 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
2927: 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647,
2928: 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f,
2929: 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
2930: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
2931: };
2932:
2933: static unsigned char const xmltranscodetable_ISO8859_6 [48 + 5 * 64] = {
2934: "\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2935: "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00"
2936: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2937: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2938: "\x00\x00\x00\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: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
2942: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
2943: "\xa0\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00"
2944: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2945: "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2946: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2947: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2948: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2949: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00"
2950: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\xbf"
2951: "\x00\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
2952: "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\x00\x00\x00\x00\x00"
2953: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
2954: "\xf0\xf1\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2955: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2956: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2957: };
2958:
2959: static unsigned short const xmlunicodetable_ISO8859_7 [128] = {
2960: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
2961: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
2962: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
2963: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
2964: 0x00a0, 0x2018, 0x2019, 0x00a3, 0x0000, 0x0000, 0x00a6, 0x00a7,
2965: 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015,
2966: 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7,
2967: 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f,
2968: 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
2969: 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
2970: 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
2971: 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
2972: 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
2973: 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
2974: 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7,
2975: 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000,
2976: };
2977:
2978: static unsigned char const xmltranscodetable_ISO8859_7 [48 + 7 * 64] = {
2979: "\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x06"
2980: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2981: "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2982: "\x00\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: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
2987: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
2988: "\xa0\x00\x00\xa3\x00\x00\xa6\xa7\xa8\xa9\x00\xab\xac\xad\x00\x00"
2989: "\xb0\xb1\xb2\xb3\x00\x00\x00\xb7\x00\x00\x00\xbb\x00\xbd\x00\x00"
2990: "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2995: "\x00\x00\x00\x00\x00\xaf\x00\x00\xa1\xa2\x00\x00\x00\x00\x00\x00"
2996: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2997: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2998: "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2999: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3000: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3001: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3002: "\x00\x00\x00\x00\xb4\xb5\xb6\x00\xb8\xb9\xba\x00\xbc\x00\xbe\xbf"
3003: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3004: "\xd0\xd1\x00\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
3005: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3006: "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\x00"
3007: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3008: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3009: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3010: };
3011:
3012: static unsigned short const xmlunicodetable_ISO8859_8 [128] = {
3013: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
3014: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
3015: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
3016: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
3017: 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
3018: 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
3019: 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
3020: 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000,
3021: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
3022: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
3023: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
3024: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017,
3025: 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7,
3026: 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df,
3027: 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7,
3028: 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000,
3029: };
3030:
3031: static unsigned char const xmltranscodetable_ISO8859_8 [48 + 7 * 64] = {
3032: "\x02\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3033: "\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00"
3034: "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3035: "\x00\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: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3040: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3041: "\xa0\x00\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\x00\xab\xac\xad\xae\xaf"
3042: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\x00\xbb\xbc\xbd\xbe\x00"
3043: "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3044: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3045: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3046: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3047: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3048: "\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00"
3049: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3050: "\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00"
3051: "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3052: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3053: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3054: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3055: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\xfe"
3056: "\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00"
3057: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3058: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3059: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3060: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3061: "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\x00\x00\x00\x00\x00"
3062: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3063: };
3064:
3065: static unsigned short const xmlunicodetable_ISO8859_9 [128] = {
3066: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
3067: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
3068: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
3069: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
3070: 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
3071: 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
3072: 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
3073: 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
3074: 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
3075: 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
3076: 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
3077: 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
3078: 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
3079: 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
3080: 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
3081: 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff,
3082: };
3083:
3084: static unsigned char const xmltranscodetable_ISO8859_9 [48 + 5 * 64] = {
3085: "\x00\x00\x01\x02\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3086: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3087: "\x00\x00\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\x00\x00"
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: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3093: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3094: "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
3095: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
3096: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3097: "\x00\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\x00\x00\xdf"
3098: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3099: "\x00\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\x00\x00\xff"
3100: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3101: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xf0"
3102: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3103: "\xdd\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3104: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3105: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xfe"
3106: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3107: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3108: };
3109:
3110: static unsigned short const xmlunicodetable_ISO8859_10 [128] = {
3111: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
3112: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
3113: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
3114: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
3115: 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7,
3116: 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a,
3117: 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7,
3118: 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b,
3119: 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e,
3120: 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf,
3121: 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168,
3122: 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
3123: 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f,
3124: 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef,
3125: 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169,
3126: 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138,
3127: };
3128:
3129: static unsigned char const xmltranscodetable_ISO8859_10 [48 + 7 * 64] = {
3130: "\x00\x00\x01\x06\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3131: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3132: "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3133: "\x00\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: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3138: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3139: "\xa0\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\xad\x00\x00"
3140: "\xb0\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00"
3141: "\xc0\xe0\x00\x00\xa1\xb1\x00\x00\x00\x00\x00\x00\xc8\xe8\x00\x00"
3142: "\xa9\xb9\xa2\xb2\x00\x00\xcc\xec\xca\xea\x00\x00\x00\x00\x00\x00"
3143: "\x00\x00\xa3\xb3\x00\x00\x00\x00\xa5\xb5\xa4\xb4\x00\x00\xc7\xe7"
3144: "\x00\x00\x00\x00\x00\x00\xa6\xb6\xff\x00\x00\xa8\xb8\x00\x00\x00"
3145: "\x00\x00\x00\x00\x00\xd1\xf1\x00\x00\x00\xaf\xbf\xd2\xf2\x00\x00"
3146: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3147: "\xaa\xba\x00\x00\x00\x00\xab\xbb\xd7\xf7\xae\xbe\x00\x00\x00\x00"
3148: "\x00\x00\xd9\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\xbc\x00"
3149: "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3150: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3151: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3152: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3153: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3154: "\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3155: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3156: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3157: "\x00\xc1\xc2\xc3\xc4\xc5\xc6\x00\x00\xc9\x00\xcb\x00\xcd\xce\xcf"
3158: "\xd0\x00\x00\xd3\xd4\xd5\xd6\x00\xd8\x00\xda\xdb\xdc\xdd\xde\xdf"
3159: "\x00\xe1\xe2\xe3\xe4\xe5\xe6\x00\x00\xe9\x00\xeb\x00\xed\xee\xef"
3160: "\xf0\x00\x00\xf3\xf4\xf5\xf6\x00\xf8\x00\xfa\xfb\xfc\xfd\xfe\x00"
3161: };
3162:
3163: static unsigned short const xmlunicodetable_ISO8859_11 [128] = {
3164: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
3165: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
3166: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
3167: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
3168: 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07,
3169: 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f,
3170: 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17,
3171: 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f,
3172: 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27,
3173: 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f,
3174: 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37,
3175: 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f,
3176: 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47,
3177: 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f,
3178: 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57,
3179: 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000,
3180: };
3181:
3182: static unsigned char const xmltranscodetable_ISO8859_11 [48 + 6 * 64] = {
3183: "\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3184: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3185: "\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3186: "\x00\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: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3191: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3192: "\xa0\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: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3195: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3196: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3197: "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x05\x00\x00\x00\x00\x00\x00"
3198: "\x00\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
3199: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
3200: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3201: "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\x00\x00\x00\x00\xdf"
3202: "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3203: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3204: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3205: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3206: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3207: "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\x00\x00\x00\x00"
3208: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3209: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3210: };
3211:
3212: static unsigned short const xmlunicodetable_ISO8859_13 [128] = {
3213: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
3214: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
3215: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
3216: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
3217: 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7,
3218: 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6,
3219: 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7,
3220: 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6,
3221: 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112,
3222: 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b,
3223: 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7,
3224: 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df,
3225: 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113,
3226: 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c,
3227: 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7,
3228: 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019,
3229: };
3230:
3231: static unsigned char const xmltranscodetable_ISO8859_13 [48 + 7 * 64] = {
3232: "\x00\x00\x01\x04\x06\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3233: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3234: "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3235: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3236: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3237: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3238: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3239: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3240: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3241: "\xa0\x00\xa2\xa3\xa4\x00\xa6\xa7\x00\xa9\x00\xab\xac\xad\xae\x00"
3242: "\xb0\xb1\xb2\xb3\x00\xb5\xb6\xb7\x00\xb9\x00\xbb\xbc\xbd\xbe\x00"
3243: "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3244: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3245: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3246: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3247: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3248: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\xb4\xa1\xa5\x00"
3249: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3250: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3251: "\x00\x00\x00\x00\xc4\xc5\xaf\x00\x00\xc9\x00\x00\x00\x00\x00\x00"
3252: "\x00\x00\x00\xd3\x00\xd5\xd6\xd7\xa8\x00\x00\x00\xdc\x00\x00\xdf"
3253: "\x00\x00\x00\x00\xe4\xe5\xbf\x00\x00\xe9\x00\x00\x00\x00\x00\x00"
3254: "\x00\x00\x00\xf3\x00\xf5\xf6\xf7\xb8\x00\x00\x00\xfc\x00\x00\x00"
3255: "\x00\xd9\xf9\xd1\xf1\xd2\xf2\x00\x00\x00\x00\x00\xd4\xf4\x00\x00"
3256: "\x00\x00\x00\x00\x00\x00\xaa\xba\x00\x00\xda\xfa\x00\x00\x00\x00"
3257: "\xd0\xf0\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xfb\x00\x00\x00\x00"
3258: "\x00\x00\xd8\xf8\x00\x00\x00\x00\x00\xca\xea\xdd\xfd\xde\xfe\x00"
3259: "\xc2\xe2\x00\x00\xc0\xe0\xc3\xe3\x00\x00\x00\x00\xc8\xe8\x00\x00"
3260: "\x00\x00\xc7\xe7\x00\x00\xcb\xeb\xc6\xe6\x00\x00\x00\x00\x00\x00"
3261: "\x00\x00\xcc\xec\x00\x00\x00\x00\x00\x00\xce\xee\x00\x00\xc1\xe1"
3262: "\x00\x00\x00\x00\x00\x00\xcd\xed\x00\x00\x00\xcf\xef\x00\x00\x00"
3263: };
3264:
3265: static unsigned short const xmlunicodetable_ISO8859_14 [128] = {
3266: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
3267: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
3268: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
3269: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
3270: 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7,
3271: 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178,
3272: 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56,
3273: 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61,
3274: 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
3275: 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
3276: 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a,
3277: 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df,
3278: 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
3279: 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
3280: 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b,
3281: 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff,
3282: };
3283:
3284: static unsigned char const xmltranscodetable_ISO8859_14 [48 + 10 * 64] = {
3285: "\x00\x00\x01\x09\x04\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3286: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3287: "\x00\x02\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\x00\x00\x00\x00\x00\x00"
3289: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3290: "\x00\x00\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: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3293: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3294: "\xa0\x00\x00\xa3\x00\x00\x00\xa7\x00\xa9\x00\x00\x00\xad\xae\x00"
3295: "\x00\x00\x00\x00\x00\x00\xb6\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\x00\x00\x00\x00\x00\x00\x03\x08\x05\x06\x00\x00\x00\x00"
3300: "\x00\x00\xa1\xa2\x00\x00\x00\x00\x00\x00\xa6\xab\x00\x00\x00\x00"
3301: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xb1"
3302: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3303: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3304: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\xa5\x00\x00\x00\x00"
3305: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3306: "\xb2\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3307: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3308: "\xa8\xb8\xaa\xba\xbd\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3309: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3310: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3311: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3312: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3313: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3314: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3315: "\x00\x00\xac\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3316: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3317: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3318: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3319: "\x00\x00\x00\x00\xd0\xf0\xde\xfe\xaf\x00\x00\x00\x00\x00\x00\x00"
3320: "\xb4\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3321: "\x00\x00\x00\x00\x00\x00\xb7\xb9\x00\x00\x00\x00\x00\x00\x00\x00"
3322: "\xbb\xbf\x00\x00\x00\x00\x00\x00\x00\x00\xd7\xf7\x00\x00\x00\x00"
3323: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3324: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3325: "\x00\xd1\xd2\xd3\xd4\xd5\xd6\x00\xd8\xd9\xda\xdb\xdc\xdd\x00\xdf"
3326: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3327: "\x00\xf1\xf2\xf3\xf4\xf5\xf6\x00\xf8\xf9\xfa\xfb\xfc\xfd\x00\xff"
3328: };
3329:
3330: static unsigned short const xmlunicodetable_ISO8859_15 [128] = {
3331: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
3332: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
3333: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
3334: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
3335: 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7,
3336: 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
3337: 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7,
3338: 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf,
3339: 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
3340: 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
3341: 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
3342: 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
3343: 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
3344: 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
3345: 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
3346: 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff,
3347: };
3348:
3349: static unsigned char const xmltranscodetable_ISO8859_15 [48 + 6 * 64] = {
3350: "\x00\x00\x01\x05\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3351: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3352: "\x00\x00\x02\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3355: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3356: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3357: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3358: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3359: "\xa0\xa1\xa2\xa3\x00\xa5\x00\xa7\x00\xa9\xaa\xab\xac\xad\xae\xaf"
3360: "\xb0\xb1\xb2\xb3\x00\xb5\xb6\xb7\x00\xb9\xba\xbb\x00\x00\x00\xbf"
3361: "\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3362: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3363: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3364: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3365: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3366: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3367: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00"
3368: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3369: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3370: "\x00\x00\xbc\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3371: "\xa6\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3372: "\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\xb4\xb8\x00"
3373: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3374: "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
3375: "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3376: "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
3377: };
3378:
3379: static unsigned short const xmlunicodetable_ISO8859_16 [128] = {
3380: 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
3381: 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
3382: 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
3383: 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
3384: 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7,
3385: 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b,
3386: 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7,
3387: 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c,
3388: 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7,
3389: 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
3390: 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a,
3391: 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df,
3392: 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7,
3393: 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
3394: 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b,
3395: 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff,
3396: };
3397:
3398: static unsigned char const xmltranscodetable_ISO8859_16 [48 + 9 * 64] = {
3399: "\x00\x00\x01\x08\x02\x03\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00"
3400: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3401: "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3402: "\x00\x00\x00\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: "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3407: "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3408: "\xa0\x00\x00\x00\x00\x00\x00\xa7\x00\xa9\x00\xab\x00\xad\x00\x00"
3409: "\xb0\xb1\x00\x00\x00\x00\xb6\xb7\x00\x00\x00\xbb\x00\x00\x00\x00"
3410: "\x00\x00\xc3\xe3\xa1\xa2\xc5\xe5\x00\x00\x00\x00\xb2\xb9\x00\x00"
3411: "\xd0\xf0\x00\x00\x00\x00\x00\x00\xdd\xfd\x00\x00\x00\x00\x00\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\xa3\xb3\xd1\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3415: "\xd5\xf5\xbc\xbd\x00\x00\x00\x00\x00\x00\xd7\xf7\x00\x00\x00\x00"
3416: "\xa6\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3417: "\xd8\xf8\x00\x00\x00\x00\x00\x00\xbe\xac\xae\xaf\xbf\xb4\xb8\x00"
3418: "\x06\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3419: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3420: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3421: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3422: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3423: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3424: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00"
3425: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3426: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3427: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\xa5\x00"
3428: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3429: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3430: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3431: "\x00\x00\x00\x00\x00\x00\x00\x00\xaa\xba\xde\xfe\x00\x00\x00\x00"
3432: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3433: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3434: "\xc0\xc1\xc2\x00\xc4\x00\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3435: "\x00\x00\xd2\xd3\xd4\x00\xd6\x00\x00\xd9\xda\xdb\xdc\x00\x00\xdf"
3436: "\xe0\xe1\xe2\x00\xe4\x00\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3437: "\x00\x00\xf2\xf3\xf4\x00\xf6\x00\x00\xf9\xfa\xfb\xfc\x00\x00\xff"
3438: };
3439:
3440:
3441: /*
3442: * auto-generated functions for ISO-8859-2 .. ISO-8859-16
3443: */
3444:
3445: static int ISO8859_2ToUTF8 (unsigned char* out, int *outlen,
3446: const unsigned char* in, int *inlen) {
3447: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_2);
3448: }
3449: static int UTF8ToISO8859_2 (unsigned char* out, int *outlen,
3450: const unsigned char* in, int *inlen) {
3451: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_2);
3452: }
3453:
3454: static int ISO8859_3ToUTF8 (unsigned char* out, int *outlen,
3455: const unsigned char* in, int *inlen) {
3456: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_3);
3457: }
3458: static int UTF8ToISO8859_3 (unsigned char* out, int *outlen,
3459: const unsigned char* in, int *inlen) {
3460: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_3);
3461: }
3462:
3463: static int ISO8859_4ToUTF8 (unsigned char* out, int *outlen,
3464: const unsigned char* in, int *inlen) {
3465: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_4);
3466: }
3467: static int UTF8ToISO8859_4 (unsigned char* out, int *outlen,
3468: const unsigned char* in, int *inlen) {
3469: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_4);
3470: }
3471:
3472: static int ISO8859_5ToUTF8 (unsigned char* out, int *outlen,
3473: const unsigned char* in, int *inlen) {
3474: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_5);
3475: }
3476: static int UTF8ToISO8859_5 (unsigned char* out, int *outlen,
3477: const unsigned char* in, int *inlen) {
3478: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_5);
3479: }
3480:
3481: static int ISO8859_6ToUTF8 (unsigned char* out, int *outlen,
3482: const unsigned char* in, int *inlen) {
3483: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_6);
3484: }
3485: static int UTF8ToISO8859_6 (unsigned char* out, int *outlen,
3486: const unsigned char* in, int *inlen) {
3487: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_6);
3488: }
3489:
3490: static int ISO8859_7ToUTF8 (unsigned char* out, int *outlen,
3491: const unsigned char* in, int *inlen) {
3492: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_7);
3493: }
3494: static int UTF8ToISO8859_7 (unsigned char* out, int *outlen,
3495: const unsigned char* in, int *inlen) {
3496: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_7);
3497: }
3498:
3499: static int ISO8859_8ToUTF8 (unsigned char* out, int *outlen,
3500: const unsigned char* in, int *inlen) {
3501: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_8);
3502: }
3503: static int UTF8ToISO8859_8 (unsigned char* out, int *outlen,
3504: const unsigned char* in, int *inlen) {
3505: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_8);
3506: }
3507:
3508: static int ISO8859_9ToUTF8 (unsigned char* out, int *outlen,
3509: const unsigned char* in, int *inlen) {
3510: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_9);
3511: }
3512: static int UTF8ToISO8859_9 (unsigned char* out, int *outlen,
3513: const unsigned char* in, int *inlen) {
3514: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_9);
3515: }
3516:
3517: static int ISO8859_10ToUTF8 (unsigned char* out, int *outlen,
3518: const unsigned char* in, int *inlen) {
3519: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_10);
3520: }
3521: static int UTF8ToISO8859_10 (unsigned char* out, int *outlen,
3522: const unsigned char* in, int *inlen) {
3523: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_10);
3524: }
3525:
3526: static int ISO8859_11ToUTF8 (unsigned char* out, int *outlen,
3527: const unsigned char* in, int *inlen) {
3528: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_11);
3529: }
3530: static int UTF8ToISO8859_11 (unsigned char* out, int *outlen,
3531: const unsigned char* in, int *inlen) {
3532: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_11);
3533: }
3534:
3535: static int ISO8859_13ToUTF8 (unsigned char* out, int *outlen,
3536: const unsigned char* in, int *inlen) {
3537: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_13);
3538: }
3539: static int UTF8ToISO8859_13 (unsigned char* out, int *outlen,
3540: const unsigned char* in, int *inlen) {
3541: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_13);
3542: }
3543:
3544: static int ISO8859_14ToUTF8 (unsigned char* out, int *outlen,
3545: const unsigned char* in, int *inlen) {
3546: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_14);
3547: }
3548: static int UTF8ToISO8859_14 (unsigned char* out, int *outlen,
3549: const unsigned char* in, int *inlen) {
3550: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_14);
3551: }
3552:
3553: static int ISO8859_15ToUTF8 (unsigned char* out, int *outlen,
3554: const unsigned char* in, int *inlen) {
3555: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_15);
3556: }
3557: static int UTF8ToISO8859_15 (unsigned char* out, int *outlen,
3558: const unsigned char* in, int *inlen) {
3559: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_15);
3560: }
3561:
3562: static int ISO8859_16ToUTF8 (unsigned char* out, int *outlen,
3563: const unsigned char* in, int *inlen) {
3564: return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_16);
3565: }
3566: static int UTF8ToISO8859_16 (unsigned char* out, int *outlen,
3567: const unsigned char* in, int *inlen) {
3568: return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_16);
3569: }
3570:
3571: static void
3572: xmlRegisterCharEncodingHandlersISO8859x (void) {
3573: xmlNewCharEncodingHandler ("ISO-8859-2", ISO8859_2ToUTF8, UTF8ToISO8859_2);
3574: xmlNewCharEncodingHandler ("ISO-8859-3", ISO8859_3ToUTF8, UTF8ToISO8859_3);
3575: xmlNewCharEncodingHandler ("ISO-8859-4", ISO8859_4ToUTF8, UTF8ToISO8859_4);
3576: xmlNewCharEncodingHandler ("ISO-8859-5", ISO8859_5ToUTF8, UTF8ToISO8859_5);
3577: xmlNewCharEncodingHandler ("ISO-8859-6", ISO8859_6ToUTF8, UTF8ToISO8859_6);
3578: xmlNewCharEncodingHandler ("ISO-8859-7", ISO8859_7ToUTF8, UTF8ToISO8859_7);
3579: xmlNewCharEncodingHandler ("ISO-8859-8", ISO8859_8ToUTF8, UTF8ToISO8859_8);
3580: xmlNewCharEncodingHandler ("ISO-8859-9", ISO8859_9ToUTF8, UTF8ToISO8859_9);
3581: xmlNewCharEncodingHandler ("ISO-8859-10", ISO8859_10ToUTF8, UTF8ToISO8859_10);
3582: xmlNewCharEncodingHandler ("ISO-8859-11", ISO8859_11ToUTF8, UTF8ToISO8859_11);
3583: xmlNewCharEncodingHandler ("ISO-8859-13", ISO8859_13ToUTF8, UTF8ToISO8859_13);
3584: xmlNewCharEncodingHandler ("ISO-8859-14", ISO8859_14ToUTF8, UTF8ToISO8859_14);
3585: xmlNewCharEncodingHandler ("ISO-8859-15", ISO8859_15ToUTF8, UTF8ToISO8859_15);
3586: xmlNewCharEncodingHandler ("ISO-8859-16", ISO8859_16ToUTF8, UTF8ToISO8859_16);
3587: }
3588:
3589: #endif
3590: #endif
3591:
3592: #define bottom_encoding
3593: #include "elfgcchack.h"
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>