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