mirror of
https://github.com/reactos/reactos.git
synced 2024-08-13 06:37:06 +00:00
- Provide a real fix for fwprintf and fputwc in case the output stream is in TEXT mode by doing a widechar to multibyte conversion.
- This should be submitted to Wine to close their bug. See issue #3353 for more details. svn path=/trunk/; revision=34042
This commit is contained in:
parent
7cf55b1f25
commit
3ee18cdb67
|
@ -2473,8 +2473,25 @@ size_t CDECL fwrite(const void *ptr, size_t size, size_t nmemb, FILE* file)
|
|||
wint_t CDECL fputwc(wint_t wc, FILE* file)
|
||||
{
|
||||
wchar_t mwc=wc;
|
||||
if (fwrite( &mwc, sizeof(mwc), 1, file) != 1)
|
||||
return WEOF;
|
||||
char mbchar[10]; // MB_CUR_MAX_CONST
|
||||
int mb_return;
|
||||
|
||||
if (file->_flag & _IOBINARY)
|
||||
{
|
||||
if (fwrite( &mwc, sizeof(mwc), 1, file) != 1)
|
||||
return WEOF;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Convert to multibyte in text mode */
|
||||
mb_return = wctomb(mbchar, mwc);
|
||||
if (mb_return == -1) return WEOF;
|
||||
|
||||
/* Output all characters */
|
||||
if (fwrite( mbchar, 1, mb_return, file) != 1)
|
||||
return WEOF;
|
||||
}
|
||||
|
||||
return wc;
|
||||
}
|
||||
|
||||
|
@ -3105,6 +3122,7 @@ int CDECL vfprintf(FILE* file, const char *format, va_list valist)
|
|||
int CDECL vfwprintf(FILE* file, const wchar_t *format, va_list valist)
|
||||
{
|
||||
wchar_t buf[2048], *mem = buf;
|
||||
char mbbuf[2048], *mbmem = mbbuf;
|
||||
int written, resize = sizeof(buf) / sizeof(wchar_t), retval;
|
||||
/* See vfprintf comments */
|
||||
while ((written = _vsnwprintf(mem, resize, format, valist)) == -1 ||
|
||||
|
@ -3116,9 +3134,30 @@ int CDECL vfwprintf(FILE* file, const wchar_t *format, va_list valist)
|
|||
if (!(mem = malloc(resize*sizeof(*mem))))
|
||||
return EOF;
|
||||
}
|
||||
retval = fwrite(mem, sizeof(*mem), written, file);
|
||||
|
||||
/* Check if outputting to a text-file */
|
||||
if (fdesc[file->_file].wxflag & WX_TEXT)
|
||||
{
|
||||
/* Convert to multibyte then */
|
||||
written = wcstombs(NULL, mem, 0);
|
||||
|
||||
if (written >= sizeof(mbbuf) && (written != (int)-1))
|
||||
mbmem = malloc(written + 1);
|
||||
|
||||
wcstombs(mbmem, mem, written);
|
||||
retval = fwrite(mbmem, 1, written, file);
|
||||
|
||||
if (mbmem != mbbuf)
|
||||
free(mbmem);
|
||||
}
|
||||
else
|
||||
{
|
||||
retval = fwrite(mem, sizeof(*mem), written, file);
|
||||
}
|
||||
|
||||
if (mem != buf)
|
||||
free (mem);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue