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