16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 2005-2011, International Business Machines 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************** 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File WINDTTST.CPP 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************** 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_HAS_WIN32_API 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/format.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/numfmt.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/locid.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h" 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/testlog.h" 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utmscale.h" 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "windtfmt.h" 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "winutil.h" 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "windttst.h" 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h" 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "locmap.h" 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "wintzimpl.h" 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define WIN32_LEAN_AND_MEAN 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define VC_EXTRALEAN 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define NOUSER 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define NOSERVICE 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define NOIME 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define NOMCX 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# include <windows.h> 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ARRAY_SIZE(array) (sizeof array / sizeof array[0]) 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char *getCalendarType(int32_t type) 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (type) 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 1: 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 2: 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return "@calendar=gregorian"; 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 3: 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return "@calendar=japanese"; 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 6: 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return "@calendar=islamic"; 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 7: 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return "@calendar=buddhist"; 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 8: 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return "@calendar=hebrew"; 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return ""; 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid Win32DateTimeTest::testLocales(TestLog *log) 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SYSTEMTIME winNow; 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate icuNow = 0; 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SYSTEMTIME st; 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FILETIME ft; 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString zoneID; 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const TimeZone *tz = TimeZone::createDefault(); 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TIME_ZONE_INFORMATION tzi; 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tz->getID(zoneID); 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (! uprv_getWindowsTimeZoneInfo(&tzi, zoneID.getBuffer(), zoneID.length())) { 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool found = FALSE; 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t ec = TimeZone::countEquivalentIDs(zoneID); 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int z = 0; z < ec; z += 1) { 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString equiv = TimeZone::getEquivalentID(zoneID, z); 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (found = uprv_getWindowsTimeZoneInfo(&tzi, equiv.getBuffer(), equiv.length())) { 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (! found) { 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GetTimeZoneInformation(&tzi); 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GetSystemTime(&st); 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SystemTimeToFileTime(&st, &ft); 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SystemTimeToTzSpecificLocalTime(&tzi, &st, &winNow); 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t wftNow = ((int64_t) ft.dwHighDateTime << 32) + ft.dwLowDateTime; 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t udtsNow = utmscale_fromInt64(wftNow, UDTS_WINDOWS_FILE_TIME, &status); 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org icuNow = (UDate) utmscale_toInt64(udtsNow, UDTS_ICU4C_TIME, &status); 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t lcidCount = 0; 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Win32Utilities::LCIDRecord *lcidRecords = Win32Utilities::getLocales(lcidCount); 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(int i = 0; i < lcidCount; i += 1) { 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org WCHAR longDateFormat[81], longTimeFormat[81], wdBuffer[256], wtBuffer[256]; 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t calType = 0; 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // NULL localeID means ICU didn't recognize this locale 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (lcidRecords[i].localeID == NULL) { 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GetLocaleInfoW(lcidRecords[i].lcid, LOCALE_SLONGDATE, longDateFormat, 81); 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GetLocaleInfoW(lcidRecords[i].lcid, LOCALE_STIMEFORMAT, longTimeFormat, 81); 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GetLocaleInfoW(lcidRecords[i].lcid, LOCALE_RETURN_NUMBER|LOCALE_ICALENDARTYPE, (LPWSTR) calType, sizeof(int32_t)); 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char localeID[64]; 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strcpy(localeID, lcidRecords[i].localeID); 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strcat(localeID, getCalendarType(calType)); 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString ubBuffer, udBuffer, utBuffer; 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale ulocale(localeID); 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t wdLength, wtLength; 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org wdLength = GetDateFormatW(lcidRecords[i].lcid, DATE_LONGDATE, &winNow, NULL, wdBuffer, ARRAY_SIZE(wdBuffer)); 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org wtLength = GetTimeFormatW(lcidRecords[i].lcid, 0, &winNow, NULL, wtBuffer, ARRAY_SIZE(wtBuffer)); 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (uprv_strchr(localeID, '@') > 0) { 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strcat(localeID, ";"); 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strcat(localeID, "@"); 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strcat(localeID, "compat=host"); 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale wlocale(localeID); 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DateFormat *wbf = DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, wlocale); 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DateFormat *wdf = DateFormat::createDateInstance(DateFormat::kFull, wlocale); 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DateFormat *wtf = DateFormat::createTimeInstance(DateFormat::kFull, wlocale); 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org wbf->format(icuNow, ubBuffer); 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org wdf->format(icuNow, udBuffer); 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org wtf->format(icuNow, utBuffer); 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ubBuffer.indexOf(wdBuffer, wdLength - 1, 0) < 0) { 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString baseName(wlocale.getBaseName()); 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString expected(wdBuffer); 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log->errln("DateTime format error for locale " + baseName + ": expected date \"" + expected + 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\" got \"" + ubBuffer + "\""); 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ubBuffer.indexOf(wtBuffer, wtLength - 1, 0) < 0) { 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString baseName(wlocale.getBaseName()); 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString expected(wtBuffer); 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log->errln("DateTime format error for locale " + baseName + ": expected time \"" + expected + 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\" got \"" + ubBuffer + "\""); 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (udBuffer.compare(wdBuffer) != 0) { 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString baseName(wlocale.getBaseName()); 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString expected(wdBuffer); 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log->errln("Date format error for locale " + baseName + ": expected \"" + expected + 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\" got \"" + udBuffer + "\""); 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (utBuffer.compare(wtBuffer) != 0) { 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString baseName(wlocale.getBaseName()); 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString expected(wtBuffer); 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log->errln("Time format error for locale " + baseName + ": expected \"" + expected + 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\" got \"" + utBuffer + "\""); 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete wbf; 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete wdf; 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete wtf; 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Win32Utilities::freeLocales(lcidRecords); 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete tz; 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */ 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* U_PLATFORM_HAS_WIN32_API */ 197