Aric Stewart : imm32: Correct CopyCompAttrIMEtoClient to handle A->W and W- >A conversions.

Alexandre Julliard julliard at winehq.org
Tue Sep 16 06:54:26 CDT 2008


Module: wine
Branch: master
Commit: b2d9edd8a0d4725ce6ab5050ded5ee6fb8220514
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b2d9edd8a0d4725ce6ab5050ded5ee6fb8220514

Author: Aric Stewart <aric at codeweavers.com>
Date:   Mon Sep 15 08:49:39 2008 -0500

imm32: Correct CopyCompAttrIMEtoClient to handle A->W and W->A conversions.

---

 dlls/imm32/imm.c |   65 +++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 62 insertions(+), 3 deletions(-)

diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
index 76677b4..b826163 100644
--- a/dlls/imm32/imm.c
+++ b/dlls/imm32/imm.c
@@ -1010,10 +1010,69 @@ static INT CopyCompStringIMEtoClient(InputContextData *data, LPBYTE source, INT
 static INT CopyCompAttrIMEtoClient(InputContextData *data, LPBYTE source, INT slen, LPBYTE ssource, INT sslen,
                                    LPBYTE target, INT tlen, BOOL unicode )
 {
-    if ( target && source && tlen >= slen)
-        memcpy( target , source , slen);
+    INT rc;
 
-    return slen;
+    if (is_himc_ime_unicode(data) && !unicode)
+    {
+        rc = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)ssource, sslen, NULL, 0, NULL, NULL);
+        if (tlen)
+        {
+            const BYTE *src = source;
+            LPBYTE dst = target;
+            int i, j = 0, k = 0;
+
+            if (rc < tlen)
+                tlen = rc;
+            for (i = 0; i < sslen; ++i)
+            {
+                int len;
+
+                len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)ssource + i, 1,
+                                          NULL, 0, NULL, NULL);
+                for (; len > 0; --len)
+                {
+                    dst[j++] = src[k];
+
+                    if (j >= tlen)
+                        goto end;
+                }
+                ++k;
+            }
+        end:
+            rc = j;
+        }
+    }
+    else if (!is_himc_ime_unicode(data) && unicode)
+    {
+        rc = MultiByteToWideChar(CP_ACP, 0, (LPSTR)ssource, sslen, NULL, 0);
+        if (tlen)
+        {
+            const BYTE *src = source;
+            LPBYTE dst = target;
+            int i, j = 0;
+
+            if (rc < tlen)
+                tlen = rc;
+            for (i = 0; i < sslen; ++i)
+            {
+                if (IsDBCSLeadByte(((LPSTR)ssource)[i]))
+                    continue;
+
+                dst[j++] = src[i];
+
+                if (j >= tlen)
+                    break;
+            }
+            rc = j;
+        }
+    }
+    else
+    {
+        memcpy( target, source, min(slen,tlen));
+        rc = slen;
+    }
+
+    return rc;
 }
 
 static INT CopyCompClauseIMEtoClient(InputContextData *data, LPBYTE source, INT slen, LPBYTE ssource, INT sslen,




More information about the wine-cvs mailing list