Simplify the code for fputwc, when the file is opened in text mode.
[reactos.git] / reactos / lib / sdk / crt / stdio / file.c
index 16682d5..6b99e93 100644 (file)
@@ -1256,6 +1256,9 @@ int CDECL _futime(int fd, struct _utimbuf *t)
   HANDLE hand = fdtoh(fd);
   FILETIME at, wt;
 
+  if (hand == INVALID_HANDLE_VALUE)
+    return -1;
+
   if (!t)
   {
     time_t currTime;
@@ -2472,9 +2475,22 @@ 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;
+  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;
 }
 
@@ -3081,7 +3097,7 @@ int CDECL vfprintf(FILE* file, const char *format, va_list valist)
    * 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);
@@ -3105,9 +3121,10 @@ 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 ||
+  while ((written = _vsnwprintf(mem, resize, format, valist)) == -1 ||
           written > resize)
   {
     resize = (written == -1 ? resize * 2 : written + sizeof(wchar_t));
@@ -3116,9 +3133,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;
 }