Convert the characters to multibyte in text mode, when using =

Colin Finck mail at colinfinck.de
Sun Jul 27 17:10:51 CDT 2008


the Unicode CRT file functions.=0A=
 Fixes bug #8598.=0A=
=0A=
---=0A=
 dlls/msvcrt/file.c   |   54 =
+++++++++++++++++++++++++++++++++++++++++++++----=0A=
 dlls/msvcrt/msvcrt.h |    1 +=0A=
 2 files changed, 50 insertions(+), 5 deletions(-)=0A=
=0A=
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c=0A=
index cd15e40..939611e 100644=0A=
--- a/dlls/msvcrt/file.c=0A=
+++ b/dlls/msvcrt/file.c=0A=
@@ -2433,10 +2433,28 @@ MSVCRT_size_t CDECL MSVCRT_fwrite(const void =
*ptr, MSVCRT_size_t size, MSVCRT_si=0A=
  */=0A=
 MSVCRT_wint_t CDECL MSVCRT_fputwc(MSVCRT_wint_t wc, MSVCRT_FILE* file)=0A=
 {=0A=
-  MSVCRT_wchar_t mwc=3Dwc;=0A=
-  if (MSVCRT_fwrite( &mwc, sizeof(mwc), 1, file) !=3D 1)=0A=
-    return MSVCRT_WEOF;=0A=
-  return wc;=0A=
+    if (MSVCRT_fdesc[file->_file].wxflag & WX_TEXT)=0A=
+    {=0A=
+        /* Convert to multibyte in text mode */=0A=
+        char chMultiByte[MSVCRT_MB_LEN_MAX];=0A=
+        int nReturn;=0A=
+=0A=
+        nReturn =3D MSVCRT_wctomb(chMultiByte, wc);=0A=
+=0A=
+        if(nReturn =3D=3D -1)=0A=
+            return MSVCRT_WEOF;=0A=
+=0A=
+        /* Output all characters */=0A=
+        if (MSVCRT_fwrite(chMultiByte, nReturn, 1, file) !=3D 1)=0A=
+            return MSVCRT_WEOF;=0A=
+    }=0A=
+    else=0A=
+    {=0A=
+        if (MSVCRT_fwrite(&wc, sizeof(wc), 1, file) !=3D 1)=0A=
+            return MSVCRT_WEOF;=0A=
+    }=0A=
+=0A=
+    return wc;=0A=
 }=0A=
 =0A=
 /*********************************************************************=0A=
@@ -3058,9 +3076,35 @@ int CDECL MSVCRT_vfwprintf(MSVCRT_FILE* file, =
const MSVCRT_wchar_t *format, va_l=0A=
     if (!(mem =3D MSVCRT_malloc(resize*sizeof(*mem))))=0A=
       return MSVCRT_EOF;=0A=
   }=0A=
-  retval =3D MSVCRT_fwrite(mem, sizeof(*mem), written, file);=0A=
+=0A=
+  /* Check if outputting to a text-file */=0A=
+  if (MSVCRT_fdesc[file->_file].wxflag & WX_TEXT)=0A=
+  {=0A=
+      /* Convert each character and stop at the first invalid =
character. Behavior verified by tests under WinXP SP2 */=0A=
+      char chMultiByte[MSVCRT_MB_LEN_MAX];=0A=
+      int nReturn;=0A=
+      MSVCRT_wchar_t *p;=0A=
+=0A=
+      retval =3D 0;=0A=
+=0A=
+      for (p =3D mem; *p; p++)=0A=
+      {=0A=
+          nReturn =3D MSVCRT_wctomb(chMultiByte, *p);=0A=
+=0A=
+          if(nReturn =3D=3D -1)=0A=
+              break;=0A=
+=0A=
+          retval +=3D MSVCRT_fwrite(chMultiByte, 1, nReturn, file);=0A=
+      }=0A=
+  }=0A=
+  else=0A=
+  {=0A=
+    retval =3D MSVCRT_fwrite(mem, sizeof(*mem), written, file);=0A=
+  }=0A=
+=0A=
   if (mem !=3D buf)=0A=
     MSVCRT_free (mem);=0A=
+=0A=
   return retval;=0A=
 }=0A=
 =0A=
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h=0A=
index 6ac5c19..8e1b288 100644=0A=
--- a/dlls/msvcrt/msvcrt.h=0A=
+++ b/dlls/msvcrt/msvcrt.h=0A=
@@ -627,6 +627,7 @@ double         MSVCRT_difftime(MSVCRT_time_t time1, =
MSVCRT_time_t time2);=0A=
 MSVCRT_time_t  MSVCRT_time(MSVCRT_time_t*);=0A=
 MSVCRT_FILE*   MSVCRT__fdopen(int, const char *);=0A=
 MSVCRT_FILE*   MSVCRT__wfdopen(int, const MSVCRT_wchar_t *);=0A=
+INT            MSVCRT_wctomb(char *mbchar, MSVCRT_wchar_t wchar);=0A=
 int            MSVCRT_vsnprintf(char *str, unsigned int len, const char =
*format, va_list valist);=0A=
 int            MSVCRT_vsnwprintf(MSVCRT_wchar_t *str, unsigned int len,=0A=
                                  const MSVCRT_wchar_t *format, va_list =
valist );=0A=
-- =0A=
1.5.6.1.1071.g76fb=0A=
=0A=

------=_NextPart_000_001F_01C8F043.5D8DFA80--




More information about the wine-patches mailing list