From 4b67531bf72ee1a8c92029a7be3836c96594150e Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Thu, 29 Nov 2012 09:23:02 +0000 Subject: [PATCH] msvcrt: Added mbrtowc implementation. --- dlls/msvcrt/mbcs.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- dlls/msvcrt/msvcrt.spec | 2 +- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index b083ea1367e..71b53438469 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -1995,7 +1995,7 @@ int CDECL MSVCRT_mbtowc_l(MSVCRT_wchar_t *dst, const char* str, MSVCRT_size_t n, /* return the number of bytes from src that have been used */ if(!*str) return 0; - if(n >= 2 && MSVCRT__isleadbyte_l(*str, locale) && str[1]) + if(n >= 2 && MSVCRT__isleadbyte_l((unsigned char)*str, locale) && str[1]) return 2; return 1; } @@ -2009,6 +2009,53 @@ int CDECL MSVCRT_mbtowc(MSVCRT_wchar_t *dst, const char* str, MSVCRT_size_t n) } /********************************************************************* + * mbrtowc(MSVCRT.@) + */ +MSVCRT_size_t CDECL MSVCRT_mbrtowc(MSVCRT_wchar_t *dst, const char *str, + MSVCRT_size_t n, MSVCRT_mbstate_t *state) +{ + MSVCRT_pthreadlocinfo locinfo = get_locinfo(); + MSVCRT_mbstate_t s = (state ? *state : 0); + char tmpstr[2]; + int len = 0; + + if(dst) + *dst = 0; + + if(!n || !str || !*str) + return 0; + + if(locinfo->mb_cur_max == 1) { + tmpstr[len++] = *str; + }else if(!s && MSVCRT_isleadbyte((unsigned char)*str)) { + if(n == 1) { + s = (unsigned char)*str; + len = -2; + }else { + tmpstr[0] = str[0]; + tmpstr[1] = str[1]; + len = 2; + } + }else if(!s) { + tmpstr[len++] = *str; + }else { + tmpstr[0] = s; + tmpstr[1] = *str; + len = 2; + s = 0; + } + + if(len > 0) { + if(!MultiByteToWideChar(locinfo->lc_codepage, 0, tmpstr, len, dst, dst ? 1 : 0)) + len = -1; + } + + if(state) + *state = s; + return len; +} + +/********************************************************************* * _mbstowcs_l(MSVCRT.@) */ MSVCRT_size_t CDECL MSVCRT__mbstowcs_l(MSVCRT_wchar_t *wcstr, const char *mbstr, diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 7957e92ee46..4f2fa9ac518 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -1329,7 +1329,7 @@ @ cdecl malloc(long) MSVCRT_malloc @ cdecl mblen(ptr long) MSVCRT_mblen @ cdecl mbrlen(ptr long ptr) MSVCRT_mbrlen -# stub mbrtowc(ptr str long ptr) +@ cdecl mbrtowc(ptr str long ptr) MSVCRT_mbrtowc # stub mbsdup_dbg(wstr long ptr long) # stub mbsrtowcs(ptr ptr long ptr) # stub mbsrtowcs_s(ptr ptr long ptr long ptr) -- 2.11.4.GIT