[1/2] kernel32: Handle LOCALE_NAME_USER_DEFAULT with tests
André Hentschel
nerv at dawncrow.de
Wed Mar 7 08:58:27 CST 2012
needed for LCMapStringEx
as of [1] it seems that 0x7F really has no define
[1] http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.invariantculture%28v=vs.71%29.aspx
---
dlls/kernel32/locale.c | 4 ++++
dlls/kernel32/tests/locale.c | 42 ++++++++++++++++++++++++++++++++++++++++++
include/winnls.h | 20 ++++++++++++++++++++
3 files changed, 66 insertions(+), 0 deletions(-)
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index 2c3760c..20451ff 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -976,6 +976,10 @@ LCID WINAPI LocaleNameToLCID( LPCWSTR name, DWORD flags )
if (flags) 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",
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index f5b77f7..49678ce 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -71,6 +71,8 @@ static BOOL (WINAPI *pEnumSystemLanguageGroupsA)(LANGUAGEGROUP_ENUMPROC, DWORD,
static BOOL (WINAPI *pEnumLanguageGroupLocalesA)(LANGGROUPLOCALE_ENUMPROC, LGRPID, DWORD, LONG_PTR);
static BOOL (WINAPI *pEnumUILanguagesA)(UILANGUAGE_ENUMPROC, DWORD, LONG_PTR);
static BOOL (WINAPI *pEnumSystemLocalesEx)(LOCALE_ENUMPROCEX, DWORD, LPARAM, LPVOID);
+static LCID (WINAPI *pLocaleNameToLCID)(LPCWSTR, DWORD);
+static INT (WINAPI *pLCIDToLocaleName)(LCID, LPWSTR, INT, DWORD);
static INT (WINAPI *pFoldStringA)(DWORD, LPCSTR, INT, LPSTR, INT);
static INT (WINAPI *pFoldStringW)(DWORD, LPCWSTR, INT, LPWSTR, INT);
static BOOL (WINAPI *pIsValidLanguageGroup)(LGRPID, DWORD);
@@ -80,6 +82,8 @@ static void InitFunctionPointers(void)
hKernel32 = GetModuleHandleA("kernel32");
pEnumSystemLanguageGroupsA = (void*)GetProcAddress(hKernel32, "EnumSystemLanguageGroupsA");
pEnumLanguageGroupLocalesA = (void*)GetProcAddress(hKernel32, "EnumLanguageGroupLocalesA");
+ pLocaleNameToLCID = (void*)GetProcAddress(hKernel32, "LocaleNameToLCID");
+ pLCIDToLocaleName = (void*)GetProcAddress(hKernel32, "LCIDToLocaleName");
pFoldStringA = (void*)GetProcAddress(hKernel32, "FoldStringA");
pFoldStringW = (void*)GetProcAddress(hKernel32, "FoldStringW");
pIsValidLanguageGroup = (void*)GetProcAddress(hKernel32, "IsValidLanguageGroup");
@@ -1637,6 +1641,43 @@ static void test_LCMapStringW(void)
"unexpected error code %d\n", GetLastError());
}
+static void test_LocaleNames(void)
+{
+ LCID lcid;
+ INT ret;
+ WCHAR buffer[LOCALE_NAME_MAX_LENGTH];
+
+ if (!pLocaleNameToLCID)
+ {
+ win_skip( "LocaleNameToLCID not available\n" );
+ return;
+ }
+
+ /* special cases */
+ buffer[0] = 0;
+ lcid = pLocaleNameToLCID(LOCALE_NAME_USER_DEFAULT, 0);
+ ok(lcid == GetUserDefaultLCID() || broken(GetLastError() == ERROR_INVALID_PARAMETER /* Vista */),
+ "Expected lcid == %08x, got %08x, error %d\n", lcid, GetUserDefaultLCID(), GetLastError());
+ ret = pLCIDToLocaleName(lcid, buffer, LOCALE_NAME_MAX_LENGTH, 0);
+ ok(ret > 0, "Expected ret > 0, got %d, error %d\n", ret, GetLastError());
+ trace("%08x, %s\n", lcid, wine_dbgstr_w(buffer));
+
+ buffer[0] = 0;
+ lcid = pLocaleNameToLCID(LOCALE_NAME_SYSTEM_DEFAULT, 0);
+ todo_wine ok(!lcid && GetLastError() == ERROR_INVALID_PARAMETER,
+ "Expected lcid != 0, got %08x, error %d\n", lcid, GetLastError());
+ ret = pLCIDToLocaleName(lcid, buffer, LOCALE_NAME_MAX_LENGTH, 0);
+ ok(ret > 0, "Expected ret > 0, got %d, error %d\n", ret, GetLastError());
+ trace("%08x, %s\n", lcid, wine_dbgstr_w(buffer));
+
+ buffer[0] = 0;
+ lcid = pLocaleNameToLCID(LOCALE_NAME_INVARIANT, 0);
+ todo_wine ok(lcid == 0x7F, "Expected lcid = 0x7F, got %08x, error %d\n", lcid, GetLastError());
+ ret = pLCIDToLocaleName(lcid, buffer, LOCALE_NAME_MAX_LENGTH, 0);
+ ok(ret > 0, "Expected ret > 0, got %d, error %d\n", ret, GetLastError());
+ trace("%08x, %s\n", lcid, wine_dbgstr_w(buffer));
+}
+
/* this requires collation table patch to make it MS compatible */
static const char * const strings_sorted[] =
{
@@ -2782,6 +2823,7 @@ START_TEST(locale)
test_CompareStringA();
test_LCMapStringA();
test_LCMapStringW();
+ test_LocaleNames();
test_FoldStringA();
test_FoldStringW();
test_ConvertDefaultLocale();
diff --git a/include/winnls.h b/include/winnls.h
index de6f875..92cf017 100644
--- a/include/winnls.h
+++ b/include/winnls.h
@@ -321,6 +321,26 @@ extern "C" {
#define LOCALE_SSORTNAME 0x1013
#define LOCALE_IDIGITSUBSTITUTION 0x1014
+/* Locale name special values */
+#if defined(__GNUC__)
+# define LOCALE_NAME_INVARIANT (const WCHAR []){ 0 }
+#elif defined(_MSC_VER)
+# define LOCALE_NAME_INVARIANT L""
+#else
+static const WCHAR LOCALE_NAME_INVARIANT[] = { 0 };
+#endif
+
+#if defined(__GNUC__)
+# define LOCALE_NAME_SYSTEM_DEFAULT (const WCHAR []){'!','s','y','s','-','d','e','f','a','u','l','t','-','l','o','c','a','l','e',0}
+#elif defined(_MSC_VER)
+# define LOCALE_NAME_SYSTEM_DEFAULT L"!sys-default-locale"
+#else
+static const WCHAR LOCALE_NAME_SYSTEM_DEFAULT[] = {'!','s','y','s','-','d','e','f','a','u','l','t','-','l','o','c','a','l','e',0};
+#endif
+
+#define LOCALE_NAME_MAX_LENGTH 85
+#define LOCALE_NAME_USER_DEFAULT NULL
+
#define LOCALE_IDEFAULTUNIXCODEPAGE 0x1030 /* Wine extension */
#define NORM_IGNORECASE 0x00001
--
Best Regards, André Hentschel
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: Nachrichtenteil als Anhang
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20120307/69f32347/attachment.ksh>
More information about the wine-patches
mailing list