U_CAPI UBool U_EXPORT2 uhash_compareIChars(const UHashTok key1, const UHashTok key2) { const char *p1 = (const char*) key1.pointer; const char *p2 = (const char*) key2.pointer; if (p1 == p2) { return TRUE; } if (p1 == NULL || p2 == NULL) { return FALSE; } while (*p1 != 0 && uprv_tolower(*p1) == uprv_tolower(*p2)) { ++p1; ++p2; } return (UBool)(*p1 == *p2); }
Value(int32_t enumValue, const char *joinedAliases) : enumValue(enumValue), joinedAliases(joinedAliases), count(0) { if(uprv_strlen(joinedAliases)>=JOINED_ALIASES_CAPACITY) { fprintf(stderr, "genprops error: pnamesbuilder.cpp Value::Value(%ld, \"%s\"): " "joined aliases too long: " "increase JOINED_ALIASES_CAPACITY, to at least %ld\n", (long)enumValue, joinedAliases, uprv_strlen(joinedAliases)+1); exit(U_BUFFER_OVERFLOW_ERROR); } // Copy the space-separated aliases into NUL-separated ones and count them. // Write a normalized version of each one. const char *j=joinedAliases; char *a=aliasesBuffer; char *n=normalizedBuffer; char c; do { aliases[count]=a; normalized[count++]=n; while((c=*j++)!=' ' && c!=0) { *a++=c; // Ignore delimiters '-' and '_'. if(!(c=='-' || c=='_')) { *n++=uprv_tolower(c); } } *a++=0; *n++=0; } while(c!=0); }
U_CAPI int U_EXPORT2 uprv_strnicmp(const char *str1, const char *str2, uint32_t n) { if(str1==NULL) { if(str2==NULL) { return 0; } else { return -1; } } else if(str2==NULL) { return 1; } else { /* compare non-NULL strings lexically with lowercase */ int rc; unsigned char c1, c2; for(; n--;) { c1=(unsigned char)*str1; c2=(unsigned char)*str2; if(c1==0) { if(c2==0) { return 0; } else { return -1; } } else if(c2==0) { return 1; } else { /* compare non-zero characters with lowercase */ rc=(int)(unsigned char)uprv_tolower(c1)-(int)(unsigned char)uprv_tolower(c2); if(rc!=0) { return rc; } } ++str1; ++str2; } } return 0; }
U_CAPI char* U_EXPORT2 T_CString_toLowerCase(char* str) { char* origPtr = str; if (str) { do *str = (char)uprv_tolower(*str); while (*(str++)); } return origPtr; }
static const char* U_CALLCONV _processLocaleElement(CollatorSpec *spec, uint32_t value, const char* string, UErrorCode *status) { int32_t len = 0; do { if(value == UCOL_SIT_LANGUAGE || value == UCOL_SIT_KEYWORD || value == UCOL_SIT_PROVIDER) { spec->locElements[value][len++] = uprv_tolower(*string); } else { spec->locElements[value][len++] = *string; } } while(*(++string) != '_' && *string && len < locElementCapacity); if(len >= locElementCapacity) { *status = U_BUFFER_OVERFLOW_ERROR; return string; } // don't skip the underscore at the end return string; }
U_CAPI int32_t U_EXPORT2 uhash_hashIChars(const UHashTok key) { STRING_HASH(uint8_t, key.pointer, uprv_strlen((char*)p), uprv_tolower(*p)); }
static void TestAPI(void) { int32_t intValue=0; char src[30]="HELLO THERE", dest[30]; static const char *const abc="abcdefghijklmnopqrstuvwxyz", *const ABC="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const char *temp; int32_t i; log_verbose("Testing uprv_tolower() and uprv_toupper()\n"); for(i=0; i<=26; ++i) { dest[i]=uprv_tolower(abc[i]); } if(0!=strcmp(abc, dest)) { log_err("uprv_tolower(abc) failed\n"); } for(i=0; i<=26; ++i) { dest[i]=uprv_tolower(ABC[i]); } if(0!=strcmp(abc, dest)) { log_err("uprv_tolower(ABC) failed\n"); } for(i=0; i<=26; ++i) { dest[i]=uprv_toupper(abc[i]); } if(0!=strcmp(ABC, dest)) { log_err("uprv_toupper(abc) failed\n"); } for(i=0; i<=26; ++i) { dest[i]=uprv_toupper(ABC[i]); } if(0!=strcmp(ABC, dest)) { log_err("uprv_toupper(ABC) failed\n"); } log_verbose("Testing the API in cstring\n"); T_CString_toLowerCase(src); if(uprv_strcmp(src, "hello there") != 0){ log_err("FAIL: *** T_CString_toLowerCase() failed. Expected: \"hello there\", Got: \"%s\"\n", src); } T_CString_toUpperCase(src); if(uprv_strcmp(src, "HELLO THERE") != 0){ log_err("FAIL: *** T_CString_toUpperCase() failed. Expected: \"HELLO THERE\", Got: \"%s\"\n", src); } intValue=T_CString_stringToInteger("34556", 10); if(intValue != 34556){ log_err("FAIL: ****T_CString_stringToInteger(\"34556\", 10) failed. Expected: 34556, Got: %d\n", intValue); } intValue=T_CString_stringToInteger("100", 16); if(intValue != 256){ log_err("FAIL: ****T_CString_stringToInteger(\"100\", 16) failed. Expected: 256, Got: %d\n", intValue); } i = T_CString_integerToString(src, 34556, 10); if(uprv_strcmp(src, "34556") != 0 || i != 5){ log_err("FAIL: ****integerToString(src, 34566, 10); failed. Expected: \"34556\", Got: %s\n", src); } i = T_CString_integerToString(src, 431, 16); if(uprv_stricmp(src, "1AF") != 0 || i != 3){ log_err("FAIL: ****integerToString(src, 431, 16); failed. Expected: \"1AF\", Got: %s\n", src); } i = T_CString_int64ToString(src, U_INT64_MAX, 10); if(uprv_strcmp(src, "9223372036854775807") != 0 || i != 19){ log_err("FAIL: ****integerToString(src, 9223372036854775807, 10); failed. Got: %s\n", src); } i = T_CString_int64ToString(src, U_INT64_MAX, 16); if(uprv_stricmp(src, "7FFFFFFFFFFFFFFF") != 0 || i != 16){ log_err("FAIL: ****integerToString(src, 7FFFFFFFFFFFFFFF, 16); failed. Got: %s\n", src); } uprv_strcpy(src, "this is lower case"); if(T_CString_stricmp(src, "THIS is lower CASE") != 0){ log_err("FAIL: *****T_CString_stricmp() failed."); } if((intValue=T_CString_stricmp(NULL, "first string is null") )!= -1){ log_err("FAIL: T_CString_stricmp() where the first string is null failed. Expected: -1, returned %d\n", intValue); } if((intValue=T_CString_stricmp("second string is null", NULL)) != 1){ log_err("FAIL: T_CString_stricmp() where the second string is null failed. Expected: 1, returned %d\n", intValue); } if((intValue=T_CString_stricmp(NULL, NULL)) != 0){ log_err("FAIL: T_CString_stricmp(NULL, NULL) failed. Expected: 0, returned %d\n", intValue); } if((intValue=T_CString_stricmp("", "")) != 0){ log_err("FAIL: T_CString_stricmp(\"\", \"\") failed. Expected: 0, returned %d\n", intValue); } if((intValue=T_CString_stricmp("", "abc")) != -1){ log_err("FAIL: T_CString_stricmp(\"\", \"abc\") failed. Expected: -1, returned %d\n", intValue); } if((intValue=T_CString_stricmp("abc", "")) != 1){ log_err("FAIL: T_CString_stricmp(\"abc\", \"\") failed. Expected: 1, returned %d\n", intValue); } temp=uprv_strdup("strdup"); if(uprv_strcmp(temp, "strdup") !=0 ){ log_err("FAIL: uprv_strdup() failed. Expected: \"strdup\", Got: %s\n", temp); } uprv_free((char *)temp); uprv_strcpy(src, "this is lower case"); if(T_CString_strnicmp(src, "THIS", 4 ) != 0){ log_err("FAIL: *****T_CString_strnicmp() failed."); } if((intValue=T_CString_strnicmp(NULL, "first string is null", 10) )!= -1){ log_err("FAIL: T_CString_strnicmp() where the first string is null failed. Expected: -1, returned %d\n", intValue); } if((intValue=T_CString_strnicmp("second string is null", NULL, 10)) != 1){ log_err("FAIL: T_CString_strnicmp() where the second string is null failed. Expected: 1, returned %d\n", intValue); } if((intValue=T_CString_strnicmp(NULL, NULL, 10)) != 0){ log_err("FAIL: T_CString_strnicmp(NULL, NULL, 10) failed. Expected: 0, returned %d\n", intValue); } if((intValue=T_CString_strnicmp("", "", 10)) != 0){ log_err("FAIL: T_CString_strnicmp(\"\", \"\") failed. Expected: 0, returned %d\n", intValue); } if((intValue=T_CString_strnicmp("", "abc", 10)) != -1){ log_err("FAIL: T_CString_stricmp(\"\", \"abc\", 10) failed. Expected: -1, returned %d\n", intValue); } if((intValue=T_CString_strnicmp("abc", "", 10)) != 1){ log_err("FAIL: T_CString_strnicmp(\"abc\", \"\", 10) failed. Expected: 1, returned %d\n", intValue); } }
/* NOTE: The caller should handle thread safety */ U_CAPI const char* U_EXPORT2 uprv_getDefaultLocaleID() { #if U_POSIX_LOCALE /* Note that: (a '!' means the ID is improper somehow) LC_ALL ----> default_loc codepage -------------------------------------------------------- ab.CD ab CD ab@CD ab__CD - [email protected] ab__CD EF ab_CD.EF@GH ab_CD_GH EF Some 'improper' ways to do the same as above: ! [email protected] ab_CD_GH EF ! [email protected] ab_CD_GH EF ! [email protected]@GH.IJ ab_CD_GH EF _CD@GH _CD_GH - _CD.EF@GH _CD_GH EF The variant cannot have dots in it. The 'rightmost' variant (@xxx) wins. The leftmost codepage (.xxx) wins. */ char *correctedPOSIXLocale = 0; const char* posixID = uprv_getPOSIXID(); const char *p; const char *q; int32_t len; /* Format: (no spaces) ll [ _CC ] [ . MM ] [ @ VV] l = lang, C = ctry, M = charmap, V = variant */ if (gCorrectedPOSIXLocale != NULL) { return gCorrectedPOSIXLocale; } if ((p = uprv_strchr(posixID, '.')) != NULL) { /* assume new locale can't be larger than old one? */ correctedPOSIXLocale = (char*) uprv_malloc(uprv_strlen(posixID)+1); uprv_strncpy(correctedPOSIXLocale, posixID, p-posixID); correctedPOSIXLocale[p-posixID] = 0; /* do not copy after the @ */ if ((p = uprv_strchr(correctedPOSIXLocale, '@')) != NULL) { correctedPOSIXLocale[p-correctedPOSIXLocale] = 0; } } /* Note that we scan the *uncorrected* ID. */ if ((p = uprv_strrchr(posixID, '@')) != NULL) { if (correctedPOSIXLocale == NULL) { correctedPOSIXLocale = (char*) uprv_malloc(uprv_strlen(posixID)+1); uprv_strncpy(correctedPOSIXLocale, posixID, p-posixID); correctedPOSIXLocale[p-posixID] = 0; } p++; /* Take care of any special cases here.. */ if (!uprv_strcmp(p, "nynorsk")) { p = "NY"; /* Don't worry about no__NY. In practice, it won't appear. */ } if (uprv_strchr(correctedPOSIXLocale,'_') == NULL) { uprv_strcat(correctedPOSIXLocale, "__"); /* aa@b -> aa__b */ } else { uprv_strcat(correctedPOSIXLocale, "_"); /* aa_CC@b -> aa_CC_b */ } if ((q = uprv_strchr(p, '.')) != NULL) { /* How big will the resulting string be? */ len = (int32_t)(uprv_strlen(correctedPOSIXLocale) + (q-p)); uprv_strncat(correctedPOSIXLocale, p, q-p); correctedPOSIXLocale[len] = 0; } else { /* Anything following the @ sign */ uprv_strcat(correctedPOSIXLocale, p); } /* Should there be a map from 'no@nynorsk' -> no_NO_NY here? * How about 'russian' -> 'ru'? * Many of the other locales using ISO codes will be handled by the * canonicalization functions in uloc_getDefault. */ } /* Was a correction made? */ if (correctedPOSIXLocale != NULL) { posixID = correctedPOSIXLocale; } else { /* copy it, just in case the original pointer goes away. See j2395 */ correctedPOSIXLocale = (char *)uprv_malloc(uprv_strlen(posixID) + 1); posixID = uprv_strcpy(correctedPOSIXLocale, posixID); } if (gCorrectedPOSIXLocale == NULL) { gCorrectedPOSIXLocale = correctedPOSIXLocale; ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); correctedPOSIXLocale = NULL; } if (correctedPOSIXLocale != NULL) { /* Was already set - clean up. */ uprv_free(correctedPOSIXLocale); } return posixID; #elif defined(U_WINDOWS) UErrorCode status = U_ZERO_ERROR; LCID id = GetThreadLocale(); const char* locID = uprv_convertToPosix(id, &status); if (U_FAILURE(status)) { locID = "en_US"; } return locID; #elif defined(XP_MAC) int32_t script = MAC_LC_INIT_NUMBER; /* = IntlScript(); or GetScriptManagerVariable(smSysScript);*/ int32_t region = MAC_LC_INIT_NUMBER; /* = GetScriptManagerVariable(smRegionCode);*/ int32_t lang = MAC_LC_INIT_NUMBER; /* = GetScriptManagerVariable(smScriptLang);*/ int32_t date_region = MAC_LC_INIT_NUMBER; const char* posixID = 0; int32_t count = sizeof(mac_lc_recs) / sizeof(mac_lc_rec); int32_t i; Intl1Hndl ih; ih = (Intl1Hndl) GetIntlResource(1); if (ih) date_region = ((uint16_t)(*ih)->intl1Vers) >> 8; for (i = 0; i < count; i++) { if ( ((mac_lc_recs[i].script == MAC_LC_MAGIC_NUMBER) || (mac_lc_recs[i].script == script)) && ((mac_lc_recs[i].region == MAC_LC_MAGIC_NUMBER) || (mac_lc_recs[i].region == region)) && ((mac_lc_recs[i].lang == MAC_LC_MAGIC_NUMBER) || (mac_lc_recs[i].lang == lang)) && ((mac_lc_recs[i].date_region == MAC_LC_MAGIC_NUMBER) || (mac_lc_recs[i].date_region == date_region)) ) { posixID = mac_lc_recs[i].posixID; break; } } return posixID; #elif defined(OS400) /* locales are process scoped and are by definition thread safe */ static char correctedLocale[64]; const char *localeID = getenv("LC_ALL"); char *p; if (localeID == NULL) localeID = getenv("LANG"); if (localeID == NULL) localeID = setlocale(LC_ALL, NULL); /* Make sure we have something... */ if (localeID == NULL) return "en_US_POSIX"; /* Extract the locale name from the path. */ if((p = uprv_strrchr(localeID, '/')) != NULL) { /* Increment p to start of locale name. */ p++; localeID = p; } /* Copy to work location. */ uprv_strcpy(correctedLocale, localeID); /* Strip off the '.locale' extension. */ if((p = uprv_strchr(correctedLocale, '.')) != NULL) { *p = 0; } /* Upper case the locale name. */ T_CString_toUpperCase(correctedLocale); /* See if we are using the POSIX locale. Any of the * following are equivalent and use the same QLGPGCMA * (POSIX) locale. * QLGPGCMA2 means UCS2 * QLGPGCMA_4 means UTF-32 * QLGPGCMA_8 means UTF-8 */ if ((uprv_strcmp("C", correctedLocale) == 0) || (uprv_strcmp("POSIX", correctedLocale) == 0) || (uprv_strncmp("QLGPGCMA", correctedLocale, 8) == 0)) { uprv_strcpy(correctedLocale, "en_US_POSIX"); } else { int16_t LocaleLen; /* Lower case the lang portion. */ for(p = correctedLocale; *p != 0 && *p != '_'; p++) { *p = uprv_tolower(*p); } /* Adjust for Euro. After '_E' add 'URO'. */ LocaleLen = uprv_strlen(correctedLocale); if (correctedLocale[LocaleLen - 2] == '_' && correctedLocale[LocaleLen - 1] == 'E') { uprv_strcat(correctedLocale, "URO"); } /* If using Lotus-based locale then convert to * equivalent non Lotus. */ else if (correctedLocale[LocaleLen - 2] == '_' && correctedLocale[LocaleLen - 1] == 'L') { correctedLocale[LocaleLen - 2] = 0; } /* There are separate simplified and traditional * locales called zh_HK_S and zh_HK_T. */ else if (uprv_strncmp(correctedLocale, "zh_HK", 5) == 0) { uprv_strcpy(correctedLocale, "zh_HK"); } /* A special zh_CN_GBK locale... */ else if (uprv_strcmp(correctedLocale, "zh_CN_GBK") == 0) { uprv_strcpy(correctedLocale, "zh_CN"); } } return correctedLocale; #endif }