Index: third_party/libxslt/libxslt/xsltlocale.c |
diff --git a/third_party/libxslt/libxslt/xsltlocale.c b/third_party/libxslt/libxslt/xsltlocale.c |
deleted file mode 100644 |
index b5fe98632bab15183322405b988771cbdf96072a..0000000000000000000000000000000000000000 |
--- a/third_party/libxslt/libxslt/xsltlocale.c |
+++ /dev/null |
@@ -1,525 +0,0 @@ |
-/* |
- * xsltlocale.c: locale handling |
- * |
- * Reference: |
- * RFC 3066: Tags for the Identification of Languages |
- * http://www.ietf.org/rfc/rfc3066.txt |
- * ISO 639-1, ISO 3166-1 |
- * |
- * Author: Nick Wellnhofer |
- * winapi port: Roumen Petrov |
- */ |
- |
-#define IN_LIBXSLT |
-#include "libxslt.h" |
- |
-#include <string.h> |
-#include <libxml/xmlmemory.h> |
- |
-#include "xsltlocale.h" |
-#include "xsltutils.h" |
- |
-#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ <= 2 |
-#define newlocale __newlocale |
-#define freelocale __freelocale |
-#define strxfrm_l __strxfrm_l |
-#define LC_COLLATE_MASK (1 << LC_COLLATE) |
-#endif |
- |
-#define TOUPPER(c) (c & ~0x20) |
-#define TOLOWER(c) (c | 0x20) |
-#define ISALPHA(c) ((unsigned)(TOUPPER(c) - 'A') < 26) |
- |
-/*without terminating null character*/ |
-#define XSLTMAX_ISO639LANGLEN 8 |
-#define XSLTMAX_ISO3166CNTRYLEN 8 |
- /* <lang>-<cntry> */ |
-#define XSLTMAX_LANGTAGLEN (XSLTMAX_ISO639LANGLEN+1+XSLTMAX_ISO3166CNTRYLEN) |
- |
-static const xmlChar* xsltDefaultRegion(const xmlChar *localeName); |
- |
-#ifdef XSLT_LOCALE_WINAPI |
-xmlRMutexPtr xsltLocaleMutex = NULL; |
- |
-struct xsltRFC1766Info_s { |
- /*note typedef unsigned char xmlChar !*/ |
- xmlChar tag[XSLTMAX_LANGTAGLEN+1]; |
- /*note typedef LCID xsltLocale !*/ |
- xsltLocale lcid; |
-}; |
-typedef struct xsltRFC1766Info_s xsltRFC1766Info; |
- |
-static int xsltLocaleListSize = 0; |
-static xsltRFC1766Info *xsltLocaleList = NULL; |
- |
- |
-static xsltLocale |
-xslt_locale_WINAPI(const xmlChar *languageTag) { |
- int k; |
- xsltRFC1766Info *p = xsltLocaleList; |
- |
- for (k=0; k<xsltLocaleListSize; k++, p++) |
- if (xmlStrcmp(p->tag, languageTag) == 0) return p->lcid; |
- return((xsltLocale)0); |
-} |
- |
-static void xsltEnumSupportedLocales(void); |
-#endif |
- |
-/** |
- * xsltFreeLocales: |
- * |
- * Cleanup function for the locale support on shutdown |
- */ |
-void |
-xsltFreeLocales(void) { |
-#ifdef XSLT_LOCALE_WINAPI |
- xmlRMutexLock(xsltLocaleMutex); |
- xmlFree(xsltLocaleList); |
- xsltLocaleList = NULL; |
- xmlRMutexUnlock(xsltLocaleMutex); |
-#endif |
-} |
- |
-/** |
- * xsltNewLocale: |
- * @languageTag: RFC 3066 language tag |
- * |
- * Creates a new locale of an opaque system dependent type based on the |
- * language tag. |
- * |
- * Returns the locale or NULL on error or if no matching locale was found |
- */ |
-xsltLocale |
-xsltNewLocale(const xmlChar *languageTag) { |
-#ifdef XSLT_LOCALE_XLOCALE |
- xsltLocale locale; |
- char localeName[XSLTMAX_LANGTAGLEN+6]; /* 6 chars for ".utf8\0" */ |
- const xmlChar *p = languageTag; |
- const char *region = NULL; |
- char *q = localeName; |
- int i, llen; |
- |
- /* Convert something like "pt-br" to "pt_BR.utf8" */ |
- |
- if (languageTag == NULL) |
- return(NULL); |
- |
- for (i=0; i<XSLTMAX_ISO639LANGLEN && ISALPHA(*p); ++i) |
- *q++ = TOLOWER(*p++); |
- |
- if (i == 0) |
- return(NULL); |
- |
- llen = i; |
- |
- if (*p) { |
- if (*p++ != '-') |
- return(NULL); |
- *q++ = '_'; |
- |
- for (i=0; i<XSLTMAX_ISO3166CNTRYLEN && ISALPHA(*p); ++i) |
- *q++ = TOUPPER(*p++); |
- |
- if (i == 0 || *p) |
- return(NULL); |
- |
- memcpy(q, ".utf8", 6); |
- locale = newlocale(LC_COLLATE_MASK, localeName, NULL); |
- if (locale != NULL) |
- return(locale); |
- |
- /* Continue without using country code */ |
- |
- q = localeName + llen; |
- } |
- |
- /* Try locale without territory, e.g. for Esperanto (eo) */ |
- |
- memcpy(q, ".utf8", 6); |
- locale = newlocale(LC_COLLATE_MASK, localeName, NULL); |
- if (locale != NULL) |
- return(locale); |
- |
- /* Try to find most common country for language */ |
- |
- if (llen != 2) |
- return(NULL); |
- |
- region = (char *)xsltDefaultRegion((xmlChar *)localeName); |
- if (region == NULL) |
- return(NULL); |
- |
- q = localeName + llen; |
- *q++ = '_'; |
- *q++ = region[0]; |
- *q++ = region[1]; |
- memcpy(q, ".utf8", 6); |
- locale = newlocale(LC_COLLATE_MASK, localeName, NULL); |
- |
- return(locale); |
-#endif |
- |
-#ifdef XSLT_LOCALE_WINAPI |
-{ |
- xsltLocale locale = (xsltLocale)0; |
- xmlChar localeName[XSLTMAX_LANGTAGLEN+1]; |
- xmlChar *q = localeName; |
- const xmlChar *p = languageTag; |
- int i, llen; |
- const xmlChar *region = NULL; |
- |
- if (languageTag == NULL) goto end; |
- |
- xsltEnumSupportedLocales(); |
- |
- for (i=0; i<XSLTMAX_ISO639LANGLEN && ISALPHA(*p); ++i) |
- *q++ = TOLOWER(*p++); |
- if (i == 0) goto end; |
- |
- llen = i; |
- *q++ = '-'; |
- if (*p) { /*if country tag is given*/ |
- if (*p++ != '-') goto end; |
- |
- for (i=0; i<XSLTMAX_ISO3166CNTRYLEN && ISALPHA(*p); ++i) |
- *q++ = TOUPPER(*p++); |
- if (i == 0 || *p) goto end; |
- |
- *q = '\0'; |
- locale = xslt_locale_WINAPI(localeName); |
- if (locale != (xsltLocale)0) goto end; |
- } |
- /* Try to find most common country for language */ |
- region = xsltDefaultRegion(localeName); |
- if (region == NULL) goto end; |
- |
- strcpy(localeName + llen + 1, region); |
- locale = xslt_locale_WINAPI(localeName); |
-end: |
- return(locale); |
-} |
-#endif |
- |
-#ifdef XSLT_LOCALE_NONE |
- return(NULL); |
-#endif |
-} |
- |
-static const xmlChar* |
-xsltDefaultRegion(const xmlChar *localeName) { |
- xmlChar c; |
- /* region should be xmlChar, but gcc warns on all string assignments */ |
- const char *region = NULL; |
- |
- c = localeName[1]; |
- /* This is based on the locales from glibc 2.3.3 */ |
- |
- switch (localeName[0]) { |
- case 'a': |
- if (c == 'a' || c == 'm') region = "ET"; |
- else if (c == 'f') region = "ZA"; |
- else if (c == 'n') region = "ES"; |
- else if (c == 'r') region = "AE"; |
- else if (c == 'z') region = "AZ"; |
- break; |
- case 'b': |
- if (c == 'e') region = "BY"; |
- else if (c == 'g') region = "BG"; |
- else if (c == 'n') region = "BD"; |
- else if (c == 'r') region = "FR"; |
- else if (c == 's') region = "BA"; |
- break; |
- case 'c': |
- if (c == 'a') region = "ES"; |
- else if (c == 's') region = "CZ"; |
- else if (c == 'y') region = "GB"; |
- break; |
- case 'd': |
- if (c == 'a') region = "DK"; |
- else if (c == 'e') region = "DE"; |
- break; |
- case 'e': |
- if (c == 'l') region = "GR"; |
- else if (c == 'n' || c == 'o') region = "US"; |
- else if (c == 's' || c == 'u') region = "ES"; |
- else if (c == 't') region = "EE"; |
- break; |
- case 'f': |
- if (c == 'a') region = "IR"; |
- else if (c == 'i') region = "FI"; |
- else if (c == 'o') region = "FO"; |
- else if (c == 'r') region = "FR"; |
- break; |
- case 'g': |
- if (c == 'a') region = "IE"; |
- else if (c == 'l') region = "ES"; |
- else if (c == 'v') region = "GB"; |
- break; |
- case 'h': |
- if (c == 'e') region = "IL"; |
- else if (c == 'i') region = "IN"; |
- else if (c == 'r') region = "HT"; |
- else if (c == 'u') region = "HU"; |
- break; |
- case 'i': |
- if (c == 'd') region = "ID"; |
- else if (c == 's') region = "IS"; |
- else if (c == 't') region = "IT"; |
- else if (c == 'w') region = "IL"; |
- break; |
- case 'j': |
- if (c == 'a') region = "JP"; |
- break; |
- case 'k': |
- if (c == 'l') region = "GL"; |
- else if (c == 'o') region = "KR"; |
- else if (c == 'w') region = "GB"; |
- break; |
- case 'l': |
- if (c == 't') region = "LT"; |
- else if (c == 'v') region = "LV"; |
- break; |
- case 'm': |
- if (c == 'k') region = "MK"; |
- else if (c == 'l' || c == 'r') region = "IN"; |
- else if (c == 'n') region = "MN"; |
- else if (c == 's') region = "MY"; |
- else if (c == 't') region = "MT"; |
- break; |
- case 'n': |
- if (c == 'b' || c == 'n' || c == 'o') region = "NO"; |
- else if (c == 'e') region = "NP"; |
- else if (c == 'l') region = "NL"; |
- break; |
- case 'o': |
- if (c == 'm') region = "ET"; |
- break; |
- case 'p': |
- if (c == 'a') region = "IN"; |
- else if (c == 'l') region = "PL"; |
- else if (c == 't') region = "PT"; |
- break; |
- case 'r': |
- if (c == 'o') region = "RO"; |
- else if (c == 'u') region = "RU"; |
- break; |
- case 's': |
- switch (c) { |
- case 'e': region = "NO"; break; |
- case 'h': region = "YU"; break; |
- case 'k': region = "SK"; break; |
- case 'l': region = "SI"; break; |
- case 'o': region = "ET"; break; |
- case 'q': region = "AL"; break; |
- case 't': region = "ZA"; break; |
- case 'v': region = "SE"; break; |
- } |
- break; |
- case 't': |
- if (c == 'a' || c == 'e') region = "IN"; |
- else if (c == 'h') region = "TH"; |
- else if (c == 'i') region = "ER"; |
- else if (c == 'r') region = "TR"; |
- else if (c == 't') region = "RU"; |
- break; |
- case 'u': |
- if (c == 'k') region = "UA"; |
- else if (c == 'r') region = "PK"; |
- break; |
- case 'v': |
- if (c == 'i') region = "VN"; |
- break; |
- case 'w': |
- if (c == 'a') region = "BE"; |
- break; |
- case 'x': |
- if (c == 'h') region = "ZA"; |
- break; |
- case 'z': |
- if (c == 'h') region = "CN"; |
- else if (c == 'u') region = "ZA"; |
- break; |
- } |
- return((xmlChar *)region); |
-} |
- |
-/** |
- * xsltFreeLocale: |
- * @locale: the locale to free |
- * |
- * Frees a locale created with xsltNewLocale |
- */ |
-void |
-xsltFreeLocale(xsltLocale locale) { |
-#ifdef XSLT_LOCALE_XLOCALE |
- freelocale(locale); |
-#endif |
-} |
- |
-/** |
- * xsltStrxfrm: |
- * @locale: locale created with xsltNewLocale |
- * @string: UTF-8 string to transform |
- * |
- * Transforms a string according to locale. The transformed string must then be |
- * compared with xsltLocaleStrcmp and freed with xmlFree. |
- * |
- * Returns the transformed string or NULL on error |
- */ |
-xsltLocaleChar * |
-xsltStrxfrm(xsltLocale locale, const xmlChar *string) |
-{ |
-#ifdef XSLT_LOCALE_NONE |
- return(NULL); |
-#else |
- size_t xstrlen, r; |
- xsltLocaleChar *xstr; |
- |
-#ifdef XSLT_LOCALE_XLOCALE |
- xstrlen = strxfrm_l(NULL, (const char *)string, 0, locale) + 1; |
- xstr = (xsltLocaleChar *) xmlMalloc(xstrlen); |
- if (xstr == NULL) { |
- xsltTransformError(NULL, NULL, NULL, |
- "xsltStrxfrm : out of memory error\n"); |
- return(NULL); |
- } |
- |
- r = strxfrm_l((char *)xstr, (const char *)string, xstrlen, locale); |
-#endif |
- |
-#ifdef XSLT_LOCALE_WINAPI |
- xstrlen = MultiByteToWideChar(CP_UTF8, 0, string, -1, NULL, 0); |
- if (xstrlen == 0) { |
- xsltTransformError(NULL, NULL, NULL, "xsltStrxfrm : MultiByteToWideChar check failed\n"); |
- return(NULL); |
- } |
- xstr = (xsltLocaleChar*) xmlMalloc(xstrlen * sizeof(xsltLocaleChar)); |
- if (xstr == NULL) { |
- xsltTransformError(NULL, NULL, NULL, "xsltStrxfrm : out of memory\n"); |
- return(NULL); |
- } |
- r = MultiByteToWideChar(CP_UTF8, 0, string, -1, xstr, xstrlen); |
- if (r == 0) { |
- xsltTransformError(NULL, NULL, NULL, "xsltStrxfrm : MultiByteToWideChar failed\n"); |
- xmlFree(xstr); |
- return(NULL); |
- } |
- return(xstr); |
-#endif /* XSLT_LOCALE_WINAPI */ |
- |
- if (r >= xstrlen) { |
- xsltTransformError(NULL, NULL, NULL, "xsltStrxfrm : strxfrm failed\n"); |
- xmlFree(xstr); |
- return(NULL); |
- } |
- |
- return(xstr); |
-#endif /* XSLT_LOCALE_NONE */ |
-} |
- |
-/** |
- * xsltLocaleStrcmp: |
- * @locale: a locale identifier |
- * @str1: a string transformed with xsltStrxfrm |
- * @str2: a string transformed with xsltStrxfrm |
- * |
- * Compares two strings transformed with xsltStrxfrm |
- * |
- * Returns a value < 0 if str1 sorts before str2, |
- * a value > 0 if str1 sorts after str2, |
- * 0 if str1 and str2 are equal wrt sorting |
- */ |
-int |
-xsltLocaleStrcmp(xsltLocale locale, const xsltLocaleChar *str1, const xsltLocaleChar *str2) { |
- (void)locale; |
-#ifdef XSLT_LOCALE_WINAPI |
-{ |
- int ret; |
- if (str1 == str2) return(0); |
- if (str1 == NULL) return(-1); |
- if (str2 == NULL) return(1); |
- ret = CompareStringW(locale, 0, str1, -1, str2, -1); |
- if (ret == 0) { |
- xsltTransformError(NULL, NULL, NULL, "xsltLocaleStrcmp : CompareStringW fail\n"); |
- return(0); |
- } |
- return(ret - 2); |
-} |
-#else |
- return(xmlStrcmp(str1, str2)); |
-#endif |
-} |
- |
-#ifdef XSLT_LOCALE_WINAPI |
-/** |
- * xsltCountSupportedLocales: |
- * @lcid: not used |
- * |
- * callback used to count locales |
- * |
- * Returns TRUE |
- */ |
-BOOL CALLBACK |
-xsltCountSupportedLocales(LPSTR lcid) { |
- (void) lcid; |
- ++xsltLocaleListSize; |
- return(TRUE); |
-} |
- |
-/** |
- * xsltIterateSupportedLocales: |
- * @lcid: not used |
- * |
- * callback used to track locales |
- * |
- * Returns TRUE if not at the end of the array |
- */ |
-BOOL CALLBACK |
-xsltIterateSupportedLocales(LPSTR lcid) { |
- static int count = 0; |
- xmlChar iso639lang [XSLTMAX_ISO639LANGLEN +1]; |
- xmlChar iso3136ctry[XSLTMAX_ISO3166CNTRYLEN+1]; |
- int k, l; |
- xsltRFC1766Info *p = xsltLocaleList + count; |
- |
- k = sscanf(lcid, "%lx", (long*)&p->lcid); |
- if (k < 1) goto end; |
- /*don't count terminating null character*/ |
- k = GetLocaleInfoA(p->lcid, LOCALE_SISO639LANGNAME , iso639lang , sizeof(iso639lang )); |
- if (--k < 1) goto end; |
- l = GetLocaleInfoA(p->lcid, LOCALE_SISO3166CTRYNAME, iso3136ctry, sizeof(iso3136ctry)); |
- if (--l < 1) goto end; |
- |
- { /*fill results*/ |
- xmlChar *q = p->tag; |
- memcpy(q, iso639lang, k); |
- q += k; |
- *q++ = '-'; |
- memcpy(q, iso3136ctry, l); |
- q += l; |
- *q = '\0'; |
- } |
- ++count; |
-end: |
- return((count < xsltLocaleListSize) ? TRUE : FALSE); |
-} |
- |
- |
-static void |
-xsltEnumSupportedLocales(void) { |
- xmlRMutexLock(xsltLocaleMutex); |
- if (xsltLocaleListSize <= 0) { |
- size_t len; |
- |
- EnumSystemLocalesA(xsltCountSupportedLocales, LCID_SUPPORTED); |
- |
- len = xsltLocaleListSize * sizeof(xsltRFC1766Info); |
- xsltLocaleList = xmlMalloc(len); |
- memset(xsltLocaleList, 0, len); |
- EnumSystemLocalesA(xsltIterateSupportedLocales, LCID_SUPPORTED); |
- } |
- xmlRMutexUnlock(xsltLocaleMutex); |
-} |
- |
-#endif /*def XSLT_LOCALE_WINAPI*/ |