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