Module: wine Branch: master Commit: 659e161d7e32eaec215622db99c7c238d8f1bb58 URL: http://source.winehq.org/git/wine.git/?a=commit;h=659e161d7e32eaec215622db99...
Author: Akihiro Sagawa sagawa.aki@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@gmail.com Signed-off-by: Alexandre Julliard julliard@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);