Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
4b1a8d63
Commit
4b1a8d63
authored
Nov 19, 2019
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
kernel32: Add more special cases in ConvertDefaultLocale().
parent
71aba33f
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
75 additions
and
27 deletions
+75
-27
locale.c
dlls/kernel32/locale.c
+27
-14
locale.c
dlls/kernel32/tests/locale.c
+48
-13
No files found.
dlls/kernel32/locale.c
View file @
4b1a8d63
...
@@ -2501,28 +2501,41 @@ INT WINAPI WideCharToMultiByte( UINT page, DWORD flags, LPCWSTR src, INT srclen,
...
@@ -2501,28 +2501,41 @@ INT WINAPI WideCharToMultiByte( UINT page, DWORD flags, LPCWSTR src, INT srclen,
*/
*/
LCID
WINAPI
ConvertDefaultLocale
(
LCID
lcid
)
LCID
WINAPI
ConvertDefaultLocale
(
LCID
lcid
)
{
{
LANGID
langid
;
switch
(
lcid
)
switch
(
lcid
)
{
{
case
LOCALE_INVARIANT
:
case
LOCALE_INVARIANT
:
/* keep as-is */
return
lcid
;
/* keep as-is */
break
;
case
LOCALE_SYSTEM_DEFAULT
:
case
LOCALE_SYSTEM_DEFAULT
:
lcid
=
GetSystemDefaultLCID
();
return
GetSystemDefaultLCID
();
break
;
case
LOCALE_USER_DEFAULT
:
case
LOCALE_USER_DEFAULT
:
case
LOCALE_NEUTRAL
:
case
LOCALE_NEUTRAL
:
lcid
=
GetUserDefaultLCID
();
return
GetUserDefaultLCID
();
break
;
case
MAKELANGID
(
LANG_CHINESE
,
SUBLANG_NEUTRAL
):
case
MAKELANGID
(
LANG_CHINESE
,
0x1e
):
return
MAKELANGID
(
LANG_CHINESE
,
SUBLANG_CHINESE_SIMPLIFIED
);
case
MAKELANGID
(
LANG_CHINESE
,
0x1f
):
return
MAKELANGID
(
LANG_CHINESE
,
SUBLANG_CHINESE_HONGKONG
);
case
MAKELANGID
(
LANG_SPANISH
,
SUBLANG_NEUTRAL
):
return
MAKELANGID
(
LANG_SPANISH
,
SUBLANG_SPANISH_MODERN
);
case
MAKELANGID
(
LANG_IRISH
,
SUBLANG_NEUTRAL
):
return
MAKELANGID
(
LANG_IRISH
,
SUBLANG_IRISH_IRELAND
);
case
MAKELANGID
(
LANG_BENGALI
,
SUBLANG_NEUTRAL
):
return
MAKELANGID
(
LANG_BENGALI
,
SUBLANG_BENGALI_BANGLADESH
);
case
MAKELANGID
(
LANG_SINDHI
,
SUBLANG_NEUTRAL
):
return
MAKELANGID
(
LANG_SINDHI
,
SUBLANG_SINDHI_AFGHANISTAN
);
case
MAKELANGID
(
LANG_INUKTITUT
,
SUBLANG_NEUTRAL
):
return
MAKELANGID
(
LANG_INUKTITUT
,
SUBLANG_INUKTITUT_CANADA_LATIN
);
case
MAKELANGID
(
LANG_TAMAZIGHT
,
SUBLANG_NEUTRAL
):
return
MAKELANGID
(
LANG_TAMAZIGHT
,
SUBLANG_TAMAZIGHT_ALGERIA_LATIN
);
case
MAKELANGID
(
LANG_FULAH
,
SUBLANG_NEUTRAL
):
return
MAKELANGID
(
LANG_FULAH
,
SUBLANG_FULAH_SENEGAL
);
case
MAKELANGID
(
LANG_TIGRINYA
,
SUBLANG_NEUTRAL
):
return
MAKELANGID
(
LANG_TIGRINYA
,
SUBLANG_TIGRINYA_ERITREA
);
default:
default:
/* Replace SUBLANG_NEUTRAL with SUBLANG_DEFAULT */
/* Replace SUBLANG_NEUTRAL with SUBLANG_DEFAULT */
langid
=
LANGIDFROMLCID
(
lcid
);
if
(
SUBLANGID
(
lcid
)
==
SUBLANG_NEUTRAL
&&
SORTIDFROMLCID
(
lcid
)
==
SORT_DEFAULT
)
if
(
SUBLANGID
(
langid
)
==
SUBLANG_NEUTRAL
)
lcid
=
MAKELANGID
(
PRIMARYLANGID
(
lcid
),
SUBLANG_DEFAULT
);
{
break
;
langid
=
get_default_sublang
(
langid
);
lcid
=
MAKELCID
(
langid
,
SORTIDFROMLCID
(
lcid
));
}
}
}
return
lcid
;
return
lcid
;
}
}
...
...
dlls/kernel32/tests/locale.c
View file @
4b1a8d63
...
@@ -249,7 +249,6 @@ struct neutralsublang_name2_t {
...
@@ -249,7 +249,6 @@ struct neutralsublang_name2_t {
LCID
lcid
;
LCID
lcid
;
LCID
lcid_broken
;
LCID
lcid_broken
;
WCHAR
sname_broken
[
15
];
WCHAR
sname_broken
[
15
];
int
todo
;
};
};
static
const
struct
neutralsublang_name2_t
neutralsublang_names2
[]
=
{
static
const
struct
neutralsublang_name2_t
neutralsublang_names2
[]
=
{
...
@@ -266,7 +265,7 @@ static const struct neutralsublang_name2_t neutralsublang_names2[] = {
...
@@ -266,7 +265,7 @@ static const struct neutralsublang_name2_t neutralsublang_names2[] = {
MAKELCID
(
MAKELANGID
(
LANG_SPANISH
,
SUBLANG_SPANISH
),
SORT_DEFAULT
)
/* vista */
,
MAKELCID
(
MAKELANGID
(
LANG_SPANISH
,
SUBLANG_SPANISH
),
SORT_DEFAULT
)
/* vista */
,
{
'e'
,
's'
,
'-'
,
'E'
,
'S'
,
'_'
,
't'
,
'r'
,
'a'
,
'd'
,
'n'
,
'l'
,
0
}
},
{
'e'
,
's'
,
'-'
,
'E'
,
'S'
,
'_'
,
't'
,
'r'
,
'a'
,
'd'
,
'n'
,
'l'
,
0
}
},
{
{
'g'
,
'a'
,
0
},
{
'g'
,
'a'
,
'-'
,
'I'
,
'E'
,
0
},
{
{
'g'
,
'a'
,
0
},
{
'g'
,
'a'
,
'-'
,
'I'
,
'E'
,
0
},
MAKELCID
(
MAKELANGID
(
LANG_IRISH
,
SUBLANG_IRISH_IRELAND
),
SORT_DEFAULT
),
0
,
{
0
}
,
0x3
},
MAKELCID
(
MAKELANGID
(
LANG_IRISH
,
SUBLANG_IRISH_IRELAND
),
SORT_DEFAULT
),
0
,
{
0
}
},
{
{
'i'
,
't'
,
0
},
{
'i'
,
't'
,
'-'
,
'I'
,
'T'
,
0
},
{
{
'i'
,
't'
,
0
},
{
'i'
,
't'
,
'-'
,
'I'
,
'T'
,
0
},
MAKELCID
(
MAKELANGID
(
LANG_ITALIAN
,
SUBLANG_ITALIAN
),
SORT_DEFAULT
)
},
MAKELCID
(
MAKELANGID
(
LANG_ITALIAN
,
SUBLANG_ITALIAN
),
SORT_DEFAULT
)
},
{
{
'm'
,
's'
,
0
},
{
'm'
,
's'
,
'-'
,
'M'
,
'Y'
,
0
},
{
{
'm'
,
's'
,
0
},
{
'm'
,
's'
,
'-'
,
'M'
,
'Y'
,
0
},
...
@@ -349,13 +348,11 @@ static void test_GetLocaleInfoW(void)
...
@@ -349,13 +348,11 @@ static void test_GetLocaleInfoW(void)
val
=
0
;
val
=
0
;
GetLocaleInfoW
(
lcid
,
LOCALE_ILANGUAGE
|
LOCALE_RETURN_NUMBER
,
(
WCHAR
*
)
&
val
,
sizeof
(
val
)
/
sizeof
(
WCHAR
));
GetLocaleInfoW
(
lcid
,
LOCALE_ILANGUAGE
|
LOCALE_RETURN_NUMBER
,
(
WCHAR
*
)
&
val
,
sizeof
(
val
)
/
sizeof
(
WCHAR
));
todo_wine_if
(
ptr
->
todo
&
0x1
)
ok
(
val
==
ptr
->
lcid
||
(
val
&&
broken
(
val
==
ptr
->
lcid_broken
)),
"%s: got wrong lcid 0x%04x, expected 0x%04x
\n
"
,
ok
(
val
==
ptr
->
lcid
||
(
val
&&
broken
(
val
==
ptr
->
lcid_broken
)),
"%s: got wrong lcid 0x%04x, expected 0x%04x
\n
"
,
wine_dbgstr_w
(
ptr
->
name
),
val
,
ptr
->
lcid
);
wine_dbgstr_w
(
ptr
->
name
),
val
,
ptr
->
lcid
);
/* now check LOCALE_SNAME */
/* now check LOCALE_SNAME */
GetLocaleInfoW
(
lcid
,
LOCALE_SNAME
,
bufferW
,
ARRAY_SIZE
(
bufferW
));
GetLocaleInfoW
(
lcid
,
LOCALE_SNAME
,
bufferW
,
ARRAY_SIZE
(
bufferW
));
todo_wine_if
(
ptr
->
todo
&
0x2
)
ok
(
!
lstrcmpW
(
bufferW
,
ptr
->
sname
)
||
ok
(
!
lstrcmpW
(
bufferW
,
ptr
->
sname
)
||
(
*
ptr
->
sname_broken
&&
broken
(
!
lstrcmpW
(
bufferW
,
ptr
->
sname_broken
))),
(
*
ptr
->
sname_broken
&&
broken
(
!
lstrcmpW
(
bufferW
,
ptr
->
sname_broken
))),
"%s: got %s
\n
"
,
wine_dbgstr_w
(
ptr
->
name
),
wine_dbgstr_w
(
bufferW
));
"%s: got %s
\n
"
,
wine_dbgstr_w
(
ptr
->
name
),
wine_dbgstr_w
(
bufferW
));
...
@@ -2885,7 +2882,7 @@ static void test_LocaleNameToLCID(void)
...
@@ -2885,7 +2882,7 @@ static void test_LocaleNameToLCID(void)
/* check that 0x7c04 also works and is mapped to zh-HK */
/* check that 0x7c04 also works and is mapped to zh-HK */
ret
=
pLCIDToLocaleName
(
MAKELANGID
(
LANG_CHINESE_TRADITIONAL
,
SUBLANG_CHINESE_TRADITIONAL
),
ret
=
pLCIDToLocaleName
(
MAKELANGID
(
LANG_CHINESE_TRADITIONAL
,
SUBLANG_CHINESE_TRADITIONAL
),
buffer
,
ARRAY_SIZE
(
buffer
),
0
);
buffer
,
ARRAY_SIZE
(
buffer
),
0
);
todo_wine
ok
(
ret
>
0
,
"%s: got %d
\n
"
,
wine_dbgstr_w
(
zhHantW
),
ret
);
ok
(
ret
>
0
,
"%s: got %d
\n
"
,
wine_dbgstr_w
(
zhHantW
),
ret
);
ok
(
!
lstrcmpW
(
zhhkW
,
buffer
),
"%s: got wrong locale name %s
\n
"
,
ok
(
!
lstrcmpW
(
zhhkW
,
buffer
),
"%s: got wrong locale name %s
\n
"
,
wine_dbgstr_w
(
zhHantW
),
wine_dbgstr_w
(
buffer
));
wine_dbgstr_w
(
zhHantW
),
wine_dbgstr_w
(
buffer
));
...
@@ -3563,25 +3560,67 @@ static void test_FoldStringW(void)
...
@@ -3563,25 +3560,67 @@ static void test_FoldStringW(void)
#define LCID_OK(l) \
#define LCID_OK(l) \
ok(lcid == l, "Expected lcid = %08x, got %08x\n", l, lcid)
ok(lcid == l, "Expected lcid = %08x, got %08x\n", l, lcid)
#define MKLCID(x,y,z) MAKELCID(MAKELANGID(x, y), z)
#define MKLCID(x,y,z) MAKELCID(MAKELANGID(x, y), z)
#define LCID_RES(src, res)
lcid = ConvertDefaultLocale(src); LCID_OK(res
)
#define LCID_RES(src, res)
do { lcid = ConvertDefaultLocale(src); LCID_OK(res); } while (0
)
#define TEST_LCIDLANG(a,b) LCID_RES(MAKELCID(a,b), MAKELCID(a,b))
#define TEST_LCIDLANG(a,b) LCID_RES(MAKELCID(a,b), MAKELCID(a,b))
#define TEST_LCID(a,b,c) LCID_RES(MKLCID(a,b,c), MKLCID(a,b,c))
#define TEST_LCID(a,b,c) LCID_RES(MKLCID(a,b,c), MKLCID(a,b,c))
static
void
test_ConvertDefaultLocale
(
void
)
static
void
test_ConvertDefaultLocale
(
void
)
{
{
/* some languages use a different default than SUBLANG_DEFAULT */
static
const
struct
{
WORD
lang
,
sublang
;
}
nondefault_langs
[]
=
{
{
LANG_CHINESE
,
SUBLANG_CHINESE_SIMPLIFIED
},
{
LANG_SPANISH
,
SUBLANG_SPANISH_MODERN
},
{
LANG_IRISH
,
SUBLANG_IRISH_IRELAND
},
{
LANG_BENGALI
,
SUBLANG_BENGALI_BANGLADESH
},
{
LANG_SINDHI
,
SUBLANG_SINDHI_AFGHANISTAN
},
{
LANG_INUKTITUT
,
SUBLANG_INUKTITUT_CANADA_LATIN
},
{
LANG_TAMAZIGHT
,
SUBLANG_TAMAZIGHT_ALGERIA_LATIN
},
{
LANG_FULAH
,
SUBLANG_FULAH_SENEGAL
},
{
LANG_TIGRINYA
,
SUBLANG_TIGRINYA_ERITREA
}
};
LCID
lcid
;
LCID
lcid
;
unsigned
int
i
;
/* Doesn't change lcid, even if non default sublang/sort used */
/* Doesn't change lcid, even if non default sublang/sort used */
TEST_LCID
(
LANG_ENGLISH
,
SUBLANG_ENGLISH_US
,
SORT_DEFAULT
);
TEST_LCID
(
LANG_ENGLISH
,
SUBLANG_ENGLISH_US
,
SORT_DEFAULT
);
TEST_LCID
(
LANG_ENGLISH
,
SUBLANG_ENGLISH_UK
,
SORT_DEFAULT
);
TEST_LCID
(
LANG_ENGLISH
,
SUBLANG_ENGLISH_UK
,
SORT_DEFAULT
);
TEST_LCID
(
LANG_JAPANESE
,
SUBLANG_DEFAULT
,
SORT_DEFAULT
);
TEST_LCID
(
LANG_JAPANESE
,
SUBLANG_DEFAULT
,
SORT_DEFAULT
);
TEST_LCID
(
LANG_JAPANESE
,
SUBLANG_DEFAULT
,
SORT_JAPANESE_UNICODE
);
TEST_LCID
(
LANG_JAPANESE
,
SUBLANG_DEFAULT
,
SORT_JAPANESE_UNICODE
);
lcid
=
ConvertDefaultLocale
(
MKLCID
(
LANG_JAPANESE
,
SUBLANG_NEUTRAL
,
SORT_JAPANESE_UNICODE
));
ok
(
lcid
==
MKLCID
(
LANG_JAPANESE
,
SUBLANG_NEUTRAL
,
SORT_JAPANESE_UNICODE
)
||
broken
(
lcid
==
MKLCID
(
LANG_JAPANESE
,
SUBLANG_DEFAULT
,
SORT_JAPANESE_UNICODE
)),
/* <= vista */
"Expected lcid = %08x got %08x
\n
"
,
MKLCID
(
LANG_JAPANESE
,
SUBLANG_NEUTRAL
,
SORT_JAPANESE_UNICODE
),
lcid
);
lcid
=
ConvertDefaultLocale
(
MKLCID
(
LANG_IRISH
,
SUBLANG_NEUTRAL
,
SORT_JAPANESE_UNICODE
));
ok
(
lcid
==
MKLCID
(
LANG_IRISH
,
SUBLANG_NEUTRAL
,
SORT_JAPANESE_UNICODE
)
||
broken
(
lcid
==
MKLCID
(
LANG_IRISH
,
SUBLANG_DEFAULT
,
SORT_JAPANESE_UNICODE
)),
/* <= vista */
"Expected lcid = %08x got %08x
\n
"
,
MKLCID
(
LANG_IRISH
,
SUBLANG_NEUTRAL
,
SORT_JAPANESE_UNICODE
),
lcid
);
/* SUBLANG_NEUTRAL -> SUBLANG_DEFAULT */
/* SUBLANG_NEUTRAL -> SUBLANG_DEFAULT */
LCID_RES
(
MKLCID
(
LANG_ENGLISH
,
SUBLANG_NEUTRAL
,
SORT_DEFAULT
),
LCID_RES
(
MKLCID
(
LANG_ENGLISH
,
SUBLANG_NEUTRAL
,
SORT_DEFAULT
),
MKLCID
(
LANG_ENGLISH
,
SUBLANG_DEFAULT
,
SORT_DEFAULT
));
MKLCID
(
LANG_ENGLISH
,
SUBLANG_DEFAULT
,
SORT_DEFAULT
));
LCID_RES
(
MKLCID
(
LANG_JAPANESE
,
SUBLANG_NEUTRAL
,
SORT_DEFAULT
),
LCID_RES
(
MKLCID
(
LANG_JAPANESE
,
SUBLANG_NEUTRAL
,
SORT_DEFAULT
),
MKLCID
(
LANG_JAPANESE
,
SUBLANG_DEFAULT
,
SORT_DEFAULT
));
MKLCID
(
LANG_JAPANESE
,
SUBLANG_DEFAULT
,
SORT_DEFAULT
));
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
nondefault_langs
);
i
++
)
{
lcid
=
ConvertDefaultLocale
(
MAKELANGID
(
nondefault_langs
[
i
].
lang
,
SUBLANG_NEUTRAL
));
ok
(
lcid
==
MAKELANGID
(
nondefault_langs
[
i
].
lang
,
nondefault_langs
[
i
].
sublang
)
||
broken
(
lcid
==
MAKELANGID
(
nondefault_langs
[
i
].
lang
,
SUBLANG_DEFAULT
))
||
/* <= vista */
broken
(
lcid
==
MAKELANGID
(
nondefault_langs
[
i
].
lang
,
SUBLANG_NEUTRAL
)),
/* w7 */
"Expected lcid = %08x got %08x
\n
"
,
MAKELANGID
(
nondefault_langs
[
i
].
lang
,
nondefault_langs
[
i
].
sublang
),
lcid
);
}
lcid
=
ConvertDefaultLocale
(
0x7804
);
ok
(
lcid
==
MAKELANGID
(
LANG_CHINESE
,
SUBLANG_CHINESE_SIMPLIFIED
)
||
broken
(
lcid
==
0x7804
),
/* <= vista */
"Expected lcid = %08x got %08x
\n
"
,
MAKELANGID
(
LANG_CHINESE
,
SUBLANG_CHINESE_SIMPLIFIED
),
lcid
);
lcid
=
ConvertDefaultLocale
(
0x7c04
);
ok
(
lcid
==
MAKELANGID
(
LANG_CHINESE
,
SUBLANG_CHINESE_HONGKONG
)
||
broken
(
lcid
==
0x7c04
)
||
/* winxp */
broken
(
lcid
==
0x0404
),
/* vista */
"Expected lcid = %08x got %08x
\n
"
,
MAKELANGID
(
LANG_CHINESE
,
SUBLANG_CHINESE_HONGKONG
),
lcid
);
/* Invariant language is not treated specially */
/* Invariant language is not treated specially */
TEST_LCID
(
LANG_INVARIANT
,
SUBLANG_DEFAULT
,
SORT_DEFAULT
);
TEST_LCID
(
LANG_INVARIANT
,
SUBLANG_DEFAULT
,
SORT_DEFAULT
);
...
@@ -5056,6 +5095,7 @@ static void test_invariant(void)
...
@@ -5056,6 +5095,7 @@ static void test_invariant(void)
static
const
char
lang
[]
=
"Invariant Language (Invariant Country)"
;
static
const
char
lang
[]
=
"Invariant Language (Invariant Country)"
;
static
const
char
cntry
[]
=
"Invariant Country"
;
static
const
char
cntry
[]
=
"Invariant Country"
;
static
const
char
sortm
[]
=
"Math Alphanumerics"
;
static
const
char
sortm
[]
=
"Math Alphanumerics"
;
static
const
char
sortms
[]
=
"Maths Alphanumerics"
;
static
const
char
sortd
[]
=
"Default"
;
/* win2k3 */
static
const
char
sortd
[]
=
"Default"
;
/* win2k3 */
ret
=
GetLocaleInfoA
(
LOCALE_INVARIANT
,
NUO
|
LOCALE_SLANGUAGE
,
buffer
,
sizeof
(
buffer
));
ret
=
GetLocaleInfoA
(
LOCALE_INVARIANT
,
NUO
|
LOCALE_SLANGUAGE
,
buffer
,
sizeof
(
buffer
));
...
@@ -5069,13 +5109,8 @@ static void test_invariant(void)
...
@@ -5069,13 +5109,8 @@ static void test_invariant(void)
ok
(
!
strcmp
(
buffer
,
cntry
),
"Expected %s, got '%s'
\n
"
,
cntry
,
buffer
);
ok
(
!
strcmp
(
buffer
,
cntry
),
"Expected %s, got '%s'
\n
"
,
cntry
,
buffer
);
ret
=
GetLocaleInfoA
(
LOCALE_INVARIANT
,
NUO
|
LOCALE_SSORTNAME
,
buffer
,
sizeof
(
buffer
));
ret
=
GetLocaleInfoA
(
LOCALE_INVARIANT
,
NUO
|
LOCALE_SSORTNAME
,
buffer
,
sizeof
(
buffer
));
if
(
ret
==
lstrlenA
(
sortm
)
+
1
)
ok
(
ret
,
"Failed err %d
\n
"
,
GetLastError
());
ok
(
!
strcmp
(
buffer
,
sortm
),
"Expected %s, got '%s'
\n
"
,
sortm
,
buffer
);
ok
(
!
strcmp
(
buffer
,
sortm
)
||
!
strcmp
(
buffer
,
sortd
)
||
!
strcmp
(
buffer
,
sortms
),
"Got '%s'
\n
"
,
buffer
);
else
if
(
ret
==
lstrlenA
(
sortd
)
+
1
)
/* win2k3 */
ok
(
!
strcmp
(
buffer
,
sortd
),
"Expected %s, got '%s'
\n
"
,
sortd
,
buffer
);
else
ok
(
0
,
"Expected ret == %d or %d, got %d, error %d
\n
"
,
lstrlenA
(
sortm
)
+
1
,
lstrlenA
(
sortd
)
+
1
,
ret
,
GetLastError
());
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment