HANDLE hand = fdtoh(fd);
FILETIME at, wt;
+ if (hand == INVALID_HANDLE_VALUE)
+ return -1;
+
if (!t)
{
time_t currTime;
*/
wint_t CDECL fputwc(wint_t wc, FILE* file)
{
- wchar_t mwc=wc;
- if (fwrite( &mwc, sizeof(mwc), 1, file) != 1)
- return WEOF;
+ if (file->_flag & _IOBINARY)
+ {
+ wchar_t mwc = wc;
+
+ if (fwrite( &mwc, sizeof(mwc), 1, file) != 1)
+ return WEOF;
+ }
+ else
+ {
+ /* Convert the character to ANSI */
+ char c = (unsigned char)wc;
+
+ if (fwrite( &c, sizeof(c), 1, file) != 1)
+ return WEOF;
+ }
+
return wc;
}
* Return the number of bytes that would have been written
* The code below handles both cases
*/
- while ((written = vsnprintf(mem, resize, format, valist)) == -1 ||
+ while ((written = _vsnprintf(mem, resize, format, valist)) == -1 ||
written > resize)
{
resize = (written == -1 ? resize * 2 : written + 1);
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 ||
+ while ((written = _vsnwprintf(mem, resize, format, valist)) == -1 ||
written > resize)
{
resize = (written == -1 ? resize * 2 : written + sizeof(wchar_t));
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;
}