aboutsummaryrefslogtreecommitdiffstats
path: root/encoding.c
diff options
context:
space:
mode:
authorDaniel Veillard <veillard@src.gnome.org>2003-08-14 12:19:54 +0000
committerDaniel Veillard <veillard@src.gnome.org>2003-08-14 12:19:54 +0000
commitab1ae3a7685fb7891ef8f6540a0612170300b151 (patch)
treed5d0c5e6ac02b1c0a962e695605008740f465d51 /encoding.c
parentccf996fca0d0a22d56b8fdd63551dd14ebeb360f (diff)
downloadandroid_external_libxml2-ab1ae3a7685fb7891ef8f6540a0612170300b151.tar.gz
android_external_libxml2-ab1ae3a7685fb7891ef8f6540a0612170300b151.tar.bz2
android_external_libxml2-ab1ae3a7685fb7891ef8f6540a0612170300b151.zip
applied UTF-16 encoding handling patch provided by Mark Itzcovitz more
* encoding.c: applied UTF-16 encoding handling patch provided by Mark Itzcovitz * encoding.c parser.c: more cleanup and fixes for UTF-16 when not having iconv support. Daniel
Diffstat (limited to 'encoding.c')
-rw-r--r--encoding.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/encoding.c b/encoding.c
index e79a5f95..2d3ccd0f 100644
--- a/encoding.c
+++ b/encoding.c
@@ -875,6 +875,7 @@ UTF8ToUTF16LE(unsigned char* outb, int *outlen,
{
unsigned short* out = (unsigned short*) outb;
const unsigned char* processed = in;
+ const unsigned char *const instart = in;
unsigned short* outstart= out;
unsigned short* outend;
const unsigned char* inend= in+*inlen;
@@ -909,7 +910,7 @@ UTF8ToUTF16LE(unsigned char* outb, int *outlen,
else if (d < 0xC0) {
/* trailing byte in leading position */
*outlen = (out - outstart) * 2;
- *inlen = processed - in;
+ *inlen = processed - instart;
return(-2);
} else if (d < 0xE0) { c= d & 0x1F; trailing= 1; }
else if (d < 0xF0) { c= d & 0x0F; trailing= 2; }
@@ -917,7 +918,7 @@ UTF8ToUTF16LE(unsigned char* outb, int *outlen,
else {
/* no chance for this in UTF-16 */
*outlen = (out - outstart) * 2;
- *inlen = processed - in;
+ *inlen = processed - instart;
return(-2);
}
@@ -971,7 +972,7 @@ UTF8ToUTF16LE(unsigned char* outb, int *outlen,
processed = in;
}
*outlen = (out - outstart) * 2;
- *inlen = processed - in;
+ *inlen = processed - instart;
return(0);
}
@@ -1086,6 +1087,7 @@ UTF8ToUTF16BE(unsigned char* outb, int *outlen,
{
unsigned short* out = (unsigned short*) outb;
const unsigned char* processed = in;
+ const unsigned char *const instart = in;
unsigned short* outstart= out;
unsigned short* outend;
const unsigned char* inend= in+*inlen;
@@ -1120,7 +1122,7 @@ UTF8ToUTF16BE(unsigned char* outb, int *outlen,
else if (d < 0xC0) {
/* trailing byte in leading position */
*outlen = out - outstart;
- *inlen = processed - in;
+ *inlen = processed - instart;
return(-2);
} else if (d < 0xE0) { c= d & 0x1F; trailing= 1; }
else if (d < 0xF0) { c= d & 0x0F; trailing= 2; }
@@ -1128,7 +1130,7 @@ UTF8ToUTF16BE(unsigned char* outb, int *outlen,
else {
/* no chance for this in UTF-16 */
*outlen = out - outstart;
- *inlen = processed - in;
+ *inlen = processed - instart;
return(-2);
}
@@ -1179,7 +1181,7 @@ UTF8ToUTF16BE(unsigned char* outb, int *outlen,
processed = in;
}
*outlen = (out - outstart) * 2;
- *inlen = processed - in;
+ *inlen = processed - instart;
return(0);
}
@@ -1962,6 +1964,14 @@ xmlFindCharEncodingHandler(const char *name) {
}
}
+ /*
+ * If nothing was found and it is "UTF-16" then use the Little indian
+ * version.
+ */
+ if ((xmlStrEqual(BAD_CAST upper, BAD_CAST "UTF-16")) ||
+ (xmlStrEqual(BAD_CAST upper, BAD_CAST "UTF16")))
+ return(xmlUTF16LEHandler);
+
return(NULL);
}