#endif
#include <errno.h>
-#if defined (__APPLE__) || defined (HAVE_MAEMO)
-/* Define this if the OS always use UTF-8 internally */
-# define ASSUME_UTF8 1
-#endif
-
#if defined (ASSUME_UTF8)
/* Cool */
#elif defined (WIN32) || defined (UNDER_CE)
# define USE_MB2MB 1
+# include <io.h>
static char *locale_dup (const char *string, bool from)
{
#ifdef ASSUME_UTF8
return (char *)utf8;
#else
- return utf8 ? locale_fast (utf8, false) : NULL
+ return utf8 ? locale_dup (utf8, false) : NULL;
#endif
}
#endif
}
-/**
- * Formats an UTF-8 string as vasprintf(), then print it to stdout, with
- * appropriate conversion to local encoding.
- */
-static int utf8_vasprintf( char **str, const char *fmt, va_list ap )
-{
- char *utf8;
- int res = vasprintf( &utf8, fmt, ap );
- if( res == -1 )
- return -1;
-
- *str = ToLocaleDup( utf8 );
- free( utf8 );
- return res;
-}
-
/**
* Formats an UTF-8 string as vfprintf(), then print it, with
* appropriate conversion to local encoding.
*/
int utf8_vfprintf( FILE *stream, const char *fmt, va_list ap )
{
+#ifdef ASSUME_UTF8
+ return vfprintf (stream, fmt, ap);
+#else
char *str;
- int res = utf8_vasprintf( &str, fmt, ap );
- if( res == -1 )
+ int res;
+
+# if defined( WIN32 ) && !defined( UNDER_CE )
+ /* Writing to the console is a lot of fun on Microsoft Windows.
+ * If you use the standard I/O functions, you must use the OEM code page,
+ * which is different from the usual ANSI code page. Or maybe not, if the
+ * user called "chcp". Anyway, we prefer Unicode. */
+ int fd = _fileno (stream);
+ if (likely(fd != -1) && _isatty (fd))
+ {
+ res = vasprintf (&str, fmt, ap);
+ if (unlikely(res == -1))
+ return -1;
+
+ size_t wlen = 2 * (res + 1);
+ wchar_t *wide = malloc (wlen);
+ if (likely(wide != NULL))
+ {
+ wlen = MultiByteToWideChar (CP_UTF8, 0, str, res + 1, wide, wlen);
+ if (wlen > 0)
+ {
+ HANDLE h = (HANDLE)(intptr_t)_get_osfhandle (fd);
+ DWORD out;
+
+ WriteConsoleW (h, wide, wlen - 1, &out, NULL);
+ }
+ else
+ res = -1;
+ free (wide);
+ }
+ else
+ res = -1;
+ free (str);
+ return res;
+ }
+# endif
+
+ res = vasprintf (&str, fmt, ap);
+ if (unlikely(res == -1))
return -1;
- fputs( str, stream );
- free( str );
+ char *ansi = ToLocaleDup (str);
+ free (str);
+
+ fputs (ansi, stream);
+ free (ansi);
return res;
+#endif
}
/**