[KERNEL32] LCMapString: Sync to Wine a little (#5203)

Preparation for LCMAP_FULLWIDTH and LCMAP_HALFWIDTH support.
Slightly synchronize lang.c to locale.c in Wine's dlls/kernelbase.
CORE-11700
This commit is contained in:
Katayama Hirofumi MZ 2023-03-28 21:09:27 +09:00 committed by GitHub
parent 3b82b8370d
commit 0569bbd4a7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1872,7 +1872,7 @@ BOOL WINAPI GetStringTypeExA( LCID locale, DWORD type, LPCSTR src, INT count, LP
* Map characters in a locale sensitive string. * Map characters in a locale sensitive string.
* *
* PARAMS * PARAMS
* name [I] Locale name for the conversion. * locale [I] Locale name for the conversion.
* flags [I] Flags controlling the mapping (LCMAP_ constants from "winnls.h") * flags [I] Flags controlling the mapping (LCMAP_ constants from "winnls.h")
* src [I] String to map * src [I] String to map
* srclen [I] Length of src in chars, or -1 if src is NUL terminated * srclen [I] Length of src in chars, or -1 if src is NUL terminated
@ -1886,17 +1886,17 @@ BOOL WINAPI GetStringTypeExA( LCID locale, DWORD type, LPCSTR src, INT count, LP
* Success: The length of the mapped string in dst, including the NUL terminator. * Success: The length of the mapped string in dst, including the NUL terminator.
* Failure: 0. Use GetLastError() to determine the cause. * Failure: 0. Use GetLastError() to determine the cause.
*/ */
INT WINAPI LCMapStringEx(LPCWSTR name, DWORD flags, LPCWSTR src, INT srclen, LPWSTR dst, INT dstlen, INT WINAPI LCMapStringEx(LPCWSTR locale, DWORD flags, LPCWSTR src, INT srclen, LPWSTR dst, INT dstlen,
LPNLSVERSIONINFO version, LPVOID reserved, LPARAM lparam) LPNLSVERSIONINFO version, LPVOID reserved, LPARAM handle)
{ {
LPWSTR dst_ptr; LPWSTR dst_ptr;
if (version) FIXME("unsupported version structure %p\n", version); if (version) FIXME("unsupported version structure %p\n", version);
if (reserved) FIXME("unsupported reserved pointer %p\n", reserved); if (reserved) FIXME("unsupported reserved pointer %p\n", reserved);
if (lparam) if (handle)
{ {
static int once; static int once;
if (!once++) FIXME("unsupported lparam %lx\n", lparam); if (!once++) FIXME("unsupported lparam %Ix\n", handle);
} }
if (!src || !srclen || dstlen < 0) if (!src || !srclen || dstlen < 0)
@ -1905,6 +1905,19 @@ INT WINAPI LCMapStringEx(LPCWSTR name, DWORD flags, LPCWSTR src, INT srclen, LPW
return 0; return 0;
} }
if (srclen < 0) srclen = lstrlenW(src) + 1;
TRACE( "(%s,0x%08lx,%s,%d,%p,%d)\n",
debugstr_w(locale), flags, debugstr_wn(src, srclen), srclen, dst, dstlen );
flags &= ~LOCALE_USE_CP_ACP;
if (src == dst && (flags & ~(LCMAP_LOWERCASE | LCMAP_UPPERCASE)))
{
SetLastError(ERROR_INVALID_FLAGS);
return 0;
}
/* mutually exclusive flags */ /* mutually exclusive flags */
if ((flags & (LCMAP_LOWERCASE | LCMAP_UPPERCASE)) == (LCMAP_LOWERCASE | LCMAP_UPPERCASE) || if ((flags & (LCMAP_LOWERCASE | LCMAP_UPPERCASE)) == (LCMAP_LOWERCASE | LCMAP_UPPERCASE) ||
(flags & (LCMAP_HIRAGANA | LCMAP_KATAKANA)) == (LCMAP_HIRAGANA | LCMAP_KATAKANA) || (flags & (LCMAP_HIRAGANA | LCMAP_KATAKANA)) == (LCMAP_HIRAGANA | LCMAP_KATAKANA) ||
@ -1928,9 +1941,6 @@ INT WINAPI LCMapStringEx(LPCWSTR name, DWORD flags, LPCWSTR src, INT srclen, LPW
if (srclen < 0) srclen = strlenW(src); if (srclen < 0) srclen = strlenW(src);
TRACE("(%s,0x%08x,%s,%d,%p,%d)\n",
debugstr_w(name), flags, debugstr_wn(src, srclen), srclen, dst, dstlen);
ret = wine_get_sortkey(flags, src, srclen, (char *)dst, dstlen); ret = wine_get_sortkey(flags, src, srclen, (char *)dst, dstlen);
if (ret == 0) if (ret == 0)
SetLastError(ERROR_INSUFFICIENT_BUFFER); SetLastError(ERROR_INSUFFICIENT_BUFFER);
@ -1946,11 +1956,6 @@ INT WINAPI LCMapStringEx(LPCWSTR name, DWORD flags, LPCWSTR src, INT srclen, LPW
return 0; return 0;
} }
if (srclen < 0) srclen = strlenW(src) + 1;
TRACE("(%s,0x%08x,%s,%d,%p,%d)\n",
debugstr_w(name), flags, debugstr_wn(src, srclen), srclen, dst, dstlen);
if (!dst) /* return required string length */ if (!dst) /* return required string length */
{ {
INT len; INT len;
@ -1993,11 +1998,6 @@ INT WINAPI LCMapStringEx(LPCWSTR name, DWORD flags, LPCWSTR src, INT srclen, LPW
} }
else else
{ {
if (src == dst)
{
SetLastError(ERROR_INVALID_FLAGS);
return 0;
}
for (dst_ptr = dst; srclen && dstlen; src++, srclen--) for (dst_ptr = dst; srclen && dstlen; src++, srclen--)
{ {
WCHAR wch = *src; WCHAR wch = *src;