Index: third_party/libxml/patches/icu |
diff --git a/third_party/libxml/patches/icu b/third_party/libxml/patches/icu |
deleted file mode 100644 |
index 4503f922fcb32ede3fab33aa7d508253e87cdb28..0000000000000000000000000000000000000000 |
--- a/third_party/libxml/patches/icu |
+++ /dev/null |
@@ -1,453 +0,0 @@ |
-Add code support for ICU. |
- |
-diff --git a/third_party/libxml/encoding.c b/third_party/libxml/encoding.c |
-index b86a547..0f41df9 100644 |
---- a/third_party/libxml/encoding.c |
-+++ b/third_party/libxml/encoding.c |
-@@ -58,7 +58,7 @@ static xmlCharEncodingAliasPtr xmlCharEncodingAliases = NULL; |
- static int xmlCharEncodingAliasesNb = 0; |
- static int xmlCharEncodingAliasesMax = 0; |
- |
--#ifdef LIBXML_ICONV_ENABLED |
-+#if defined(LIBXML_ICONV_ENABLED) || defined(LIBXML_ICU_ENABLED) |
- #if 0 |
- #define DEBUG_ENCODING /* Define this to get encoding traces */ |
- #endif |
-@@ -97,6 +97,54 @@ xmlEncodingErr(xmlParserErrors error, const char *msg, const char *val) |
- NULL, 0, val, NULL, NULL, 0, 0, msg, val); |
- } |
- |
-+#ifdef LIBXML_ICU_ENABLED |
-+static uconv_t* |
-+openIcuConverter(const char* name, int toUnicode) |
-+{ |
-+ UErrorCode status = U_ZERO_ERROR; |
-+ uconv_t *conv = (uconv_t *) xmlMalloc(sizeof(uconv_t)); |
-+ if (conv == NULL) |
-+ return NULL; |
-+ |
-+ conv->uconv = ucnv_open(name, &status); |
-+ if (U_FAILURE(status)) |
-+ goto error; |
-+ |
-+ status = U_ZERO_ERROR; |
-+ if (toUnicode) { |
-+ ucnv_setToUCallBack(conv->uconv, UCNV_TO_U_CALLBACK_STOP, |
-+ NULL, NULL, NULL, &status); |
-+ } |
-+ else { |
-+ ucnv_setFromUCallBack(conv->uconv, UCNV_FROM_U_CALLBACK_STOP, |
-+ NULL, NULL, NULL, &status); |
-+ } |
-+ if (U_FAILURE(status)) |
-+ goto error; |
-+ |
-+ status = U_ZERO_ERROR; |
-+ conv->utf8 = ucnv_open("UTF-8", &status); |
-+ if (U_SUCCESS(status)) |
-+ return conv; |
-+ |
-+error: |
-+ if (conv->uconv) |
-+ ucnv_close(conv->uconv); |
-+ xmlFree(conv); |
-+ return NULL; |
-+} |
-+ |
-+static void |
-+closeIcuConverter(uconv_t *conv) |
-+{ |
-+ if (conv != NULL) { |
-+ ucnv_close(conv->uconv); |
-+ ucnv_close(conv->utf8); |
-+ xmlFree(conv); |
-+ } |
-+} |
-+#endif /* LIBXML_ICU_ENABLED */ |
-+ |
- /************************************************************************ |
- * * |
- * Conversions To/From UTF8 encoding * |
-@@ -1306,7 +1354,11 @@ xmlNewCharEncodingHandler(const char *name, |
- #ifdef LIBXML_ICONV_ENABLED |
- handler->iconv_in = NULL; |
- handler->iconv_out = NULL; |
--#endif /* LIBXML_ICONV_ENABLED */ |
-+#endif |
-+#ifdef LIBXML_ICU_ENABLED |
-+ handler->uconv_in = NULL; |
-+ handler->uconv_out = NULL; |
-+#endif |
- |
- /* |
- * registers and returns the handler. |
-@@ -1371,7 +1423,7 @@ xmlInitCharEncodingHandlers(void) { |
- xmlNewCharEncodingHandler("ASCII", asciiToUTF8, NULL); |
- xmlNewCharEncodingHandler("US-ASCII", asciiToUTF8, NULL); |
- #endif /* LIBXML_OUTPUT_ENABLED */ |
--#ifndef LIBXML_ICONV_ENABLED |
-+#if !defined(LIBXML_ICONV_ENABLED) && !defined(LIBXML_ICU_ENABLED) |
- #ifdef LIBXML_ISO8859X_ENABLED |
- xmlRegisterCharEncodingHandlersISO8859x (); |
- #endif |
-@@ -1578,6 +1630,10 @@ xmlFindCharEncodingHandler(const char *name) { |
- xmlCharEncodingHandlerPtr enc; |
- iconv_t icv_in, icv_out; |
- #endif /* LIBXML_ICONV_ENABLED */ |
-+#ifdef LIBXML_ICU_ENABLED |
-+ xmlCharEncodingHandlerPtr enc; |
-+ uconv_t *ucv_in, *ucv_out; |
-+#endif /* LIBXML_ICU_ENABLED */ |
- char upper[100]; |
- int i; |
- |
-@@ -1647,6 +1703,35 @@ xmlFindCharEncodingHandler(const char *name) { |
- "iconv : problems with filters for '%s'\n", name); |
- } |
- #endif /* LIBXML_ICONV_ENABLED */ |
-+#ifdef LIBXML_ICU_ENABLED |
-+ /* check whether icu can handle this */ |
-+ ucv_in = openIcuConverter(name, 1); |
-+ ucv_out = openIcuConverter(name, 0); |
-+ if (ucv_in != NULL && ucv_out != NULL) { |
-+ enc = (xmlCharEncodingHandlerPtr) |
-+ xmlMalloc(sizeof(xmlCharEncodingHandler)); |
-+ if (enc == NULL) { |
-+ closeIcuConverter(ucv_in); |
-+ closeIcuConverter(ucv_out); |
-+ return(NULL); |
-+ } |
-+ enc->name = xmlMemStrdup(name); |
-+ enc->input = NULL; |
-+ enc->output = NULL; |
-+ enc->uconv_in = ucv_in; |
-+ enc->uconv_out = ucv_out; |
-+#ifdef DEBUG_ENCODING |
-+ xmlGenericError(xmlGenericErrorContext, |
-+ "Found ICU converter handler for encoding %s\n", name); |
-+#endif |
-+ return enc; |
-+ } else if (ucv_in != NULL || ucv_out != NULL) { |
-+ closeIcuConverter(ucv_in); |
-+ closeIcuConverter(ucv_out); |
-+ xmlEncodingErr(XML_ERR_INTERNAL_ERROR, |
-+ "ICU converter : problems with filters for '%s'\n", name); |
-+ } |
-+#endif /* LIBXML_ICU_ENABLED */ |
- |
- #ifdef DEBUG_ENCODING |
- xmlGenericError(xmlGenericErrorContext, |
-@@ -1737,6 +1822,75 @@ xmlIconvWrapper(iconv_t cd, unsigned char *out, int *outlen, |
- |
- /************************************************************************ |
- * * |
-+ * ICU based generic conversion functions * |
-+ * * |
-+ ************************************************************************/ |
-+ |
-+#ifdef LIBXML_ICU_ENABLED |
-+/** |
-+ * xmlUconvWrapper: |
-+ * @cd: ICU uconverter data structure |
-+ * @toUnicode : non-zero if toUnicode. 0 otherwise. |
-+ * @out: a pointer to an array of bytes to store the result |
-+ * @outlen: the length of @out |
-+ * @in: a pointer to an array of ISO Latin 1 chars |
-+ * @inlen: the length of @in |
-+ * |
-+ * Returns 0 if success, or |
-+ * -1 by lack of space, or |
-+ * -2 if the transcoding fails (for *in is not valid utf8 string or |
-+ * the result of transformation can't fit into the encoding we want), or |
-+ * -3 if there the last byte can't form a single output char. |
-+ * |
-+ * The value of @inlen after return is the number of octets consumed |
-+ * as the return value is positive, else unpredictable. |
-+ * The value of @outlen after return is the number of ocetes consumed. |
-+ */ |
-+static int |
-+xmlUconvWrapper(uconv_t *cd, int toUnicode, unsigned char *out, int *outlen, |
-+ const unsigned char *in, int *inlen) { |
-+ const char *ucv_in = (const char *) in; |
-+ char *ucv_out = (char *) out; |
-+ UErrorCode err = U_ZERO_ERROR; |
-+ |
-+ if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) { |
-+ if (outlen != NULL) *outlen = 0; |
-+ return(-1); |
-+ } |
-+ |
-+ /* |
-+ * TODO(jungshik) |
-+ * 1. is ucnv_convert(To|From)Algorithmic better? |
-+ * 2. had we better use an explicit pivot buffer? |
-+ * 3. error returned comes from 'fromUnicode' only even |
-+ * when toUnicode is true ! |
-+ */ |
-+ if (toUnicode) { |
-+ /* encoding => UTF-16 => UTF-8 */ |
-+ ucnv_convertEx(cd->utf8, cd->uconv, &ucv_out, ucv_out + *outlen, |
-+ &ucv_in, ucv_in + *inlen, NULL, NULL, NULL, NULL, |
-+ 0, TRUE, &err); |
-+ } else { |
-+ /* UTF-8 => UTF-16 => encoding */ |
-+ ucnv_convertEx(cd->uconv, cd->utf8, &ucv_out, ucv_out + *outlen, |
-+ &ucv_in, ucv_in + *inlen, NULL, NULL, NULL, NULL, |
-+ 0, TRUE, &err); |
-+ } |
-+ *inlen = ucv_in - (const char*) in; |
-+ *outlen = ucv_out - (char *) out; |
-+ if (U_SUCCESS(err)) |
-+ return 0; |
-+ if (err == U_BUFFER_OVERFLOW_ERROR) |
-+ return -1; |
-+ if (err == U_INVALID_CHAR_FOUND || err == U_ILLEGAL_CHAR_FOUND) |
-+ return -2; |
-+ /* if (err == U_TRUNCATED_CHAR_FOUND) */ |
-+ return -3; |
-+} |
-+#endif /* LIBXML_ICU_ENABLED */ |
-+ |
-+/************************************************************************ |
-+ * * |
- * The real API used by libxml for on-the-fly conversion * |
- * * |
- ************************************************************************/ |
-@@ -1810,6 +1964,16 @@ xmlCharEncFirstLineInt(xmlCharEncodingHandler *handler, xmlBufferPtr out, |
- if (ret == -1) ret = -3; |
- } |
- #endif /* LIBXML_ICONV_ENABLED */ |
-+#ifdef LIBXML_ICU_ENABLED |
-+ else if (handler->uconv_in != NULL) { |
-+ ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use], |
-+ &written, in->content, &toconv); |
-+ xmlBufferShrink(in, toconv); |
-+ out->use += written; |
-+ out->content[out->use] = 0; |
-+ if (ret == -1) ret = -3; |
-+ } |
-+#endif /* LIBXML_ICU_ENABLED */ |
- #ifdef DEBUG_ENCODING |
- switch (ret) { |
- case 0: |
-@@ -1915,6 +2079,17 @@ xmlCharEncInFunc(xmlCharEncodingHandler * handler, xmlBufferPtr out, |
- ret = -3; |
- } |
- #endif /* LIBXML_ICONV_ENABLED */ |
-+#ifdef LIBXML_ICU_ENABLED |
-+ else if (handler->uconv_in != NULL) { |
-+ ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use], |
-+ &written, in->content, &toconv); |
-+ xmlBufferShrink(in, toconv); |
-+ out->use += written; |
-+ out->content[out->use] = 0; |
-+ if (ret == -1) |
-+ ret = -3; |
-+ } |
-+#endif /* LIBXML_ICU_ENABLED */ |
- switch (ret) { |
- case 0: |
- #ifdef DEBUG_ENCODING |
-@@ -2015,6 +2190,15 @@ retry: |
- out->content[out->use] = 0; |
- } |
- #endif /* LIBXML_ICONV_ENABLED */ |
-+#ifdef LIBXML_ICU_ENABLED |
-+ else if (handler->uconv_out != NULL) { |
-+ ret = xmlUconvWrapper(handler->uconv_out, 0, |
-+ &out->content[out->use], |
-+ &written, NULL, &toconv); |
-+ out->use += written; |
-+ out->content[out->use] = 0; |
-+ } |
-+#endif /* LIBXML_ICU_ENABLED */ |
- #ifdef DEBUG_ENCODING |
- xmlGenericError(xmlGenericErrorContext, |
- "initialized encoder\n"); |
-@@ -2061,6 +2245,26 @@ retry: |
- } |
- } |
- #endif /* LIBXML_ICONV_ENABLED */ |
-+#ifdef LIBXML_ICU_ENABLED |
-+ else if (handler->uconv_out != NULL) { |
-+ ret = xmlUconvWrapper(handler->uconv_out, 0, |
-+ &out->content[out->use], |
-+ &written, in->content, &toconv); |
-+ xmlBufferShrink(in, toconv); |
-+ out->use += written; |
-+ writtentot += written; |
-+ out->content[out->use] = 0; |
-+ if (ret == -1) { |
-+ if (written > 0) { |
-+ /* |
-+ * Can be a limitation of iconv |
-+ */ |
-+ goto retry; |
-+ } |
-+ ret = -3; |
-+ } |
-+ } |
-+#endif /* LIBXML_ICU_ENABLED */ |
- else { |
- xmlEncodingErr(XML_I18N_NO_OUTPUT, |
- "xmlCharEncOutFunc: no output function !\n", NULL); |
-@@ -2173,6 +2377,22 @@ xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) { |
- xmlFree(handler); |
- } |
- #endif /* LIBXML_ICONV_ENABLED */ |
-+#ifdef LIBXML_ICU_ENABLED |
-+ if ((handler->uconv_out != NULL) || (handler->uconv_in != NULL)) { |
-+ if (handler->name != NULL) |
-+ xmlFree(handler->name); |
-+ handler->name = NULL; |
-+ if (handler->uconv_out != NULL) { |
-+ closeIcuConverter(handler->uconv_out); |
-+ handler->uconv_out = NULL; |
-+ } |
-+ if (handler->uconv_in != NULL) { |
-+ closeIcuConverter(handler->uconv_in); |
-+ handler->uconv_in = NULL; |
-+ } |
-+ xmlFree(handler); |
-+ } |
-+#endif |
- #ifdef DEBUG_ENCODING |
- if (ret) |
- xmlGenericError(xmlGenericErrorContext, |
-@@ -2248,6 +2468,22 @@ xmlByteConsumed(xmlParserCtxtPtr ctxt) { |
- cur += toconv; |
- } while (ret == -2); |
- #endif |
-+#ifdef LIBXML_ICU_ENABLED |
-+ } else if (handler->uconv_out != NULL) { |
-+ do { |
-+ toconv = in->end - cur; |
-+ written = 32000; |
-+ ret = xmlUconvWrapper(handler->uconv_out, 0, &convbuf[0], |
-+ &written, cur, &toconv); |
-+ if (ret < 0) { |
-+ if (written > 0) |
-+ ret = -2; |
-+ else |
-+ return(-1); |
-+ } |
-+ unused += written; |
-+ cur += toconv; |
-+ } while (ret == -2); |
- } else { |
- /* could not find a converter */ |
- return(-1); |
-@@ -2259,8 +2495,9 @@ xmlByteConsumed(xmlParserCtxtPtr ctxt) { |
- } |
- return(in->consumed + (in->cur - in->base)); |
- } |
-+#endif |
- |
--#ifndef LIBXML_ICONV_ENABLED |
-+#if !defined(LIBXML_ICONV_ENABLED) && !defined(LIBXML_ICU_ENABLED) |
- #ifdef LIBXML_ISO8859X_ENABLED |
- |
- /** |
-diff --git a/third_party/libxml/include/libxml/encoding.h b/third_party/libxml/include/libxml/encoding.h |
-index c74b25f..b5f8b48 100644 |
---- a/third_party/libxml/include/libxml/encoding.h |
-+++ b/third_party/libxml/include/libxml/encoding.h |
-@@ -26,6 +26,24 @@ |
- |
- #ifdef LIBXML_ICONV_ENABLED |
- #include <iconv.h> |
-+#else |
-+#ifdef LIBXML_ICU_ENABLED |
-+#include <unicode/ucnv.h> |
-+#if 0 |
-+/* Forward-declare UConverter here rather than pulling in <unicode/ucnv.h> |
-+ * to prevent unwanted ICU symbols being exposed to users of libxml2. |
-+ * One particular case is Qt4 conflicting on UChar32. |
-+ */ |
-+#include <stdint.h> |
-+struct UConverter; |
-+typedef struct UConverter UConverter; |
-+#ifdef _MSC_VER |
-+typedef wchar_t UChar; |
-+#else |
-+typedef uint16_t UChar; |
-+#endif |
-+#endif |
-+#endif |
- #endif |
- #ifdef __cplusplus |
- extern "C" { |
-@@ -125,6 +143,13 @@ typedef int (* xmlCharEncodingOutputFunc)(unsigned char *out, int *outlen, |
- * Block defining the handlers for non UTF-8 encodings. |
- * If iconv is supported, there are two extra fields. |
- */ |
-+#ifdef LIBXML_ICU_ENABLED |
-+struct _uconv_t { |
-+ UConverter *uconv; /* for conversion between an encoding and UTF-16 */ |
-+ UConverter *utf8; /* for conversion between UTF-8 and UTF-16 */ |
-+}; |
-+typedef struct _uconv_t uconv_t; |
-+#endif |
- |
- typedef struct _xmlCharEncodingHandler xmlCharEncodingHandler; |
- typedef xmlCharEncodingHandler *xmlCharEncodingHandlerPtr; |
-@@ -136,6 +161,10 @@ struct _xmlCharEncodingHandler { |
- iconv_t iconv_in; |
- iconv_t iconv_out; |
- #endif /* LIBXML_ICONV_ENABLED */ |
-+#ifdef LIBXML_ICU_ENABLED |
-+ uconv_t *uconv_in; |
-+ uconv_t *uconv_out; |
-+#endif /* LIBXML_ICU_ENABLED */ |
- }; |
- |
- #ifdef __cplusplus |
-diff --git a/third_party/libxml/include/libxml/parser.h b/third_party/libxml/include/libxml/parser.h |
-index dd79c42..3580b63 100644 |
---- a/third_party/libxml/include/libxml/parser.h |
-+++ b/third_party/libxml/include/libxml/parser.h |
-@@ -1222,6 +1222,7 @@ typedef enum { |
- XML_WITH_DEBUG_MEM = 29, |
- XML_WITH_DEBUG_RUN = 30, |
- XML_WITH_ZLIB = 31, |
-+ XML_WITH_ICU = 32, |
- XML_WITH_NONE = 99999 /* just to be sure of allocation size */ |
- } xmlFeature; |
- |
-diff --git a/third_party/libxml/include/libxml/xmlversion.h.in b/third_party/libxml/include/libxml/xmlversion.h.in |
-index 4739f3a..de310ab 100644 |
---- a/third_party/libxml/include/libxml/xmlversion.h.in |
-+++ b/third_party/libxml/include/libxml/xmlversion.h.in |
-@@ -269,6 +269,15 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(int version); |
- #endif |
- |
- /** |
-+ * LIBXML_ICU_ENABLED: |
-+ * |
-+ * Whether icu support is available |
-+ */ |
-+#if @WITH_ICU@ |
-+#define LIBXML_ICU_ENABLED |
-+#endif |
-+ |
-+/** |
- * LIBXML_ISO8859X_ENABLED: |
- * |
- * Whether ISO-8859-* support is made available in case iconv is not |
-diff --git a/third_party/libxml/parser.c b/third_party/libxml/parser.c |
-index 85e7599..3ba2a06 100644 |
---- a/third_party/libxml/parser.c |
-+++ b/third_party/libxml/parser.c |
-@@ -954,6 +954,12 @@ xmlHasFeature(xmlFeature feature) |
- #else |
- return(0); |
- #endif |
-+ case XML_WITH_ICU: |
-+#ifdef LIBXML_ICU_ENABLED |
-+ return(1); |
-+#else |
-+ return(0); |
-+#endif |
- default: |
- break; |
- } |