aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2016-09-09 09:52:01 -0700
committerChris Robinson <[email protected]>2016-09-09 09:52:01 -0700
commitba449ccce5246031f481bf84b9dce4237553f628 (patch)
treee277db6f99d25a6820686c0ffad4da560003643b
parent45dfdca6f9efa7ec8fb5c16be1bb0f513fe5d772 (diff)
Handle UTF-8 output on Windows in openal-info
-rw-r--r--utils/openal-info.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/utils/openal-info.c b/utils/openal-info.c
index 5b45ceef..5fd8784b 100644
--- a/utils/openal-info.c
+++ b/utils/openal-info.c
@@ -24,6 +24,7 @@
#include <stdio.h>
#include <string.h>
+#include <stdlib.h>
#include "AL/alc.h"
#include "AL/al.h"
@@ -41,6 +42,70 @@
#endif
+#ifdef _WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+static WCHAR *FromUTF8(const char *str)
+{
+ WCHAR *out = NULL;
+ int len;
+
+ if((len=MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0)) > 0)
+ {
+ out = calloc(sizeof(WCHAR), len);
+ MultiByteToWideChar(CP_UTF8, 0, str, -1, out, len);
+ }
+ return out;
+}
+
+/* Override printf, fprintf, and fwrite so we can print UTF-8 strings. */
+static void al_fprintf(FILE *file, const char *fmt, ...)
+{
+ char str[1024];
+ WCHAR *wstr;
+ va_list ap;
+
+ va_start(ap, fmt);
+ vsnprintf(str, sizeof(str), fmt, ap);
+ va_end(ap);
+
+ str[sizeof(str)-1] = 0;
+ wstr = FromUTF8(str);
+ if(!wstr)
+ fprintf(file, "<UTF-8 error> %s", str);
+ else
+ fprintf(file, "%ls", wstr);
+ free(wstr);
+}
+#define fprintf al_fprintf
+#define printf(...) al_fprintf(stdout, __VA_ARGS__)
+
+static int al_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *file)
+{
+ char str[1024];
+ WCHAR *wstr;
+ size_t len;
+
+ len = size * nmemb;
+ if(len > sizeof(str)-1)
+ len = sizeof(str)-1;
+ memcpy(str, ptr, len);
+ str[len] = 0;
+
+ wstr = FromUTF8(str);
+ if(!wstr)
+ fprintf(file, "<UTF-8 error> %s", str);
+ else
+ fprintf(file, "%ls", wstr);
+ free(wstr);
+
+ return len / size;
+}
+#define fwrite al_fwrite
+#endif
+
+
#define MAX_WIDTH 80
static void printList(const char *list, char separator)