blob: ef51fdd53ad453936654aad0ddd9030c588c6888 [file] [log] [blame]
/*
********************************************************************************
* Copyright (C) 2005-2013, International Business Machines
* Corporation and others. All Rights Reserved.
********************************************************************************
*
* File WINUTIL.CPP
*
********************************************************************************
*/
#include "unicode/utypes.h"
#if U_PLATFORM_HAS_WIN32_API
#if !UCONFIG_NO_FORMATTING
#include "winutil.h"
#include "locmap.h"
#include "unicode/uloc.h"
# define WIN32_LEAN_AND_MEAN
# define VC_EXTRALEAN
# define NOUSER
# define NOSERVICE
# define NOIME
# define NOMCX
# include <windows.h>
# include <stdio.h>
# include <string.h>
static Win32Utilities::LCIDRecord *lcidRecords = NULL;
static int32_t lcidCount = 0;
static int32_t lcidMax = 0;
BOOL CALLBACK EnumLocalesProc(LPSTR lpLocaleString)
{
char localeID[ULOC_FULLNAME_CAPACITY];
int32_t localeIDLen;
UErrorCode status = U_ZERO_ERROR;
if (lcidCount >= lcidMax) {
Win32Utilities::LCIDRecord *newRecords = new Win32Utilities::LCIDRecord[lcidMax + 32];
for (int i = 0; i < lcidMax; i += 1) {
newRecords[i] = lcidRecords[i];
}
delete[] lcidRecords;
lcidRecords = newRecords;
lcidMax += 32;
}
sscanf(lpLocaleString, "%8x", &lcidRecords[lcidCount].lcid);
localeIDLen = uprv_convertToPosix(lcidRecords[lcidCount].lcid, localeID, sizeof(localeID)/sizeof(localeID[0]), &status);
if (U_SUCCESS(status)) {
lcidRecords[lcidCount].localeID = new char[localeIDLen + 1];
memcpy(lcidRecords[lcidCount].localeID, localeID, localeIDLen);
lcidRecords[lcidCount].localeID[localeIDLen] = 0;
} else {
lcidRecords[lcidCount].localeID = NULL;
}
lcidCount += 1;
return TRUE;
}
Win32Utilities::LCIDRecord *Win32Utilities::getLocales(int32_t &localeCount)
{
LCIDRecord *result;
EnumSystemLocalesA(EnumLocalesProc, LCID_INSTALLED);
localeCount = lcidCount;
result = lcidRecords;
lcidCount = lcidMax = 0;
lcidRecords = NULL;
return result;
}
void Win32Utilities::freeLocales(LCIDRecord *records)
{
for (int i = 0; i < lcidCount; i++) {
delete lcidRecords[i].localeID;
}
delete[] records;
}
#endif /* #if !UCONFIG_NO_FORMATTING */
#endif /* U_PLATFORM_HAS_WIN32_API */