summaryrefslogtreecommitdiff
path: root/apps/mudraw.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/mudraw.c')
-rw-r--r--apps/mudraw.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/apps/mudraw.c b/apps/mudraw.c
index a1cc4eaf..98380409 100644
--- a/apps/mudraw.c
+++ b/apps/mudraw.c
@@ -648,8 +648,12 @@ static void drawoutline(fz_context *ctx, fz_document *doc)
#ifdef MUPDF_COMBINED_EXE
int draw_main(int argc, char **argv)
#else
+#ifdef _WIN32
+static int main_utf8(int argc, char **argv)
+#else
int main(int argc, char **argv)
#endif
+#endif
{
char *password = "";
int grayscale = 0;
@@ -862,3 +866,63 @@ int main(int argc, char **argv)
fz_free_context(ctx);
return (errored != 0);
}
+
+#ifdef _WIN32
+static char *
+wchar_to_utf8(wchar_t *s)
+{
+ wchar_t *src = s;
+ char *d;
+ char *dst;
+ int len = 1;
+
+ while (*src)
+ {
+ len += fz_runelen(*src++);
+ }
+
+ d = malloc(len);
+ if (d != NULL)
+ {
+ dst = d;
+ src = s;
+ while (*src)
+ {
+ dst += fz_runetochar(dst, *src++);
+ }
+ *dst = 0;
+ }
+ return d;
+}
+
+int wmain(int argc, wchar_t *wargv[])
+{
+ int i, ret;
+ char **argv = calloc(argc, sizeof(char *));
+ if (argv == NULL)
+ goto oom;
+
+ for (i = 0; i < argc; i++)
+ {
+ argv[i] = wchar_to_utf8(wargv[i]);
+ if (argv[i] == NULL)
+ goto oom;
+ }
+
+ ret = main_utf8(argc, argv);
+
+ if (0)
+ {
+oom:
+ ret = 1;
+ fprintf(stderr, "Out of memory while processing command line args\n");
+ }
+ for (i = 0; i < argc; i++)
+ {
+ free(argv[i]);
+ }
+ free(argv);
+
+ return ret;
+}
+#endif