[vlc-commits] commit: Win32: use Unicode output for the console (fixes #3125) ( Rémi Denis-Courmont )

git at videolan.org git at videolan.org
Thu Jul 22 19:36:13 CEST 2010


vlc/vlc-1.1 | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Jul 22 20:34:39 2010 +0300| [0506ab81e7e18f03459b9230f647a85ccfa6a2c6] | committer: Rémi Denis-Courmont 

Win32: use Unicode output for the console (fixes #3125)

(cherry picked from commit 2b67ce72a9cbf2279bf8f6f769984aca968fe1f6)

> http://git.videolan.org/gitweb.cgi/vlc/vlc-1.1.git/?a=commit;h=0506ab81e7e18f03459b9230f647a85ccfa6a2c6
---

 src/text/unicode.c |   41 +++++++++++++++++++++++++++++++++++++++--
 1 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/src/text/unicode.c b/src/text/unicode.c
index 43a3da4..4607d15 100644
--- a/src/text/unicode.c
+++ b/src/text/unicode.c
@@ -221,8 +221,45 @@ static int utf8_vasprintf( char **str, const char *fmt, va_list ap )
 int utf8_vfprintf( FILE *stream, const char *fmt, va_list ap )
 {
     char *str;
-    int res = utf8_vasprintf( &str, fmt, ap );
-    if( res == -1 )
+    int res;
+
+#ifdef WIN32
+    /* 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 = utf8_vasprintf (&str, fmt, ap);
+    if (unlikely(res == -1))
         return -1;
 
     fputs( str, stream );



More information about the vlc-commits mailing list