Piotr Caban : msvcrt: Make fputwc encoding aware.

Alexandre Julliard julliard at winehq.org
Fri Jan 11 13:46:58 CST 2013


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

Author: Piotr Caban <piotr at 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




More information about the wine-cvs mailing list