/*static */ioinfo fdesc[MAX_FILES];
-FILE _iob[3];
+FILE _iob[3] = { { 0 } };
static int fdstart = 3; /* first unallocated fd */
static int fdend = 3; /* highest allocated fd */
*_errno() = EBADF;
return INVALID_HANDLE_VALUE;
}
- if (fdesc[fd].handle == INVALID_HANDLE_VALUE) FIXME("wtf\n");
+ //if (fdesc[fd].handle == INVALID_HANDLE_VALUE) FIXME("wtf\n");
return fdesc[fd].handle;
}
HANDLE hand = fdtoh(fd);
TRACE(":fd (%d) handle (%p)\n",fd,hand);
- return (long)hand;
+ return (long)(LONG_PTR)hand;
}
/*********************************************************************
if (!(oflags & (_O_BINARY | _O_TEXT)))
oflags |= _O_BINARY;
- fd = alloc_fd((HANDLE)handle, split_oflags(oflags));
+ fd = alloc_fd((HANDLE)(LONG_PTR)handle, split_oflags(oflags));
TRACE(":handle (%ld) fd (%d) flags 0x%08x\n", handle, fd, oflags);
return fd;
}
*/
wint_t CDECL fputwc(wint_t wc, FILE* file)
{
- wchar_t mwc=wc;
- char mbchar[10]; // MB_CUR_MAX_CONST
- int mb_return;
+ if (file->_flag & _IOBINARY)
+ {
+ if (fwrite(&wc, sizeof(wc), 1, file) != 1)
+ return WEOF;
+ }
+ else
+ {
+ /* Convert to multibyte in text mode */
+ char mbc[MB_LEN_MAX];
+ 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;
+ mb_return = wctomb(mbc, wc);
- /* Output all characters */
- if (fwrite( mbchar, 1, mb_return, file) != 1)
- return WEOF;
- }
+ if(mb_return == -1)
+ return WEOF;
+
+ /* Output all characters */
+ if (fwrite(mbc, mb_return, 1, file) != 1)
+ return WEOF;
+ }
- return wc;
+ return wc;
}
/*********************************************************************
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 ||
/* Check if outputting to a text-file */
if (fdesc[file->_file].wxflag & WX_TEXT)
{
- /* Convert to multibyte then */
- written = wcstombs(NULL, mem, 0);
+ /* Convert each character and stop at the first invalid character. Behavior verified by tests under WinXP SP2 */
+ char chMultiByte[MB_LEN_MAX];
+ int nReturn;
+ wchar_t *p;
+
+ retval = 0;
- if (written >= sizeof(mbbuf) && (written != (int)-1))
- mbmem = malloc(written + 1);
+ for (p = mem; *p; p++)
+ {
+ nReturn = wctomb(chMultiByte, *p);
- wcstombs(mbmem, mem, written);
- retval = fwrite(mbmem, 1, written, file);
+ if(nReturn == -1)
+ break;
- if (mbmem != mbbuf)
- free(mbmem);
+ retval += fwrite(chMultiByte, 1, nReturn, file);
+ }
}
else
{