| //********************************************************************** |
| //* Copyright (C) 2000, International Business Machines Corporation |
| //* and others. All Rights Reserved. |
| //********************************************************************** |
| // lcid.cpp - Test for establishing conformance of data in resource bundles to |
| // lcid <-> POSIX mapping |
| // Created by: Vladimir Weinstein |
| // Date: 08/09/2000 |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include "unicode/utypes.h" |
| #include "locmap.h" |
| #include "cstring.h" |
| #include "unicode/resbund.h" |
| |
| static void |
| testLCID(const char *localeName); |
| |
| static void |
| testLCID(const char *localeName, |
| const UnicodeString &posixName, |
| uint32_t *errors, |
| uint32_t *warnings) |
| { |
| UErrorCode status = U_ZERO_ERROR; |
| uint32_t lcid; |
| uint32_t expectedLCID; |
| char lcidStringC[1024]; |
| char cLocaleName[256] = {'\0'}; |
| |
| u_UCharsToChars(posixName.getUChars(),cLocaleName,posixName.length()); |
| ResourceBundle posixLocale((char *)0, Locale(cLocaleName), status); |
| if(status != U_ZERO_ERROR) { |
| if(U_SUCCESS(status)) { |
| printf("ERROR: Locale %-5s not installed, and it should be!\n", localeName); |
| } else { |
| printf("%%%%%%% Unexpected error %d %%%%%%%", u_errorName(status)); |
| } |
| (*errors)++; |
| return; |
| } |
| |
| UnicodeString lcidString(posixLocale.getStringEx("LocaleID", status)); |
| |
| if (U_FAILURE(status)) { |
| printf("ERROR: %s does not have a LocaleID (%s)\n", localeName, u_errorName(status)); |
| (*errors)++; |
| return; |
| } |
| |
| lcidString.extract(0, lcidString.length(), lcidStringC, ""); |
| lcidStringC[lcidString.length()] = '\0'; |
| expectedLCID = uprv_strtoul(lcidStringC, NULL, 16); |
| |
| lcid = IGlobalLocales::convertToLCID(localeName, &status); |
| if (U_FAILURE(status)) { |
| printf("WARNING: %-5s does not have an LCID mapping\n", localeName); |
| (*warnings)++; |
| return; |
| } |
| |
| status = U_ZERO_ERROR; |
| uprv_strcpy(lcidStringC, IGlobalLocales::convertToPosix(expectedLCID, &status)); |
| if (U_FAILURE(status)) { |
| printf("ERROR: %.4x does not have a POSIX mapping due to %s\n", expectedLCID, u_errorName(status)); |
| (*errors)++; |
| } |
| |
| if(lcid != expectedLCID) { |
| printf("ERROR: Locale %-5s wrongfully has 0x%.4x instead of 0x%.4x for LCID\n", localeName, expectedLCID, lcid); |
| (*errors)++; |
| } |
| if(strcmp(localeName, lcidStringC) != 0) { |
| char langName[1024]; |
| char langLCID[1024]; |
| uloc_getLanguage(localeName, langName, sizeof(langName), &status); |
| uloc_getLanguage(lcidStringC, langLCID, sizeof(langLCID), &status); |
| |
| if (expectedLCID == lcid && strcmp(langName, langLCID) == 0) { |
| printf("WARNING: %-5s resolves to %s (0x%.4x)\n", localeName, lcidStringC, lcid); |
| (*warnings)++; |
| } |
| else if (expectedLCID == lcid) { |
| printf("ERROR: 0x%.4x is from %-5s and the number resolves wrongfully to %s\n", expectedLCID, localeName, lcidStringC); |
| (*errors)++; |
| } |
| else { |
| printf("ERROR: 0x%.4x is from %-5s and the number resolves wrongfully to %s. It should be 0x%x.\n", expectedLCID, localeName, lcidStringC, lcid); |
| (*errors)++; |
| } |
| } else { |
| //printf("0x%x is from %s and it resolves correctly to %s(0x%x)\n", expectedLCID, localeName, lcidStringC, lcid); |
| //printf("%s: %x->%x\n", localeName, expectedLCID, lcid); |
| } |
| } |
| |
| int main() { |
| UErrorCode status = U_ZERO_ERROR; |
| ResourceBundle index((char *)0, Locale("index"), status); |
| uint32_t errors = 0; |
| uint32_t warnings = 0; |
| |
| if(U_SUCCESS(status)) { |
| ResourceBundle installedLocales = index.get("InstalledLocales", status); |
| if(U_SUCCESS(status)) { |
| installedLocales.resetIterator(); |
| while(installedLocales.hasNext()) { |
| char localeName[1024]; |
| UnicodeString posixName = installedLocales.getNextString(status); |
| |
| posixName.extract(0, posixName.length(), localeName, ""); |
| localeName[posixName.length()] = '\0'; |
| testLCID(localeName, posixName, &errors, &warnings); |
| } |
| } |
| } |
| if(errors > 0) { |
| printf("There were %d error(s)\n", errors); |
| } else { |
| printf("There were no errors\n"); |
| } |
| |
| if(warnings > 0) { |
| printf("There were %d warning(s)\n", warnings); |
| } |
| |
| char temp; |
| scanf("%c", &temp); |
| |
| return 0; |
| } |