summaryrefslogtreecommitdiff
path: root/fitz
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2013-06-17 14:31:22 +0200
committerTor Andersson <tor.andersson@artifex.com>2013-06-17 14:31:22 +0200
commite860f7240878c22d90b086827e58e1e8e055bbf8 (patch)
tree744f3594c58f4abc246da1a130715e9266998608 /fitz
parentbd2eb44aa27ee92564325e61b5fae81322b9e7ce (diff)
downloadmupdf-e860f7240878c22d90b086827e58e1e8e055bbf8.tar.xz
Make common wchar_t / utf-8 conversion functions for MSVC tools.
Diffstat (limited to 'fitz')
-rw-r--r--fitz/base_time.c124
-rw-r--r--fitz/fitz.h9
2 files changed, 99 insertions, 34 deletions
diff --git a/fitz/base_time.c b/fitz/base_time.c
index 1b600399..9292c4f5 100644
--- a/fitz/base_time.c
+++ b/fitz/base_time.c
@@ -1,21 +1,15 @@
-#include <time.h>
-#include "fitz.h"
+#ifdef _MSC_VER
-#ifdef _WIN32
-#ifndef METRO
-#include <winsock2.h>
-#endif
+#include "fitz.h"
+#include <time.h>
#include <windows.h>
-#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
-#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
-#else
-#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
-#endif
-
#ifndef _WINRT
+#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
+
struct timeval;
+struct timezone;
int gettimeofday(struct timeval *tv, struct timezone *tz)
{
@@ -40,44 +34,110 @@ int gettimeofday(struct timeval *tv, struct timezone *tz)
return 0;
}
-#else /* !_WINRT */
+#endif /* !_WINRT */
-void fz_gettimeofday_dummy() { }
+char *
+fz_utf8_from_wchar(const wchar_t *s)
+{
+ const wchar_t *src = s;
+ char *d;
+ char *dst;
+ int len = 1;
-#endif /* !_WINRT) */
+ while (*src)
+ {
+ len += fz_runelen(*src++);
+ }
-FILE *fopen_utf8(const char *name, const char *mode)
+ d = malloc(len);
+ if (d != NULL)
+ {
+ dst = d;
+ src = s;
+ while (*src)
+ {
+ dst += fz_runetochar(dst, *src++);
+ }
+ *dst = 0;
+ }
+ return d;
+}
+
+wchar_t *
+fz_wchar_from_utf8(const char *s)
{
- wchar_t *wname, *wmode, *d;
- const char *s;
+ wchar_t *d, *r;
int c;
- FILE *file;
-
- d = wname = (wchar_t*) malloc((strlen(name)+1) * sizeof(wchar_t));
- if (d == NULL)
+ r = d = malloc((strlen(s) + 1) * sizeof(wchar_t));
+ if (!r)
return NULL;
- s = name;
while (*s) {
s += fz_chartorune(&c, s);
*d++ = c;
}
*d = 0;
- d = wmode = (wchar_t*) malloc((strlen(mode)+1) * sizeof(wchar_t));
- if (d == NULL)
+ return r;
+}
+
+FILE *
+fz_fopen_utf8(const char *name, const char *mode)
+{
+ wchar_t *wname, *wmode;
+ FILE *file;
+
+ wname = fz_wchar_from_utf8(name);
+ if (wname == NULL)
{
- free(wname);
return NULL;
}
- s = mode;
- while (*s) {
- s += fz_chartorune(&c, s);
- *d++ = c;
+
+ wmode = fz_wchar_from_utf8(mode);
+ if (wmode == NULL)
+ {
+ free(wname);
+ return NULL;
}
- *d = 0;
+
file = _wfopen(wname, wmode);
+
free(wname);
free(wmode);
return file;
}
-#endif /* _WIN32 */
+char **
+fz_argv_from_wargv(int argc, wchar_t **wargv)
+{
+ char **argv;
+ int i;
+
+ argv = calloc(argc, sizeof(char *));
+ if (argv == NULL)
+ {
+ fprintf(stderr, "Out of memory while processing command line args!\n");
+ exit(1);
+ }
+
+ for (i = 0; i < argc; i++)
+ {
+ argv[i] = fz_utf8_from_wchar(wargv[i]);
+ if (argv[i] == NULL)
+ {
+ fprintf(stderr, "Out of memory while processing command line args!\n");
+ exit(1);
+ }
+ }
+
+ return argv;
+}
+
+void
+fz_free_argv(int argc, char **argv)
+{
+ int i;
+ for (i = 0; i < argc; i++)
+ free(argv[i]);
+ free(argv);
+}
+
+#endif /* _MSC_VER */
diff --git a/fitz/fitz.h b/fitz/fitz.h
index 73bf8bcd..e3427baf 100644
--- a/fitz/fitz.h
+++ b/fitz/fitz.h
@@ -59,9 +59,14 @@ int gettimeofday(struct timeval *tv, struct timezone *tz);
#define isnan _isnan
#define hypotf _hypotf
-#define fopen fopen_utf8
+#define fopen fz_fopen_utf8
-FILE *fopen_utf8(const char *name, const char *mode);
+char *fz_utf8_from_wchar(const wchar_t *s);
+wchar_t *fz_wchar_from_utf8(const char *s);
+
+FILE *fz_fopen_utf8(const char *name, const char *mode);
+char **fz_argv_from_wargv(int argc, wchar_t **wargv);
+void fz_free_argv(int argc, char **argv);
#else /* Unix or close enough */