[IMM32] Improve IchWideFromAnsi and IchAnsiFromWide (#4028)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Fri, 15 Oct 2021 01:31:08 +0000 (10:31 +0900)
committerGitHub <noreply@github.com>
Fri, 15 Oct 2021 01:31:08 +0000 (10:31 +0900)
- Use LONG instead of DWORD for indexing and counting the characters.
- Use the sign for the loop condition.
- Add NUL check.
CORE-11700

dll/win32/imm32/precomp.h
dll/win32/imm32/utils.c

index 17f4649..35d0333 100644 (file)
@@ -81,8 +81,8 @@ LPVOID APIENTRY Imm32HeapAlloc(DWORD dwFlags, DWORD dwBytes);
 
 LPWSTR APIENTRY Imm32WideFromAnsi(LPCSTR pszA);
 LPSTR APIENTRY Imm32AnsiFromWide(LPCWSTR pszW);
-DWORD APIENTRY IchWideFromAnsi(DWORD cchAnsi, LPCSTR pchAnsi, UINT uCodePage);
-DWORD APIENTRY IchAnsiFromWide(DWORD cchWide, LPCWSTR pchWide, UINT uCodePage);
+LONG APIENTRY IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage);
+LONG APIENTRY IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage);
 PIMEDPI APIENTRY ImmLockOrLoadImeDpi(HKL hKL);
 LPINPUTCONTEXT APIENTRY Imm32LockIMCEx(HIMC hIMC, BOOL fSelect);
 BOOL APIENTRY Imm32ReleaseIME(HKL hKL);
index 20790f7..6dddd9d 100644 (file)
@@ -50,23 +50,16 @@ LPSTR APIENTRY Imm32AnsiFromWide(LPCWSTR pszW)
     return pszA;
 }
 
-DWORD APIENTRY IchWideFromAnsi(DWORD cchAnsi, LPCSTR pchAnsi, UINT uCodePage)
+/* Converts the character index */
+LONG APIENTRY IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage)
 {
-    DWORD cchWide;
-    for (cchWide = 0; cchAnsi; ++cchWide)
+    LONG cchWide;
+    for (cchWide = 0; cchAnsi > 0; ++cchWide)
     {
-        if (IsDBCSLeadByteEx(uCodePage, *pchAnsi))
+        if (IsDBCSLeadByteEx(uCodePage, *pchAnsi) && pchAnsi[1])
         {
-            if (cchAnsi <= 1)
-            {
-                ++cchWide;
-                break;
-            }
-            else
-            {
-                cchAnsi -= 2;
-                pchAnsi += 2;
-            }
+            cchAnsi -= 2;
+            pchAnsi += 2;
         }
         else
         {
@@ -77,10 +70,11 @@ DWORD APIENTRY IchWideFromAnsi(DWORD cchAnsi, LPCSTR pchAnsi, UINT uCodePage)
     return cchWide;
 }
 
-DWORD APIENTRY IchAnsiFromWide(DWORD cchWide, LPCWSTR pchWide, UINT uCodePage)
+/* Converts the character index */
+LONG APIENTRY IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage)
 {
-    DWORD cb, cchAnsi;
-    for (cchAnsi = 0; cchWide; ++cchAnsi, ++pchWide, --cchWide)
+    LONG cb, cchAnsi;
+    for (cchAnsi = 0; cchWide > 0; ++cchAnsi, ++pchWide, --cchWide)
     {
         cb = WideCharToMultiByte(uCodePage, 0, pchWide, 1, NULL, 0, NULL, NULL);
         if (cb > 1)