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