Module: wine Branch: master Commit: a36b5f0741ac7e6a44aaa9d804ebdb7524186723 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a36b5f0741ac7e6a44aaa9d804...
Author: Piotr Caban piotr@codeweavers.com Date: Fri May 6 22:09:14 2016 +0200
msvcrt: Fix mbtowc behavior for buffers containing more than one character.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/msvcrt/mbcs.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 56945bb..2c73de0 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2157,17 +2157,25 @@ int CDECL MSVCRT_mbtowc_l(MSVCRT_wchar_t *dst, const char* str, MSVCRT_size_t n,
if(n <= 0 || !str) return 0; - if(!locinfo->lc_codepage) - tmpdst = (unsigned char)*str; - else if(!MultiByteToWideChar(locinfo->lc_codepage, 0, str, n, &tmpdst, 1)) - return -1; - if(dst) - *dst = tmpdst; - /* return the number of bytes from src that have been used */ - if(!*str) + + if(!*str) { + if(dst) *dst = 0; return 0; - if(n >= 2 && MSVCRT__isleadbyte_l((unsigned char)*str, locale) && str[1]) + } + + if(!locinfo->lc_codepage) { + if(dst) *dst = (unsigned char)*str; + return 1; + } + if(n>=2 && MSVCRT__isleadbyte_l((unsigned char)*str, locale)) { + if(!MultiByteToWideChar(locinfo->lc_codepage, 0, str, 2, &tmpdst, 1)) + return -1; + if(dst) *dst = tmpdst; return 2; + } + if(!MultiByteToWideChar(locinfo->lc_codepage, 0, str, 1, &tmpdst, 1)) + return -1; + if(dst) *dst = tmpdst; return 1; }