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