Module: wine Branch: master Commit: ebfa65361819f5804934db2262b54508851ba3cb URL: http://source.winehq.org/git/wine.git/?a=commit;h=ebfa65361819f5804934db2262...
Author: Piotr Caban piotr@codeweavers.com Date: Fri Jan 11 11:18:44 2013 +0100
msvcrt: Make fputwc encoding aware.
---
dlls/msvcrt/file.c | 28 ++++++++++++++++++++++++---- dlls/msvcrt/msvcrt.h | 1 + 2 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index c53e061..19ad11c 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -3375,10 +3375,30 @@ MSVCRT_size_t CDECL MSVCRT_fwrite(const void *ptr, MSVCRT_size_t size, MSVCRT_si */ MSVCRT_wint_t CDECL MSVCRT_fputwc(MSVCRT_wint_t wc, MSVCRT_FILE* file) { - MSVCRT_wchar_t mwc=wc; - if (MSVCRT_fwrite( &mwc, sizeof(mwc), 1, file) != 1) - return MSVCRT_WEOF; - return wc; + MSVCRT_wchar_t mwc=wc; + ioinfo *fdinfo; + MSVCRT_wint_t ret; + + MSVCRT__lock_file(file); + fdinfo = msvcrt_get_ioinfo(file->_file); + + if((fdinfo->wxflag&WX_TEXT) && !(fdinfo->exflag&(EF_UTF8|EF_UTF16))) { + char buf[MSVCRT_MB_LEN_MAX]; + int char_len; + + char_len = wctomb(buf, mwc); + if(char_len!=-1 && MSVCRT_fwrite(buf, char_len, 1, file)==1) + ret = wc; + else + ret = MSVCRT_WEOF; + }else if(MSVCRT_fwrite(&mwc, sizeof(mwc), 1, file) == 1) { + ret = wc; + }else { + ret = MSVCRT_WEOF; + } + + MSVCRT__unlock_file(file); + return ret; }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 1bdf393..77418e3 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -46,6 +46,7 @@ #define MSVCRT_I64_MAX (((__int64)0x7fffffff << 32) | 0xffffffff) #define MSVCRT_I64_MIN (-MSVCRT_I64_MAX-1) #define MSVCRT_UI64_MAX (((unsigned __int64)0xffffffff << 32) | 0xffffffff) +#define MSVCRT_MB_LEN_MAX 2
#define MSVCRT__MAX_DRIVE 3 #define MSVCRT__MAX_DIR 256