eBookReaderSwitch/source/fitz/time.c

169 lines
2.4 KiB
C

#ifdef _WIN32
#include "mupdf/fitz.h"
#include <stdio.h>
#include <errno.h>
#include <time.h>
#include <windows.h>
#ifdef _MSC_VER
#ifndef _WINRT
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
int gettimeofday(struct timeval *tv, struct timezone *tz)
{
FILETIME ft;
unsigned __int64 tmpres = 0;
if (tv)
{
GetSystemTimeAsFileTime(&ft);
tmpres |= ft.dwHighDateTime;
tmpres <<= 32;
tmpres |= ft.dwLowDateTime;
tmpres /= 10; /*convert into microseconds*/
/*converting file time to unix epoch*/
tmpres -= DELTA_EPOCH_IN_MICROSECS;
tv->tv_sec = (long)(tmpres / 1000000UL);
tv->tv_usec = (long)(tmpres % 1000000UL);
}
return 0;
}
#endif /* !_WINRT */
#endif /* _MSC_VER */
char *
fz_utf8_from_wchar(const wchar_t *s)
{
const wchar_t *src = s;
char *d;
char *dst;
int len = 1;
while (*src)
{
len += fz_runelen(*src++);
}
d = Memento_label(malloc(len), "utf8_from_wchar");
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 *d, *r;
int c;
r = d = malloc((strlen(s) + 1) * sizeof(wchar_t));
if (!r)
return NULL;
while (*s) {
s += fz_chartorune(&c, s);
*d++ = c;
}
*d = 0;
return r;
}
void *
fz_fopen_utf8(const char *name, const char *mode)
{
wchar_t *wname, *wmode;
FILE *file;
wname = fz_wchar_from_utf8(name);
if (wname == NULL)
{
return NULL;
}
wmode = fz_wchar_from_utf8(mode);
if (wmode == NULL)
{
free(wname);
return NULL;
}
file = _wfopen(wname, wmode);
free(wname);
free(wmode);
return file;
}
int
fz_remove_utf8(const char *name)
{
wchar_t *wname;
int n;
wname = fz_wchar_from_utf8(name);
if (wname == NULL)
{
errno = ENOMEM;
return -1;
}
n = _wremove(wname);
free(wname);
return n;
}
char **
fz_argv_from_wargv(int argc, wchar_t **wargv)
{
char **argv;
int i;
argv = Memento_label(calloc(argc, sizeof(char *)), "fz_argv");
if (argv == NULL)
{
fprintf(stderr, "Out of memory while processing command line args!\n");
exit(1);
}
for (i = 0; i < argc; i++)
{
argv[i] = Memento_label(fz_utf8_from_wchar(wargv[i]), "fz_arg");
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);
}
#else
int fz_time_dummy;
#endif /* _WIN32 */