mirror of
https://github.com/reactos/reactos.git
synced 2025-06-23 01:40:17 +00:00
[KERNEL32] make some NLS and Format functions work. Wine-sync with latest version
This commit is contained in:
parent
ca24df9c85
commit
655d24d9eb
8 changed files with 504 additions and 54 deletions
|
@ -42,7 +42,7 @@
|
||||||
/* Define one of these to select the used locale. */
|
/* Define one of these to select the used locale. */
|
||||||
/* (date and time formats etc.) used in DATE, TIME, */
|
/* (date and time formats etc.) used in DATE, TIME, */
|
||||||
/* DIR, PROMPT etc. */
|
/* DIR, PROMPT etc. */
|
||||||
#define LOCALE_WINDOWS /* System locale */
|
/* #define LOCALE_WINDOWS */ /* System locale */
|
||||||
/* #define LOCALE_GERMAN */ /* German locale */
|
/* #define LOCALE_GERMAN */ /* German locale */
|
||||||
/* #define LOCALE_DEFAULT */ /* United States locale */
|
/* #define LOCALE_DEFAULT */ /* United States locale */
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,8 @@
|
||||||
#define ROUND_UP(n, align) \
|
#define ROUND_UP(n, align) \
|
||||||
ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
|
ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
|
||||||
|
|
||||||
|
#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
|
||||||
|
|
||||||
#define __TRY _SEH2_TRY
|
#define __TRY _SEH2_TRY
|
||||||
#define __EXCEPT_PAGE_FAULT _SEH2_EXCEPT(_SEH2_GetExceptionCode() == STATUS_ACCESS_VIOLATION)
|
#define __EXCEPT_PAGE_FAULT _SEH2_EXCEPT(_SEH2_GetExceptionCode() == STATUS_ACCESS_VIOLATION)
|
||||||
#define __ENDTRY _SEH2_END
|
#define __ENDTRY _SEH2_END
|
||||||
|
|
|
@ -225,12 +225,12 @@
|
||||||
@ stdcall EnterCriticalSection(ptr) ntdll.RtlEnterCriticalSection
|
@ stdcall EnterCriticalSection(ptr) ntdll.RtlEnterCriticalSection
|
||||||
@ stdcall EnumCalendarInfoA(ptr long long long)
|
@ stdcall EnumCalendarInfoA(ptr long long long)
|
||||||
@ stdcall EnumCalendarInfoExA(ptr long long long)
|
@ stdcall EnumCalendarInfoExA(ptr long long long)
|
||||||
@ stub -version=0x600+ EnumCalendarInfoExEx
|
@ stdcall -version=0x600+ EnumCalendarInfoExEx(ptr wstr long wstr long long)
|
||||||
@ stdcall EnumCalendarInfoExW(ptr long long long)
|
@ stdcall EnumCalendarInfoExW(ptr long long long)
|
||||||
@ stdcall EnumCalendarInfoW(ptr long long long)
|
@ stdcall EnumCalendarInfoW(ptr long long long)
|
||||||
@ stdcall EnumDateFormatsA(ptr long long)
|
@ stdcall EnumDateFormatsA(ptr long long)
|
||||||
@ stdcall EnumDateFormatsExA(ptr long long)
|
@ stdcall EnumDateFormatsExA(ptr long long)
|
||||||
@ stub -version=0x600+ EnumDateFormatsExEx
|
@ stdcall -version=0x600+ EnumDateFormatsExEx(ptr wstr long long)
|
||||||
@ stdcall EnumDateFormatsExW(ptr long long)
|
@ stdcall EnumDateFormatsExW(ptr long long)
|
||||||
@ stdcall EnumDateFormatsW(ptr long long)
|
@ stdcall EnumDateFormatsW(ptr long long)
|
||||||
@ stdcall EnumLanguageGroupLocalesA(ptr long long ptr)
|
@ stdcall EnumLanguageGroupLocalesA(ptr long long ptr)
|
||||||
|
@ -254,10 +254,10 @@
|
||||||
@ stdcall EnumSystemLanguageGroupsA(ptr long ptr)
|
@ stdcall EnumSystemLanguageGroupsA(ptr long ptr)
|
||||||
@ stdcall EnumSystemLanguageGroupsW(ptr long ptr)
|
@ stdcall EnumSystemLanguageGroupsW(ptr long ptr)
|
||||||
@ stdcall EnumSystemLocalesA(ptr long)
|
@ stdcall EnumSystemLocalesA(ptr long)
|
||||||
@ stub -version=0x600+ EnumSystemLocalesEx
|
@ stdcall -version=0x600+ EnumSystemLocalesEx(ptr long long ptr)
|
||||||
@ stdcall EnumSystemLocalesW(ptr long)
|
@ stdcall EnumSystemLocalesW(ptr long)
|
||||||
@ stdcall EnumTimeFormatsA(ptr long long)
|
@ stdcall EnumTimeFormatsA(ptr long long)
|
||||||
@ stub -version=0x600+ EnumTimeFormatsEx
|
@ stdcall -version=0x600+ EnumTimeFormatsEx(ptr wstr long long)
|
||||||
@ stdcall EnumTimeFormatsW(ptr long long)
|
@ stdcall EnumTimeFormatsW(ptr long long)
|
||||||
@ stdcall EnumUILanguagesA(ptr long long)
|
@ stdcall EnumUILanguagesA(ptr long long)
|
||||||
@ stdcall EnumUILanguagesW(ptr long long)
|
@ stdcall EnumUILanguagesW(ptr long long)
|
||||||
|
@ -360,7 +360,7 @@
|
||||||
@ stub -version=0x600+ GetCalendarDaysInMonth
|
@ stub -version=0x600+ GetCalendarDaysInMonth
|
||||||
@ stub -version=0x600+ GetCalendarDifferenceInDays
|
@ stub -version=0x600+ GetCalendarDifferenceInDays
|
||||||
@ stdcall GetCalendarInfoA(long long long ptr long ptr)
|
@ stdcall GetCalendarInfoA(long long long ptr long ptr)
|
||||||
@ stub -version=0x600+ GetCalendarInfoEx
|
@ stdcall -version=0x600+ GetCalendarInfoEx(wstr, long, wstr, long, wstr, long, ptr)
|
||||||
@ stdcall GetCalendarInfoW(long long long ptr long ptr)
|
@ stdcall GetCalendarInfoW(long long long ptr long ptr)
|
||||||
@ stub -version=0x600+ GetCalendarMonthsInYear
|
@ stub -version=0x600+ GetCalendarMonthsInYear
|
||||||
@ stub -version=0x600+ GetCalendarSupportedDateRange
|
@ stub -version=0x600+ GetCalendarSupportedDateRange
|
||||||
|
@ -436,7 +436,7 @@
|
||||||
@ stdcall -norelay GetCurrentThread()
|
@ stdcall -norelay GetCurrentThread()
|
||||||
@ stdcall -norelay GetCurrentThreadId()
|
@ stdcall -norelay GetCurrentThreadId()
|
||||||
@ stdcall GetDateFormatA(long long ptr str ptr long)
|
@ stdcall GetDateFormatA(long long ptr str ptr long)
|
||||||
@ stub -version=0x600+ GetDateFormatEx
|
@ stdcall -version=0x600+ GetDateFormatEx(wstr long ptr wstr wstr long wstr)
|
||||||
@ stdcall GetDateFormatW(long long ptr wstr ptr long)
|
@ stdcall GetDateFormatW(long long ptr wstr ptr long)
|
||||||
@ stdcall GetDefaultCommConfigA(str ptr long)
|
@ stdcall GetDefaultCommConfigA(str ptr long)
|
||||||
@ stdcall GetDefaultCommConfigW(wstr ptr long)
|
@ stdcall GetDefaultCommConfigW(wstr ptr long)
|
||||||
|
@ -496,8 +496,9 @@
|
||||||
@ stdcall -version=0x500-0x502 GetLinguistLangSize(ptr)
|
@ stdcall -version=0x500-0x502 GetLinguistLangSize(ptr)
|
||||||
@ stdcall GetLocalTime(ptr)
|
@ stdcall GetLocalTime(ptr)
|
||||||
@ stdcall GetLocaleInfoA(long long ptr long)
|
@ stdcall GetLocaleInfoA(long long ptr long)
|
||||||
@ stub -version=0x600+ GetLocaleInfoEx
|
@ stdcall -version=0x600+ GetLocaleInfoEx(wstr long ptr long)
|
||||||
@ stdcall GetLocaleInfoW(long long ptr long)
|
@ stdcall GetLocaleInfoW(long long ptr long)
|
||||||
|
@ stdcall -version=0x600+ IsValidLocaleName(wstr)
|
||||||
@ stdcall GetLogicalDriveStringsA(long ptr)
|
@ stdcall GetLogicalDriveStringsA(long ptr)
|
||||||
@ stdcall GetLogicalDriveStringsW(long ptr)
|
@ stdcall GetLogicalDriveStringsW(long ptr)
|
||||||
@ stdcall GetLogicalDrives()
|
@ stdcall GetLogicalDrives()
|
||||||
|
@ -514,7 +515,7 @@
|
||||||
@ stdcall GetModuleHandleExW(long ptr ptr)
|
@ stdcall GetModuleHandleExW(long ptr ptr)
|
||||||
@ stdcall GetModuleHandleW(wstr)
|
@ stdcall GetModuleHandleW(wstr)
|
||||||
@ stdcall GetNLSVersion(long long ptr)
|
@ stdcall GetNLSVersion(long long ptr)
|
||||||
@ stub -version=0x600+ GetNLSVersionEx
|
@ stdcall GetNLSVersionEx(long wstr ptr)
|
||||||
@ stub -version=0x600+ GetNamedPipeAttribute
|
@ stub -version=0x600+ GetNamedPipeAttribute
|
||||||
@ stub -version=0x600+ GetNamedPipeClientComputerNameA
|
@ stub -version=0x600+ GetNamedPipeClientComputerNameA
|
||||||
@ stub -version=0x600+ GetNamedPipeClientComputerNameW
|
@ stub -version=0x600+ GetNamedPipeClientComputerNameW
|
||||||
|
@ -534,7 +535,7 @@
|
||||||
@ stdcall GetNumaProcessorNode(long ptr)
|
@ stdcall GetNumaProcessorNode(long ptr)
|
||||||
@ stub -version=0x600+ GetNumaProximityNode
|
@ stub -version=0x600+ GetNumaProximityNode
|
||||||
@ stdcall GetNumberFormatA(long long str ptr ptr long)
|
@ stdcall GetNumberFormatA(long long str ptr ptr long)
|
||||||
@ stub -version=0x600+ GetNumberFormatEx
|
@ stdcall -version=0x600+ GetNumberFormatEx(wstr long wstr ptr wstr long)
|
||||||
@ stdcall GetNumberFormatW(long long wstr ptr ptr long)
|
@ stdcall GetNumberFormatW(long long wstr ptr ptr long)
|
||||||
@ stdcall GetNumberOfConsoleFonts()
|
@ stdcall GetNumberOfConsoleFonts()
|
||||||
@ stdcall GetNumberOfConsoleInputEvents(long ptr)
|
@ stdcall GetNumberOfConsoleInputEvents(long ptr)
|
||||||
|
@ -628,14 +629,14 @@
|
||||||
@ stdcall GetTickCount()
|
@ stdcall GetTickCount()
|
||||||
@ stub -version=0x600+ GetTickCount64
|
@ stub -version=0x600+ GetTickCount64
|
||||||
@ stdcall GetTimeFormatA(long long ptr str ptr long)
|
@ stdcall GetTimeFormatA(long long ptr str ptr long)
|
||||||
@ stub -version=0x600+ GetTimeFormatEx
|
@ stdcall -version=0x600+ GetTimeFormatEx(wstr long ptr wstr wstr long)
|
||||||
@ stdcall GetTimeFormatW(long long ptr wstr ptr long)
|
@ stdcall GetTimeFormatW(long long ptr wstr ptr long)
|
||||||
@ stdcall GetTimeZoneInformation(ptr)
|
@ stdcall GetTimeZoneInformation(ptr)
|
||||||
@ stub -version=0x600+ GetTimeZoneInformationForYear
|
@ stub -version=0x600+ GetTimeZoneInformationForYear
|
||||||
@ stub -version=0x600+ GetUILanguageInfo
|
@ stub -version=0x600+ GetUILanguageInfo
|
||||||
@ stdcall GetUserDefaultLCID()
|
@ stdcall GetUserDefaultLCID()
|
||||||
@ stdcall GetUserDefaultLangID()
|
@ stdcall GetUserDefaultLangID()
|
||||||
@ stub -version=0x600+ GetUserDefaultLocaleName
|
@ stdcall -version=0x600+ GetUserDefaultLocaleName(wstr long)
|
||||||
@ stdcall GetUserDefaultUILanguage()
|
@ stdcall GetUserDefaultUILanguage()
|
||||||
@ stdcall GetUserGeoID(long)
|
@ stdcall GetUserGeoID(long)
|
||||||
@ stub -version=0x600+ GetUserPreferredUILanguages
|
@ stub -version=0x600+ GetUserPreferredUILanguages
|
||||||
|
@ -754,7 +755,7 @@
|
||||||
@ stdcall IsWow64Process(ptr ptr)
|
@ stdcall IsWow64Process(ptr ptr)
|
||||||
@ stub -version=0x600+ LCIDToLocaleName
|
@ stub -version=0x600+ LCIDToLocaleName
|
||||||
@ stdcall LCMapStringA(long long str long ptr long)
|
@ stdcall LCMapStringA(long long str long ptr long)
|
||||||
@ stub -version=0x600+ LCMapStringEx
|
@ stdcall -version=0x600+ LCMapStringEx(long long wstr long ptr long ptr ptr long)
|
||||||
@ stdcall LCMapStringW(long long wstr long ptr long)
|
@ stdcall LCMapStringW(long long wstr long ptr long)
|
||||||
@ stdcall LZClose(long)
|
@ stdcall LZClose(long)
|
||||||
@ stdcall LZCloseFile(long)
|
@ stdcall LZCloseFile(long)
|
||||||
|
|
|
@ -56,7 +56,7 @@ static const WCHAR szLangGroupsKeyName[] = {
|
||||||
'L','a','n','g','u','a','g','e',' ','G','r','o','u','p','s',0
|
'L','a','n','g','u','a','g','e',' ','G','r','o','u','p','s',0
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef __REACTOS__
|
#if (WINVER >= 0x0600)
|
||||||
/* Charset to codepage map, sorted by name. */
|
/* Charset to codepage map, sorted by name. */
|
||||||
static const struct charset_entry
|
static const struct charset_entry
|
||||||
{
|
{
|
||||||
|
@ -262,6 +262,248 @@ static inline UINT get_lcid_codepage( LCID lcid )
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (WINVER >= 0x0600)
|
||||||
|
/***********************************************************************
|
||||||
|
* charset_cmp (internal)
|
||||||
|
*/
|
||||||
|
static int charset_cmp( const void *name, const void *entry )
|
||||||
|
{
|
||||||
|
const struct charset_entry *charset = entry;
|
||||||
|
return strcasecmp( name, charset->charset_name );
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* find_charset
|
||||||
|
*/
|
||||||
|
static UINT find_charset( const WCHAR *name )
|
||||||
|
{
|
||||||
|
const struct charset_entry *entry;
|
||||||
|
char charset_name[16];
|
||||||
|
size_t i, j;
|
||||||
|
|
||||||
|
/* remove punctuation characters from charset name */
|
||||||
|
for (i = j = 0; name[i] && j < sizeof(charset_name)-1; i++)
|
||||||
|
if (isalnum((unsigned char)name[i])) charset_name[j++] = name[i];
|
||||||
|
charset_name[j] = 0;
|
||||||
|
|
||||||
|
entry = bsearch( charset_name, charset_names, ARRAY_SIZE( charset_names ),
|
||||||
|
sizeof(charset_names[0]), charset_cmp );
|
||||||
|
if (entry) return entry->codepage;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static LANGID get_default_sublang( LANGID lang )
|
||||||
|
{
|
||||||
|
switch (lang)
|
||||||
|
{
|
||||||
|
case MAKELANGID( LANG_SPANISH, SUBLANG_NEUTRAL ):
|
||||||
|
return MAKELANGID( LANG_SPANISH, SUBLANG_SPANISH_MODERN );
|
||||||
|
case MAKELANGID( LANG_CHINESE, SUBLANG_NEUTRAL ):
|
||||||
|
return MAKELANGID( LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED );
|
||||||
|
case MAKELANGID( LANG_CHINESE, SUBLANG_CHINESE_SINGAPORE ):
|
||||||
|
return MAKELANGID( LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED );
|
||||||
|
case MAKELANGID( LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL ):
|
||||||
|
case MAKELANGID( LANG_CHINESE, SUBLANG_CHINESE_MACAU ):
|
||||||
|
return MAKELANGID( LANG_CHINESE, SUBLANG_CHINESE_HONGKONG );
|
||||||
|
}
|
||||||
|
if (SUBLANGID( lang ) == SUBLANG_NEUTRAL) lang = MAKELANGID( PRIMARYLANGID(lang), SUBLANG_DEFAULT );
|
||||||
|
return lang;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* find_locale_id_callback
|
||||||
|
*/
|
||||||
|
static BOOL CALLBACK find_locale_id_callback( HMODULE hModule, LPCWSTR type,
|
||||||
|
LPCWSTR name, LANGID lang, LPARAM lParam )
|
||||||
|
{
|
||||||
|
struct locale_name *data = (struct locale_name *)lParam;
|
||||||
|
WCHAR buffer[128];
|
||||||
|
int matches = 0;
|
||||||
|
LCID lcid = MAKELCID( lang, SORT_DEFAULT ); /* FIXME: handle sort order */
|
||||||
|
|
||||||
|
if (PRIMARYLANGID(lang) == LANG_NEUTRAL) return TRUE; /* continue search */
|
||||||
|
|
||||||
|
/* first check exact name */
|
||||||
|
if (data->win_name[0] &&
|
||||||
|
GetLocaleInfoW( lcid, LOCALE_SNAME | LOCALE_NOUSEROVERRIDE, buffer, ARRAY_SIZE( buffer )))
|
||||||
|
{
|
||||||
|
if (!strcmpiW( data->win_name, buffer ))
|
||||||
|
{
|
||||||
|
matches = 4; /* everything matches */
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!GetLocaleInfoW( lcid, LOCALE_SISO639LANGNAME | LOCALE_NOUSEROVERRIDE,
|
||||||
|
buffer, ARRAY_SIZE( buffer )))
|
||||||
|
return TRUE;
|
||||||
|
if (strcmpiW( buffer, data->lang )) return TRUE;
|
||||||
|
matches++; /* language name matched */
|
||||||
|
|
||||||
|
if (data->script)
|
||||||
|
{
|
||||||
|
if (GetLocaleInfoW( lcid, LOCALE_SSCRIPTS | LOCALE_NOUSEROVERRIDE,
|
||||||
|
buffer, ARRAY_SIZE( buffer )))
|
||||||
|
{
|
||||||
|
const WCHAR *p = buffer;
|
||||||
|
unsigned int len = strlenW( data->script );
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
if (!strncmpiW( p, data->script, len ) && (!p[len] || p[len] == ';')) break;
|
||||||
|
if (!(p = strchrW( p, ';'))) goto done;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
if (!*p) goto done;
|
||||||
|
matches++; /* script matched */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->country)
|
||||||
|
{
|
||||||
|
if (GetLocaleInfoW( lcid, LOCALE_SISO3166CTRYNAME|LOCALE_NOUSEROVERRIDE,
|
||||||
|
buffer, ARRAY_SIZE( buffer )))
|
||||||
|
{
|
||||||
|
if (strcmpiW( buffer, data->country )) goto done;
|
||||||
|
matches++; /* country name matched */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* match default language */
|
||||||
|
{
|
||||||
|
LANGID def_lang = data->script ? lang : MAKELANGID( PRIMARYLANGID(lang), LANG_NEUTRAL );
|
||||||
|
if (lang == get_default_sublang( def_lang )) matches++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->codepage)
|
||||||
|
{
|
||||||
|
UINT unix_cp;
|
||||||
|
if (GetLocaleInfoW( lcid, LOCALE_IDEFAULTUNIXCODEPAGE | LOCALE_RETURN_NUMBER,
|
||||||
|
(LPWSTR)&unix_cp, sizeof(unix_cp)/sizeof(WCHAR) ))
|
||||||
|
{
|
||||||
|
if (unix_cp == data->codepage) matches++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: check sort order */
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (matches > data->matches)
|
||||||
|
{
|
||||||
|
data->lcid = lcid;
|
||||||
|
data->matches = matches;
|
||||||
|
}
|
||||||
|
return (data->matches < 4); /* no need to continue for perfect match */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* parse_locale_name
|
||||||
|
*
|
||||||
|
* Parse a locale name into a struct locale_name, handling both Windows and Unix formats.
|
||||||
|
* Unix format is: lang[_country][.charset][@modifier]
|
||||||
|
* Windows format is: lang[-script][-country][_modifier]
|
||||||
|
*/
|
||||||
|
static void parse_locale_name( const WCHAR *str, struct locale_name *name )
|
||||||
|
{
|
||||||
|
static const WCHAR sepW[] = {'-','_','.','@',0};
|
||||||
|
static const WCHAR winsepW[] = {'-','_',0};
|
||||||
|
static const WCHAR posixW[] = {'P','O','S','I','X',0};
|
||||||
|
static const WCHAR cW[] = {'C',0};
|
||||||
|
static const WCHAR latinW[] = {'l','a','t','i','n',0};
|
||||||
|
static const WCHAR latnW[] = {'-','L','a','t','n',0};
|
||||||
|
WCHAR *p;
|
||||||
|
|
||||||
|
TRACE("%s\n", debugstr_w(str));
|
||||||
|
|
||||||
|
name->country = name->charset = name->script = name->modifier = NULL;
|
||||||
|
name->lcid = MAKELCID( MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT), SORT_DEFAULT );
|
||||||
|
name->matches = 0;
|
||||||
|
name->codepage = 0;
|
||||||
|
name->win_name[0] = 0;
|
||||||
|
lstrcpynW( name->lang, str, ARRAY_SIZE( name->lang ));
|
||||||
|
|
||||||
|
if (!*name->lang)
|
||||||
|
{
|
||||||
|
name->lcid = LOCALE_INVARIANT;
|
||||||
|
name->matches = 4;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(p = strpbrkW( name->lang, sepW )))
|
||||||
|
{
|
||||||
|
if (!strcmpW( name->lang, posixW ) || !strcmpW( name->lang, cW ))
|
||||||
|
{
|
||||||
|
name->matches = 4; /* perfect match for default English lcid */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
strcpyW( name->win_name, name->lang );
|
||||||
|
}
|
||||||
|
else if (*p == '-') /* Windows format */
|
||||||
|
{
|
||||||
|
strcpyW( name->win_name, name->lang );
|
||||||
|
*p++ = 0;
|
||||||
|
name->country = p;
|
||||||
|
if ((p = strpbrkW( p, winsepW )) && *p == '-')
|
||||||
|
{
|
||||||
|
*p++ = 0;
|
||||||
|
name->script = name->country;
|
||||||
|
name->country = p;
|
||||||
|
p = strpbrkW( p, winsepW );
|
||||||
|
}
|
||||||
|
if (p)
|
||||||
|
{
|
||||||
|
*p++ = 0;
|
||||||
|
name->modifier = p;
|
||||||
|
}
|
||||||
|
/* second value can be script or country, check length to resolve the ambiguity */
|
||||||
|
if (!name->script && strlenW( name->country ) == 4)
|
||||||
|
{
|
||||||
|
name->script = name->country;
|
||||||
|
name->country = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* Unix format */
|
||||||
|
{
|
||||||
|
if (*p == '_')
|
||||||
|
{
|
||||||
|
*p++ = 0;
|
||||||
|
name->country = p;
|
||||||
|
p = strpbrkW( p, sepW + 2 );
|
||||||
|
}
|
||||||
|
if (p && *p == '.')
|
||||||
|
{
|
||||||
|
*p++ = 0;
|
||||||
|
name->charset = p;
|
||||||
|
p = strchrW( p, '@' );
|
||||||
|
}
|
||||||
|
if (p)
|
||||||
|
{
|
||||||
|
*p++ = 0;
|
||||||
|
name->modifier = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name->charset)
|
||||||
|
name->codepage = find_charset( name->charset );
|
||||||
|
|
||||||
|
/* rebuild a Windows name if possible */
|
||||||
|
|
||||||
|
if (name->charset) goto done; /* can't specify charset in Windows format */
|
||||||
|
if (name->modifier && strcmpW( name->modifier, latinW ))
|
||||||
|
goto done; /* only Latn script supported for now */
|
||||||
|
strcpyW( name->win_name, name->lang );
|
||||||
|
if (name->modifier) strcatW( name->win_name, latnW );
|
||||||
|
if (name->country)
|
||||||
|
{
|
||||||
|
p = name->win_name + strlenW(name->win_name);
|
||||||
|
*p++ = '-';
|
||||||
|
strcpyW( p, name->country );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
EnumResourceLanguagesW( kernel32_handle, (LPCWSTR)RT_STRING, (LPCWSTR)LOCALE_ILANGUAGE,
|
||||||
|
find_locale_id_callback, (LPARAM)name );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* convert_default_lcid
|
* convert_default_lcid
|
||||||
*
|
*
|
||||||
|
@ -585,6 +827,52 @@ LANGID WINAPI GetSystemDefaultUILanguage(void)
|
||||||
return lang;
|
return lang;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (WINVER >= 0x0600)
|
||||||
|
/***********************************************************************
|
||||||
|
* LocaleNameToLCID (KERNEL32.@)
|
||||||
|
*/
|
||||||
|
LCID WINAPI LocaleNameToLCID( LPCWSTR name, DWORD flags )
|
||||||
|
{
|
||||||
|
struct locale_name locale_name;
|
||||||
|
static int once;
|
||||||
|
|
||||||
|
if (flags && !once++)
|
||||||
|
FIXME( "unsupported flags %x\n", flags );
|
||||||
|
|
||||||
|
if (name == LOCALE_NAME_USER_DEFAULT)
|
||||||
|
return GetUserDefaultLCID();
|
||||||
|
|
||||||
|
/* string parsing */
|
||||||
|
parse_locale_name( name, &locale_name );
|
||||||
|
|
||||||
|
TRACE( "found lcid %x for %s, matches %d\n",
|
||||||
|
locale_name.lcid, debugstr_w(name), locale_name.matches );
|
||||||
|
|
||||||
|
if (!locale_name.matches)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (locale_name.matches == 1)
|
||||||
|
WARN( "locale %s not recognized, defaulting to %s\n",
|
||||||
|
debugstr_w(name), debugstr_w(locale_name.lang) );
|
||||||
|
|
||||||
|
return locale_name.lcid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* LCIDToLocaleName (KERNEL32.@)
|
||||||
|
*/
|
||||||
|
INT WINAPI LCIDToLocaleName( LCID lcid, LPWSTR name, INT count, DWORD flags )
|
||||||
|
{
|
||||||
|
static int once;
|
||||||
|
if (flags && !once++) FIXME( "unsupported flags %x\n", flags );
|
||||||
|
|
||||||
|
return GetLocaleInfoW( lcid, LOCALE_SNAME | LOCALE_NOUSEROVERRIDE, name, count );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* get_registry_locale_info
|
* get_registry_locale_info
|
||||||
|
@ -965,6 +1253,41 @@ INT WINAPI GetLocaleInfoW( LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len )
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (WINVER >= 0x0600)
|
||||||
|
WINBASEAPI
|
||||||
|
int
|
||||||
|
WINAPI
|
||||||
|
GetLocaleInfoEx(
|
||||||
|
_In_opt_ LPCWSTR lpLocaleName,
|
||||||
|
_In_ LCTYPE LCType,
|
||||||
|
_Out_writes_opt_(cchData) LPWSTR lpLCData,
|
||||||
|
_In_ int cchData)
|
||||||
|
{
|
||||||
|
TRACE( "GetLocaleInfoEx not implemented (lcid=%s,lctype=0x%x,%s,%d)\n", debugstr_w(lpLocaleName), LCType, debugstr_w(lpLCData), cchData );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
IsValidLocaleName(
|
||||||
|
LPCWSTR lpLocaleName
|
||||||
|
)
|
||||||
|
{
|
||||||
|
TRACE( "IsValidLocaleName not implemented (lpLocaleName=%s)\n", debugstr_w(lpLocaleName));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
INT
|
||||||
|
WINAPI
|
||||||
|
GetUserDefaultLocaleName(
|
||||||
|
LPWSTR lpLocaleName,
|
||||||
|
INT cchLocaleName
|
||||||
|
)
|
||||||
|
{
|
||||||
|
TRACE( "GetUserDefaultLocaleName not implemented (lpLocaleName=%s, cchLocaleName=%d)\n", debugstr_w(lpLocaleName), cchLocaleName);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* SetLocaleInfoA [KERNEL32.@]
|
* SetLocaleInfoA [KERNEL32.@]
|
||||||
|
@ -1284,6 +1607,56 @@ BOOL WINAPI EnumSystemLocalesW( LOCALE_ENUMPROCW lpfnLocaleEnum, DWORD dwFlags )
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct enum_locale_ex_data
|
||||||
|
{
|
||||||
|
LOCALE_ENUMPROCEX proc;
|
||||||
|
DWORD flags;
|
||||||
|
LPARAM lparam;
|
||||||
|
};
|
||||||
|
|
||||||
|
static BOOL CALLBACK enum_locale_ex_proc( HMODULE module, LPCWSTR type,
|
||||||
|
LPCWSTR name, WORD lang, LONG_PTR lparam )
|
||||||
|
{
|
||||||
|
struct enum_locale_ex_data *data = (struct enum_locale_ex_data *)lparam;
|
||||||
|
WCHAR buffer[256];
|
||||||
|
DWORD neutral;
|
||||||
|
unsigned int flags;
|
||||||
|
|
||||||
|
GetLocaleInfoW( MAKELCID( lang, SORT_DEFAULT ), LOCALE_SNAME | LOCALE_NOUSEROVERRIDE,
|
||||||
|
buffer, ARRAY_SIZE( buffer ));
|
||||||
|
if (!GetLocaleInfoW( MAKELCID( lang, SORT_DEFAULT ),
|
||||||
|
LOCALE_INEUTRAL | LOCALE_NOUSEROVERRIDE | LOCALE_RETURN_NUMBER,
|
||||||
|
(LPWSTR)&neutral, sizeof(neutral) / sizeof(WCHAR) ))
|
||||||
|
neutral = 0;
|
||||||
|
flags = LOCALE_WINDOWS;
|
||||||
|
flags |= neutral ? LOCALE_NEUTRALDATA : LOCALE_SPECIFICDATA;
|
||||||
|
if (data->flags && !(data->flags & flags)) return TRUE;
|
||||||
|
return data->proc( buffer, flags, data->lparam );
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* EnumSystemLocalesEx (KERNEL32.@)
|
||||||
|
*/
|
||||||
|
BOOL WINAPI EnumSystemLocalesEx( LOCALE_ENUMPROCEX proc, DWORD flags, LPARAM lparam, LPVOID reserved )
|
||||||
|
{
|
||||||
|
struct enum_locale_ex_data data;
|
||||||
|
|
||||||
|
if (reserved)
|
||||||
|
{
|
||||||
|
SetLastError( ERROR_INVALID_PARAMETER );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
data.proc = proc;
|
||||||
|
data.flags = flags;
|
||||||
|
data.lparam = lparam;
|
||||||
|
EnumResourceLanguagesW( kernel32_handle, (LPCWSTR)RT_STRING,
|
||||||
|
(LPCWSTR)MAKEINTRESOURCE((LOCALE_SNAME >> 4) + 1),
|
||||||
|
enum_locale_ex_proc, (LONG_PTR)&data );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* VerLanguageNameA (KERNEL32.@)
|
* VerLanguageNameA (KERNEL32.@)
|
||||||
*
|
*
|
||||||
|
|
|
@ -124,7 +124,7 @@ static DWORD NLS_GetLocaleNumber(LCID lcid, DWORD dwFlags)
|
||||||
DWORD dwVal = 0;
|
DWORD dwVal = 0;
|
||||||
|
|
||||||
szBuff[0] = '\0';
|
szBuff[0] = '\0';
|
||||||
GetLocaleInfoW(lcid, dwFlags, szBuff, sizeof(szBuff) / sizeof(WCHAR));
|
GetLocaleInfoW(lcid, dwFlags, szBuff, ARRAY_SIZE(szBuff));
|
||||||
|
|
||||||
if (szBuff[0] && szBuff[1] == ';' && szBuff[2] != '0')
|
if (szBuff[0] && szBuff[1] == ';' && szBuff[2] != '0')
|
||||||
dwVal = (szBuff[0] - '0') * 10 + (szBuff[2] - '0');
|
dwVal = (szBuff[0] - '0') * 10 + (szBuff[2] - '0');
|
||||||
|
@ -149,7 +149,7 @@ static WCHAR* NLS_GetLocaleString(LCID lcid, DWORD dwFlags)
|
||||||
DWORD dwLen;
|
DWORD dwLen;
|
||||||
|
|
||||||
szBuff[0] = '\0';
|
szBuff[0] = '\0';
|
||||||
GetLocaleInfoW(lcid, dwFlags, szBuff, sizeof(szBuff) / sizeof(WCHAR));
|
GetLocaleInfoW(lcid, dwFlags, szBuff, ARRAY_SIZE(szBuff));
|
||||||
dwLen = strlenW(szBuff) + 1;
|
dwLen = strlenW(szBuff) + 1;
|
||||||
str = HeapAlloc(GetProcessHeap(), 0, dwLen * sizeof(WCHAR));
|
str = HeapAlloc(GetProcessHeap(), 0, dwLen * sizeof(WCHAR));
|
||||||
if (str)
|
if (str)
|
||||||
|
@ -278,7 +278,7 @@ static const NLS_FORMAT_NODE *NLS_GetFormats(LCID lcid, DWORD dwFlags)
|
||||||
GET_LOCALE_STRING(new_node->cyfmt.lpCurrencySymbol, LOCALE_SCURRENCY);
|
GET_LOCALE_STRING(new_node->cyfmt.lpCurrencySymbol, LOCALE_SCURRENCY);
|
||||||
|
|
||||||
/* Date/Time Format info, negative character, etc */
|
/* Date/Time Format info, negative character, etc */
|
||||||
for (i = 0; i < sizeof(NLS_LocaleIndices)/sizeof(NLS_LocaleIndices[0]); i++)
|
for (i = 0; i < ARRAY_SIZE(NLS_LocaleIndices); i++)
|
||||||
{
|
{
|
||||||
GET_LOCALE_STRING(new_node->lppszStrings[i], NLS_LocaleIndices[i]);
|
GET_LOCALE_STRING(new_node->lppszStrings[i], NLS_LocaleIndices[i]);
|
||||||
}
|
}
|
||||||
|
@ -322,7 +322,7 @@ static const NLS_FORMAT_NODE *NLS_GetFormats(LCID lcid, DWORD dwFlags)
|
||||||
/* We raced and lost: The node was already added by another thread.
|
/* We raced and lost: The node was already added by another thread.
|
||||||
* node points to the currently cached node, so free new_node.
|
* node points to the currently cached node, so free new_node.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < sizeof(NLS_LocaleIndices)/sizeof(NLS_LocaleIndices[0]); i++)
|
for (i = 0; i < ARRAY_SIZE(NLS_LocaleIndices); i++)
|
||||||
HeapFree(GetProcessHeap(), 0, new_node->lppszStrings[i]);
|
HeapFree(GetProcessHeap(), 0, new_node->lppszStrings[i]);
|
||||||
HeapFree(GetProcessHeap(), 0, new_node->fmt.lpDecimalSep);
|
HeapFree(GetProcessHeap(), 0, new_node->fmt.lpDecimalSep);
|
||||||
HeapFree(GetProcessHeap(), 0, new_node->fmt.lpThousandSep);
|
HeapFree(GetProcessHeap(), 0, new_node->fmt.lpThousandSep);
|
||||||
|
@ -697,7 +697,7 @@ static INT NLS_GetDateTimeFormatW(LCID lcid, DWORD dwFlags,
|
||||||
{
|
{
|
||||||
static const WCHAR fmtW[] = {'%','.','*','d',0};
|
static const WCHAR fmtW[] = {'%','.','*','d',0};
|
||||||
/* We have a numeric value to add */
|
/* We have a numeric value to add */
|
||||||
snprintfW(buff, sizeof(buff)/sizeof(WCHAR), fmtW, count, dwVal);
|
snprintfW(buff, ARRAY_SIZE(buff), fmtW, count, dwVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
dwLen = szAdd ? strlenW(szAdd) : 0;
|
dwLen = szAdd ? strlenW(szAdd) : 0;
|
||||||
|
@ -793,10 +793,10 @@ static INT NLS_GetDateTimeFormatA(LCID lcid, DWORD dwFlags,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lpFormat)
|
if (lpFormat)
|
||||||
MultiByteToWideChar(cp, 0, lpFormat, -1, szFormat, sizeof(szFormat)/sizeof(WCHAR));
|
MultiByteToWideChar(cp, 0, lpFormat, -1, szFormat, ARRAY_SIZE(szFormat));
|
||||||
|
|
||||||
if (cchOut > (int)(sizeof(szOut)/sizeof(WCHAR)))
|
if (cchOut > (int) ARRAY_SIZE(szOut))
|
||||||
cchOut = sizeof(szOut)/sizeof(WCHAR);
|
cchOut = ARRAY_SIZE(szOut);
|
||||||
|
|
||||||
szOut[0] = '\0';
|
szOut[0] = '\0';
|
||||||
|
|
||||||
|
@ -866,7 +866,7 @@ INT WINAPI GetDateFormatA( LCID lcid, DWORD dwFlags, const SYSTEMTIME* lpTime,
|
||||||
lpFormat, lpDateStr, cchOut);
|
lpFormat, lpDateStr, cchOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __REACTOS__
|
#if _WIN32_WINNT >= 0x600
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* GetDateFormatEx [KERNEL32.@]
|
* GetDateFormatEx [KERNEL32.@]
|
||||||
*
|
*
|
||||||
|
@ -906,7 +906,7 @@ INT WINAPI GetDateFormatEx(LPCWSTR localename, DWORD flags,
|
||||||
flags | DATE_DATEVARSONLY, date, format,
|
flags | DATE_DATEVARSONLY, date, format,
|
||||||
outbuf, bufsize);
|
outbuf, bufsize);
|
||||||
}
|
}
|
||||||
#endif /* !__REACTOS__ */
|
#endif /* _WIN32_WINNT >= 0x600 */
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* GetDateFormatW [KERNEL32.@]
|
* GetDateFormatW [KERNEL32.@]
|
||||||
|
@ -974,7 +974,7 @@ INT WINAPI GetTimeFormatA(LCID lcid, DWORD dwFlags, const SYSTEMTIME* lpTime,
|
||||||
lpFormat, lpTimeStr, cchOut);
|
lpFormat, lpTimeStr, cchOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __REACTOS__
|
#if _WIN32_WINNT >= 0x600
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* GetTimeFormatEx [KERNEL32.@]
|
* GetTimeFormatEx [KERNEL32.@]
|
||||||
*
|
*
|
||||||
|
@ -1006,7 +1006,7 @@ INT WINAPI GetTimeFormatEx(LPCWSTR localename, DWORD flags,
|
||||||
flags | TIME_TIMEVARSONLY, time, format,
|
flags | TIME_TIMEVARSONLY, time, format,
|
||||||
outbuf, bufsize);
|
outbuf, bufsize);
|
||||||
}
|
}
|
||||||
#endif /* !__REACTOS__ */
|
#endif /* _WIN32_WINNT >= 0x600 */
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* GetTimeFormatW [KERNEL32.@]
|
* GetTimeFormatW [KERNEL32.@]
|
||||||
|
@ -1087,21 +1087,21 @@ INT WINAPI GetNumberFormatA(LCID lcid, DWORD dwFlags,
|
||||||
pfmt = &fmt;
|
pfmt = &fmt;
|
||||||
if (lpFormat->lpDecimalSep)
|
if (lpFormat->lpDecimalSep)
|
||||||
{
|
{
|
||||||
MultiByteToWideChar(cp, 0, lpFormat->lpDecimalSep, -1, szDec, sizeof(szDec)/sizeof(WCHAR));
|
MultiByteToWideChar(cp, 0, lpFormat->lpDecimalSep, -1, szDec, ARRAY_SIZE(szDec));
|
||||||
fmt.lpDecimalSep = szDec;
|
fmt.lpDecimalSep = szDec;
|
||||||
}
|
}
|
||||||
if (lpFormat->lpThousandSep)
|
if (lpFormat->lpThousandSep)
|
||||||
{
|
{
|
||||||
MultiByteToWideChar(cp, 0, lpFormat->lpThousandSep, -1, szGrp, sizeof(szGrp)/sizeof(WCHAR));
|
MultiByteToWideChar(cp, 0, lpFormat->lpThousandSep, -1, szGrp, ARRAY_SIZE(szGrp));
|
||||||
fmt.lpThousandSep = szGrp;
|
fmt.lpThousandSep = szGrp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lpszValue)
|
if (lpszValue)
|
||||||
MultiByteToWideChar(cp, 0, lpszValue, -1, szIn, sizeof(szIn)/sizeof(WCHAR));
|
MultiByteToWideChar(cp, 0, lpszValue, -1, szIn, ARRAY_SIZE(szIn));
|
||||||
|
|
||||||
if (cchOut > (int)(sizeof(szOut)/sizeof(WCHAR)))
|
if (cchOut > (int) ARRAY_SIZE(szOut))
|
||||||
cchOut = sizeof(szOut)/sizeof(WCHAR);
|
cchOut = ARRAY_SIZE(szOut);
|
||||||
|
|
||||||
szOut[0] = '\0';
|
szOut[0] = '\0';
|
||||||
|
|
||||||
|
@ -1136,7 +1136,7 @@ INT WINAPI GetNumberFormatW(LCID lcid, DWORD dwFlags,
|
||||||
LPCWSTR lpszValue, const NUMBERFMTW *lpFormat,
|
LPCWSTR lpszValue, const NUMBERFMTW *lpFormat,
|
||||||
LPWSTR lpNumberStr, int cchOut)
|
LPWSTR lpNumberStr, int cchOut)
|
||||||
{
|
{
|
||||||
WCHAR szBuff[128], *szOut = szBuff + sizeof(szBuff) / sizeof(WCHAR) - 1;
|
WCHAR szBuff[128], *szOut = szBuff + ARRAY_SIZE(szBuff) - 1;
|
||||||
WCHAR szNegBuff[8];
|
WCHAR szNegBuff[8];
|
||||||
const WCHAR *lpszNeg = NULL, *lpszNegStart, *szSrc;
|
const WCHAR *lpszNeg = NULL, *lpszNegStart, *szSrc;
|
||||||
DWORD dwState = 0, dwDecimals = 0, dwGroupCount = 0, dwCurrentGroupCount = 0;
|
DWORD dwState = 0, dwDecimals = 0, dwGroupCount = 0, dwCurrentGroupCount = 0;
|
||||||
|
@ -1164,7 +1164,7 @@ INT WINAPI GetNumberFormatW(LCID lcid, DWORD dwFlags,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GetLocaleInfoW(lcid, LOCALE_SNEGATIVESIGN|(dwFlags & LOCALE_NOUSEROVERRIDE),
|
GetLocaleInfoW(lcid, LOCALE_SNEGATIVESIGN|(dwFlags & LOCALE_NOUSEROVERRIDE),
|
||||||
szNegBuff, sizeof(szNegBuff)/sizeof(WCHAR));
|
szNegBuff, ARRAY_SIZE(szNegBuff));
|
||||||
lpszNegStart = lpszNeg = szNegBuff;
|
lpszNegStart = lpszNeg = szNegBuff;
|
||||||
}
|
}
|
||||||
lpszNeg = lpszNeg + strlenW(lpszNeg) - 1;
|
lpszNeg = lpszNeg + strlenW(lpszNeg) - 1;
|
||||||
|
@ -1368,7 +1368,7 @@ error:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __REACTOS__
|
#if _WIN32_WINNT >= 0x600
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* GetNumberFormatEx (KERNEL32.@)
|
* GetNumberFormatEx (KERNEL32.@)
|
||||||
*/
|
*/
|
||||||
|
@ -1387,7 +1387,7 @@ INT WINAPI GetNumberFormatEx(LPCWSTR name, DWORD flags,
|
||||||
|
|
||||||
return GetNumberFormatW(lcid, flags, value, format, number, numout);
|
return GetNumberFormatW(lcid, flags, value, format, number, numout);
|
||||||
}
|
}
|
||||||
#endif /* !__REACTOS__ */
|
#endif /* _WIN32_WINNT >= 0x600 */
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* GetCurrencyFormatA (KERNEL32.@)
|
* GetCurrencyFormatA (KERNEL32.@)
|
||||||
|
@ -1453,26 +1453,26 @@ INT WINAPI GetCurrencyFormatA(LCID lcid, DWORD dwFlags,
|
||||||
pfmt = &fmt;
|
pfmt = &fmt;
|
||||||
if (lpFormat->lpDecimalSep)
|
if (lpFormat->lpDecimalSep)
|
||||||
{
|
{
|
||||||
MultiByteToWideChar(cp, 0, lpFormat->lpDecimalSep, -1, szDec, sizeof(szDec)/sizeof(WCHAR));
|
MultiByteToWideChar(cp, 0, lpFormat->lpDecimalSep, -1, szDec, ARRAY_SIZE(szDec));
|
||||||
fmt.lpDecimalSep = szDec;
|
fmt.lpDecimalSep = szDec;
|
||||||
}
|
}
|
||||||
if (lpFormat->lpThousandSep)
|
if (lpFormat->lpThousandSep)
|
||||||
{
|
{
|
||||||
MultiByteToWideChar(cp, 0, lpFormat->lpThousandSep, -1, szGrp, sizeof(szGrp)/sizeof(WCHAR));
|
MultiByteToWideChar(cp, 0, lpFormat->lpThousandSep, -1, szGrp, ARRAY_SIZE(szGrp));
|
||||||
fmt.lpThousandSep = szGrp;
|
fmt.lpThousandSep = szGrp;
|
||||||
}
|
}
|
||||||
if (lpFormat->lpCurrencySymbol)
|
if (lpFormat->lpCurrencySymbol)
|
||||||
{
|
{
|
||||||
MultiByteToWideChar(cp, 0, lpFormat->lpCurrencySymbol, -1, szCy, sizeof(szCy)/sizeof(WCHAR));
|
MultiByteToWideChar(cp, 0, lpFormat->lpCurrencySymbol, -1, szCy, ARRAY_SIZE(szCy));
|
||||||
fmt.lpCurrencySymbol = szCy;
|
fmt.lpCurrencySymbol = szCy;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lpszValue)
|
if (lpszValue)
|
||||||
MultiByteToWideChar(cp, 0, lpszValue, -1, szIn, sizeof(szIn)/sizeof(WCHAR));
|
MultiByteToWideChar(cp, 0, lpszValue, -1, szIn, ARRAY_SIZE(szIn));
|
||||||
|
|
||||||
if (cchOut > (int)(sizeof(szOut)/sizeof(WCHAR)))
|
if (cchOut > (int) ARRAY_SIZE(szOut))
|
||||||
cchOut = sizeof(szOut)/sizeof(WCHAR);
|
cchOut = ARRAY_SIZE(szOut);
|
||||||
|
|
||||||
szOut[0] = '\0';
|
szOut[0] = '\0';
|
||||||
|
|
||||||
|
@ -1528,7 +1528,7 @@ INT WINAPI GetCurrencyFormatW(LCID lcid, DWORD dwFlags,
|
||||||
CF_CY_LEFT|CF_CY_SPACE, /* $ 1.1 */
|
CF_CY_LEFT|CF_CY_SPACE, /* $ 1.1 */
|
||||||
CF_CY_RIGHT|CF_CY_SPACE, /* 1.1 $ */
|
CF_CY_RIGHT|CF_CY_SPACE, /* 1.1 $ */
|
||||||
};
|
};
|
||||||
WCHAR szBuff[128], *szOut = szBuff + sizeof(szBuff) / sizeof(WCHAR) - 1;
|
WCHAR szBuff[128], *szOut = szBuff + ARRAY_SIZE(szBuff) - 1;
|
||||||
WCHAR szNegBuff[8];
|
WCHAR szNegBuff[8];
|
||||||
const WCHAR *lpszNeg = NULL, *lpszNegStart, *szSrc, *lpszCy, *lpszCyStart;
|
const WCHAR *lpszNeg = NULL, *lpszNegStart, *szSrc, *lpszCy, *lpszCyStart;
|
||||||
DWORD dwState = 0, dwDecimals = 0, dwGroupCount = 0, dwCurrentGroupCount = 0, dwFmt;
|
DWORD dwState = 0, dwDecimals = 0, dwGroupCount = 0, dwCurrentGroupCount = 0, dwFmt;
|
||||||
|
@ -1559,7 +1559,7 @@ INT WINAPI GetCurrencyFormatW(LCID lcid, DWORD dwFlags,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GetLocaleInfoW(lcid, LOCALE_SNEGATIVESIGN|(dwFlags & LOCALE_NOUSEROVERRIDE),
|
GetLocaleInfoW(lcid, LOCALE_SNEGATIVESIGN|(dwFlags & LOCALE_NOUSEROVERRIDE),
|
||||||
szNegBuff, sizeof(szNegBuff)/sizeof(WCHAR));
|
szNegBuff, ARRAY_SIZE(szNegBuff));
|
||||||
lpszNegStart = lpszNeg = szNegBuff;
|
lpszNegStart = lpszNeg = szNegBuff;
|
||||||
}
|
}
|
||||||
dwFlags &= (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
|
dwFlags &= (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
|
||||||
|
@ -1782,6 +1782,21 @@ error:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if _WIN32_WINNT >= 0x600
|
||||||
|
/***********************************************************************
|
||||||
|
* GetCurrencyFormatEx (KERNEL32.@)
|
||||||
|
*/
|
||||||
|
int WINAPI GetCurrencyFormatEx(LPCWSTR localename, DWORD flags, LPCWSTR value,
|
||||||
|
const CURRENCYFMTW *format, LPWSTR str, int len)
|
||||||
|
{
|
||||||
|
TRACE("(%s,0x%08x,%s,%p,%p,%d)\n", debugstr_w(localename), flags,
|
||||||
|
debugstr_w(value), format, str, len);
|
||||||
|
|
||||||
|
return GetCurrencyFormatW( LocaleNameToLCID(localename, 0), flags, value, format, str, len);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* FIXME: Everything below here needs to move somewhere else along with the
|
/* FIXME: Everything below here needs to move somewhere else along with the
|
||||||
* other EnumXXX functions, when a method for storing resources for
|
* other EnumXXX functions, when a method for storing resources for
|
||||||
* alternate calendars is determined.
|
* alternate calendars is determined.
|
||||||
|
@ -1854,9 +1869,9 @@ static BOOL NLS_EnumDateFormats(const struct enumdateformats_context *ctxt)
|
||||||
|
|
||||||
lctype |= ctxt->flags & LOCALE_USE_CP_ACP;
|
lctype |= ctxt->flags & LOCALE_USE_CP_ACP;
|
||||||
if (ctxt->unicode)
|
if (ctxt->unicode)
|
||||||
ret = GetLocaleInfoW(ctxt->lcid, lctype, bufW, sizeof(bufW)/sizeof(bufW[0]));
|
ret = GetLocaleInfoW(ctxt->lcid, lctype, bufW, ARRAY_SIZE(bufW));
|
||||||
else
|
else
|
||||||
ret = GetLocaleInfoA(ctxt->lcid, lctype, bufA, sizeof(bufA)/sizeof(bufA[0]));
|
ret = GetLocaleInfoA(ctxt->lcid, lctype, bufA, ARRAY_SIZE(bufA));
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
|
@ -1949,7 +1964,7 @@ BOOL WINAPI EnumDateFormatsW(DATEFMT_ENUMPROCW proc, LCID lcid, DWORD flags)
|
||||||
return NLS_EnumDateFormats(&ctxt);
|
return NLS_EnumDateFormats(&ctxt);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __REACTOS__
|
#if _WIN32_WINNT >= 0x600
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* EnumDateFormatsExEx (KERNEL32.@)
|
* EnumDateFormatsExEx (KERNEL32.@)
|
||||||
*/
|
*/
|
||||||
|
@ -1966,7 +1981,7 @@ BOOL WINAPI EnumDateFormatsExEx(DATEFMT_ENUMPROCEXEX proc, const WCHAR *locale,
|
||||||
|
|
||||||
return NLS_EnumDateFormats(&ctxt);
|
return NLS_EnumDateFormats(&ctxt);
|
||||||
}
|
}
|
||||||
#endif /* !__REACTOS__ */
|
#endif /* _WIN32_WINNT >= 0x600 */
|
||||||
|
|
||||||
struct enumtimeformats_context {
|
struct enumtimeformats_context {
|
||||||
enum enum_callback_type type; /* callback kind */
|
enum enum_callback_type type; /* callback kind */
|
||||||
|
@ -2009,9 +2024,9 @@ static BOOL NLS_EnumTimeFormats(struct enumtimeformats_context *ctxt)
|
||||||
|
|
||||||
lctype |= ctxt->flags & LOCALE_USE_CP_ACP;
|
lctype |= ctxt->flags & LOCALE_USE_CP_ACP;
|
||||||
if (ctxt->unicode)
|
if (ctxt->unicode)
|
||||||
ret = GetLocaleInfoW(ctxt->lcid, lctype, bufW, sizeof(bufW)/sizeof(bufW[0]));
|
ret = GetLocaleInfoW(ctxt->lcid, lctype, bufW, ARRAY_SIZE(bufW));
|
||||||
else
|
else
|
||||||
ret = GetLocaleInfoA(ctxt->lcid, lctype, bufA, sizeof(bufA)/sizeof(bufA[0]));
|
ret = GetLocaleInfoA(ctxt->lcid, lctype, bufA, ARRAY_SIZE(bufA));
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
|
@ -2073,7 +2088,7 @@ BOOL WINAPI EnumTimeFormatsW(TIMEFMT_ENUMPROCW proc, LCID lcid, DWORD flags)
|
||||||
return NLS_EnumTimeFormats(&ctxt);
|
return NLS_EnumTimeFormats(&ctxt);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __REACTOS__
|
#if _WIN32_WINNT >= 0x600
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* EnumTimeFormatsEx (KERNEL32.@)
|
* EnumTimeFormatsEx (KERNEL32.@)
|
||||||
*/
|
*/
|
||||||
|
@ -2090,7 +2105,7 @@ BOOL WINAPI EnumTimeFormatsEx(TIMEFMT_ENUMPROCEX proc, const WCHAR *locale, DWOR
|
||||||
|
|
||||||
return NLS_EnumTimeFormats(&ctxt);
|
return NLS_EnumTimeFormats(&ctxt);
|
||||||
}
|
}
|
||||||
#endif /* !__REACTOS__ */
|
#endif /* _WIN32_WINNT >= 0x600 */
|
||||||
|
|
||||||
struct enumcalendar_context {
|
struct enumcalendar_context {
|
||||||
enum enum_callback_type type; /* callback kind */
|
enum enum_callback_type type; /* callback kind */
|
||||||
|
@ -2321,7 +2336,7 @@ BOOL WINAPI EnumCalendarInfoExW( CALINFO_ENUMPROCEXW calinfoproc,LCID locale,
|
||||||
return NLS_EnumCalendarInfo(&ctxt);
|
return NLS_EnumCalendarInfo(&ctxt);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __REACTOS__
|
#if _WIN32_WINNT >= 0x600
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* EnumCalendarInfoExEx [KERNEL32.@]
|
* EnumCalendarInfoExEx [KERNEL32.@]
|
||||||
*/
|
*/
|
||||||
|
@ -2341,7 +2356,7 @@ BOOL WINAPI EnumCalendarInfoExEx( CALINFO_ENUMPROCEXEX calinfoproc, LPCWSTR loca
|
||||||
ctxt.unicode = TRUE;
|
ctxt.unicode = TRUE;
|
||||||
return NLS_EnumCalendarInfo(&ctxt);
|
return NLS_EnumCalendarInfo(&ctxt);
|
||||||
}
|
}
|
||||||
#endif /* !__REACTOS__ */
|
#endif /* _WIN32_WINNT >= 0x600 */
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* GetCalendarInfoA (KERNEL32.@)
|
* GetCalendarInfoA (KERNEL32.@)
|
||||||
|
@ -2567,6 +2582,23 @@ int WINAPI GetCalendarInfoW(LCID Locale, CALID Calendar, CALTYPE CalType,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if _WIN32_WINNT >= 0x600
|
||||||
|
/*********************************************************************
|
||||||
|
* GetCalendarInfoEx (KERNEL32.@)
|
||||||
|
*/
|
||||||
|
int WINAPI GetCalendarInfoEx(LPCWSTR locale, CALID calendar, LPCWSTR lpReserved, CALTYPE caltype,
|
||||||
|
LPWSTR data, int len, DWORD *value)
|
||||||
|
{
|
||||||
|
static int once;
|
||||||
|
|
||||||
|
LCID lcid = LocaleNameToLCID(locale, 0);
|
||||||
|
if (!once++)
|
||||||
|
FIXME("(%s, %d, %p, 0x%08x, %p, %d, %p): semi-stub\n", debugstr_w(locale), calendar, lpReserved, caltype,
|
||||||
|
data, len, value);
|
||||||
|
return GetCalendarInfoW(lcid, calendar, caltype, data, len, value);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* SetCalendarInfoA (KERNEL32.@)
|
* SetCalendarInfoA (KERNEL32.@)
|
||||||
*
|
*
|
||||||
|
|
|
@ -2261,4 +2261,17 @@ GetNLSVersion(IN NLS_FUNCTION Function,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
GetNLSVersionEx(IN NLS_FUNCTION function,
|
||||||
|
IN LPCWSTR lpLocaleName,
|
||||||
|
IN OUT LPNLSVERSIONINFOEX lpVersionInformation)
|
||||||
|
{
|
||||||
|
STUB;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -283,7 +283,7 @@ kernel32 -
|
||||||
reactos/dll/win32/kernel32/winnls/string/fold.c # Synced to WineStaging-3.3
|
reactos/dll/win32/kernel32/winnls/string/fold.c # Synced to WineStaging-3.3
|
||||||
reactos/dll/win32/kernel32/winnls/string/format_msg.c # Synced to WineStaging-3.3
|
reactos/dll/win32/kernel32/winnls/string/format_msg.c # Synced to WineStaging-3.3
|
||||||
reactos/dll/win32/kernel32/winnls/string/lang.c # Synced in r52754
|
reactos/dll/win32/kernel32/winnls/string/lang.c # Synced in r52754
|
||||||
reactos/dll/win32/kernel32/winnls/string/lcformat.c # Synced to WineStaging-3.3
|
reactos/dll/win32/kernel32/winnls/string/lcformat.c # Synced to WineStaging-3.21
|
||||||
reactos/dll/win32/kernel32/winnls/string/nls.c # Synced in r52754
|
reactos/dll/win32/kernel32/winnls/string/nls.c # Synced in r52754
|
||||||
reactos/dll/win32/kernel32/winnls/string/sortkey.c # Synced to WineStaging-3.3
|
reactos/dll/win32/kernel32/winnls/string/sortkey.c # Synced to WineStaging-3.3
|
||||||
|
|
||||||
|
|
|
@ -198,6 +198,15 @@ extern "C" {
|
||||||
#define LCID_INSTALLED 1
|
#define LCID_INSTALLED 1
|
||||||
#define LCID_SUPPORTED 2
|
#define LCID_SUPPORTED 2
|
||||||
#define LCID_ALTERNATE_SORTS 4
|
#define LCID_ALTERNATE_SORTS 4
|
||||||
|
|
||||||
|
#define LOCALE_ALL 0x00
|
||||||
|
#define LOCALE_WINDOWS 0x01
|
||||||
|
#define LOCALE_SUPPLEMENTAL 0x02
|
||||||
|
#define LOCALE_ALTERNATE_SORTS 0x04
|
||||||
|
#define LOCALE_REPLACEMENT 0x08
|
||||||
|
#define LOCALE_NEUTRALDATA 0x10
|
||||||
|
#define LOCALE_SPECIFICDATA 0x20
|
||||||
|
|
||||||
#define MAP_FOLDCZONE 16
|
#define MAP_FOLDCZONE 16
|
||||||
#define MAP_FOLDDIGITS 128
|
#define MAP_FOLDDIGITS 128
|
||||||
#define MAP_PRECOMPOSED 32
|
#define MAP_PRECOMPOSED 32
|
||||||
|
@ -611,6 +620,13 @@ typedef struct nlsversioninfo {
|
||||||
DWORD dwNLSVersion;
|
DWORD dwNLSVersion;
|
||||||
DWORD dwDefinedVersion;
|
DWORD dwDefinedVersion;
|
||||||
} NLSVERSIONINFO,*LPNLSVERSIONINFO;
|
} NLSVERSIONINFO,*LPNLSVERSIONINFO;
|
||||||
|
typedef struct _nlsversioninfoex {
|
||||||
|
DWORD dwNLSVersionInfoSize;
|
||||||
|
DWORD dwNLSVersion;
|
||||||
|
DWORD dwDefinedVersion;
|
||||||
|
DWORD dwEffectiveId;
|
||||||
|
GUID guidCustomVersion;
|
||||||
|
} NLSVERSIONINFOEX, *LPNLSVERSIONINFOEX;
|
||||||
typedef struct _numberfmtA {
|
typedef struct _numberfmtA {
|
||||||
UINT NumDigits;
|
UINT NumDigits;
|
||||||
UINT LeadingZero;
|
UINT LeadingZero;
|
||||||
|
@ -760,6 +776,7 @@ GetCurrencyFormatW(
|
||||||
|
|
||||||
int WINAPI GetDateFormatA(LCID,DWORD,const SYSTEMTIME*,LPCSTR,LPSTR,int);
|
int WINAPI GetDateFormatA(LCID,DWORD,const SYSTEMTIME*,LPCSTR,LPSTR,int);
|
||||||
int WINAPI GetDateFormatW(LCID,DWORD,const SYSTEMTIME*,LPCWSTR,LPWSTR,int);
|
int WINAPI GetDateFormatW(LCID,DWORD,const SYSTEMTIME*,LPCWSTR,LPWSTR,int);
|
||||||
|
int WINAPI GetDateFormatEx(LPCWSTR,DWORD,const SYSTEMTIME*,LPCWSTR,LPWSTR,int,LPCWSTR);
|
||||||
|
|
||||||
int
|
int
|
||||||
WINAPI
|
WINAPI
|
||||||
|
@ -797,6 +814,13 @@ GetLocaleInfoW(
|
||||||
|
|
||||||
BOOL WINAPI GetNLSVersion(_In_ NLS_FUNCTION, _In_ LCID, _Inout_ LPNLSVERSIONINFO);
|
BOOL WINAPI GetNLSVersion(_In_ NLS_FUNCTION, _In_ LCID, _Inout_ LPNLSVERSIONINFO);
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
GetNLSVersionEx(
|
||||||
|
_In_ NLS_FUNCTION function,
|
||||||
|
_In_ LPCWSTR lpLocaleName,
|
||||||
|
_Inout_ LPNLSVERSIONINFOEX lpVersionInformation);
|
||||||
|
|
||||||
int
|
int
|
||||||
WINAPI
|
WINAPI
|
||||||
GetNumberFormatA(
|
GetNumberFormatA(
|
||||||
|
@ -859,6 +883,7 @@ LCID WINAPI GetSystemDefaultLCID(void);
|
||||||
LCID WINAPI GetThreadLocale(void);
|
LCID WINAPI GetThreadLocale(void);
|
||||||
int WINAPI GetTimeFormatA(LCID,DWORD,const SYSTEMTIME*,LPCSTR,LPSTR,int);
|
int WINAPI GetTimeFormatA(LCID,DWORD,const SYSTEMTIME*,LPCSTR,LPSTR,int);
|
||||||
int WINAPI GetTimeFormatW(LCID,DWORD,const SYSTEMTIME*,LPCWSTR,LPWSTR,int);
|
int WINAPI GetTimeFormatW(LCID,DWORD,const SYSTEMTIME*,LPCWSTR,LPWSTR,int);
|
||||||
|
int WINAPI GetTimeFormatEx(LPCWSTR,DWORD,const SYSTEMTIME*,LPCWSTR,LPWSTR,int);
|
||||||
LANGID WINAPI GetUserDefaultLangID(void);
|
LANGID WINAPI GetUserDefaultLangID(void);
|
||||||
LCID WINAPI GetUserDefaultLCID(void);
|
LCID WINAPI GetUserDefaultLCID(void);
|
||||||
GEOID WINAPI GetUserGeoID(_In_ GEOCLASS);
|
GEOID WINAPI GetUserGeoID(_In_ GEOCLASS);
|
||||||
|
@ -978,6 +1003,8 @@ GetLocaleInfoEx(
|
||||||
_Out_writes_opt_(cchData) LPWSTR lpLCData,
|
_Out_writes_opt_(cchData) LPWSTR lpLCData,
|
||||||
_In_ int cchData);
|
_In_ int cchData);
|
||||||
|
|
||||||
|
BOOL WINAPI IsValidLocaleName(_In_ LPCWSTR lpLocaleName);
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
WINAPI
|
WINAPI
|
||||||
GetProcessPreferredUILanguages(
|
GetProcessPreferredUILanguages(
|
||||||
|
@ -1076,6 +1103,8 @@ GetStringScripts(
|
||||||
BOOL WINAPI SetProcessPreferredUILanguages(_In_ DWORD, _In_opt_ PCZZWSTR, _Out_opt_ PULONG);
|
BOOL WINAPI SetProcessPreferredUILanguages(_In_ DWORD, _In_opt_ PCZZWSTR, _Out_opt_ PULONG);
|
||||||
BOOL WINAPI SetThreadPreferredUILanguages(_In_ DWORD, _In_opt_ PCZZWSTR, _Out_opt_ PULONG);
|
BOOL WINAPI SetThreadPreferredUILanguages(_In_ DWORD, _In_opt_ PCZZWSTR, _Out_opt_ PULONG);
|
||||||
BOOL WINAPI VerifyScripts(_In_ DWORD, _In_ LPCWSTR, _In_ int, _In_ LPCWSTR, _In_ int);
|
BOOL WINAPI VerifyScripts(_In_ DWORD, _In_ LPCWSTR, _In_ int, _In_ LPCWSTR, _In_ int);
|
||||||
|
INT WINAPI LCMapStringEx(_In_ LPCWSTR, _In_ DWORD, _In_ LPCWSTR, _In_ INT, _Out_opt_ LPWSTR, _In_ INT, _In_ LPNLSVERSIONINFO, _In_ LPVOID, _In_ LPARAM);
|
||||||
|
LCID WINAPI LocaleNameToLCID(_In_ LPCWSTR, _In_ DWORD);
|
||||||
|
|
||||||
#endif /* (WINVER >= 0x0600) */
|
#endif /* (WINVER >= 0x0600) */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue