mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 01:35:47 +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
1 changed files with 42 additions and 3 deletions
|
@ -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)
|
wint_t CDECL fputwc(wint_t wc, FILE* file)
|
||||||
{
|
{
|
||||||
wchar_t mwc=wc;
|
wchar_t mwc=wc;
|
||||||
if (fwrite( &mwc, sizeof(mwc), 1, file) != 1)
|
char mbchar[10]; // MB_CUR_MAX_CONST
|
||||||
return WEOF;
|
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;
|
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)
|
int CDECL vfwprintf(FILE* file, const wchar_t *format, va_list valist)
|
||||||
{
|
{
|
||||||
wchar_t buf[2048], *mem = buf;
|
wchar_t buf[2048], *mem = buf;
|
||||||
|
char mbbuf[2048], *mbmem = mbbuf;
|
||||||
int written, resize = sizeof(buf) / sizeof(wchar_t), retval;
|
int written, resize = sizeof(buf) / sizeof(wchar_t), retval;
|
||||||
/* See vfprintf comments */
|
/* See vfprintf comments */
|
||||||
while ((written = _vsnwprintf(mem, resize, format, valist)) == -1 ||
|
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))))
|
if (!(mem = malloc(resize*sizeof(*mem))))
|
||||||
return EOF;
|
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)
|
if (mem != buf)
|
||||||
free (mem);
|
free (mem);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue