From e860f7240878c22d90b086827e58e1e8e055bbf8 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Mon, 17 Jun 2013 14:31:22 +0200 Subject: Make common wchar_t / utf-8 conversion functions for MSVC tools. --- fitz/base_time.c | 124 +++++++++++++++++++++++++++++++++++++++++-------------- fitz/fitz.h | 9 +++- 2 files changed, 99 insertions(+), 34 deletions(-) (limited to 'fitz') 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 -#include "fitz.h" +#ifdef _MSC_VER -#ifdef _WIN32 -#ifndef METRO -#include -#endif +#include "fitz.h" +#include #include -#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 */ -- cgit v1.2.3