Akihiro Sagawa : kernel32: Refactor the codepath and a variable usage.
Alexandre Julliard
julliard at winehq.org
Fri Sep 23 10:25:16 CDT 2016
Module: wine
Branch: master
Commit: 659e161d7e32eaec215622db99c7c238d8f1bb58
URL: http://source.winehq.org/git/wine.git/?a=commit;h=659e161d7e32eaec215622db99c7c238d8f1bb58
Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date: Fri Sep 23 00:06:16 2016 +0900
kernel32: Refactor the codepath and a variable usage.
Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/locale.c | 48 +++++++++++++++++++++++++++++-------------------
1 file changed, 29 insertions(+), 19 deletions(-)
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index 422d63f..97a22ba 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -3135,6 +3135,7 @@ INT WINAPI LCMapStringEx(LPCWSTR name, DWORD flags, LPCWSTR src, INT srclen, LPW
LPNLSVERSIONINFO version, LPVOID reserved, LPARAM lparam)
{
LPWSTR dst_ptr;
+ INT len;
if (version) FIXME("unsupported version structure %p\n", version);
if (reserved) FIXME("unsupported reserved pointer %p\n", reserved);
@@ -3205,8 +3206,6 @@ INT WINAPI LCMapStringEx(LPCWSTR name, DWORD flags, LPCWSTR src, INT srclen, LPW
if (!dst) /* return required string length */
{
- INT len;
-
if (flags & NORM_IGNORESYMBOLS)
{
for (len = 0; srclen; src++, srclen--)
@@ -3226,39 +3225,50 @@ INT WINAPI LCMapStringEx(LPCWSTR name, DWORD flags, LPCWSTR src, INT srclen, LPW
return len;
}
+ if (src == dst && (flags & ~(LCMAP_LOWERCASE | LCMAP_UPPERCASE)))
+ {
+ SetLastError(ERROR_INVALID_FLAGS);
+ return 0;
+ }
+
+ if (flags & (NORM_IGNORENONSPACE | NORM_IGNORESYMBOLS))
+ {
+ for (len = dstlen, dst_ptr = dst; srclen && len; src++, srclen--)
+ {
+ WCHAR wch = *src;
+ if ((flags & NORM_IGNORESYMBOLS) && (get_char_typeW(wch) & (C1_PUNCT | C1_SPACE)))
+ continue;
+ *dst_ptr++ = wch;
+ len--;
+ }
+ goto done;
+ }
+
if (flags & LCMAP_UPPERCASE)
{
- for (dst_ptr = dst; srclen && dstlen; src++, srclen--)
+ for (len = dstlen, dst_ptr = dst; srclen && len; src++, srclen--)
{
*dst_ptr++ = toupperW(*src);
- dstlen--;
+ len--;
}
}
else if (flags & LCMAP_LOWERCASE)
{
- for (dst_ptr = dst; srclen && dstlen; src++, srclen--)
+ for (len = dstlen, dst_ptr = dst; srclen && len; src++, srclen--)
{
*dst_ptr++ = tolowerW(*src);
- dstlen--;
+ len--;
}
}
else
{
- if (src == dst)
- {
- SetLastError(ERROR_INVALID_FLAGS);
- return 0;
- }
- for (dst_ptr = dst; srclen && dstlen; src++, srclen--)
- {
- WCHAR wch = *src;
- if ((flags & NORM_IGNORESYMBOLS) && (get_char_typeW(wch) & (C1_PUNCT | C1_SPACE)))
- continue;
- *dst_ptr++ = wch;
- dstlen--;
- }
+ len = min(srclen, dstlen);
+ memcpy(dst, src, len * sizeof(WCHAR));
+ dst_ptr = dst + len;
+ srclen -= len;
}
+done:
if (srclen)
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
More information about the wine-cvs
mailing list