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