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