Mercurial > hgrepos > Python2 > PyMuPDF
diff mupdf-source/source/fitz/time.c @ 2:b50eed0cc0ef upstream
ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4.
The directory name has changed: no version number in the expanded directory now.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Mon, 15 Sep 2025 11:43:07 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mupdf-source/source/fitz/time.c Mon Sep 15 11:43:07 2025 +0200 @@ -0,0 +1,277 @@ +// Copyright (C) 2004-2025 Artifex Software, Inc. +// +// This file is part of MuPDF. +// +// MuPDF is free software: you can redistribute it and/or modify it under the +// terms of the GNU Affero General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) +// any later version. +// +// MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +// details. +// +// You should have received a copy of the GNU Affero General Public License +// along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html> +// +// Alternative licensing terms are available from the licensor. +// For commercial licensing, see <https://www.artifex.com/> or contact +// Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco, +// CA 94129, USA, for further information. + +#include "mupdf/fitz.h" + +#include <sys/stat.h> + +#ifdef _WIN32 + +#include <stdio.h> +#include <errno.h> +#include <time.h> +#include <windows.h> +#include <direct.h> /* for mkdir */ + +#ifndef _WINRT + +#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL + +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 */ + +static char * +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; +} + +static wchar_t * +wchar_from_utf8(const char *s) +{ + wchar_t *d, *r; + int c; + /* This allocation is larger than we need, but it's guaranteed + * to be safe. */ + r = d = malloc((strlen(s) + 1) * sizeof(wchar_t)); + if (!r) + return NULL; + while (*s) { + s += fz_chartorune(&c, s); + /* Truncating c to a wchar_t can be problematic if c + * is 0x10000. */ + if (c >= 0x10000) + { + c -= 0x10000; + *d++ = 0xd800 + (c>>10); + c = 0xdc00 + (c&1023); + } + *d++ = c; + } + *d = 0; + return r; +} + +void * +fz_fopen_utf8(const char *name, const char *mode) +{ + wchar_t *wname, *wmode; + FILE *file; + + wname = wchar_from_utf8(name); + if (wname == NULL) + { + return NULL; + } + + wmode = 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 = 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(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); +} + +int64_t +fz_stat_ctime(const char *path) +{ + struct _stat info; + wchar_t *wpath; + + wpath = wchar_from_utf8(path); + if (wpath == NULL) + return 0; + + if (_wstat(wpath, &info) < 0) { + free(wpath); + return 0; + } + + free(wpath); + return info.st_ctime; +} + +int64_t +fz_stat_mtime(const char *path) +{ + struct _stat info; + wchar_t *wpath; + + wpath = wchar_from_utf8(path); + if (wpath == NULL) + return 0; + + if (_wstat(wpath, &info) < 0) { + free(wpath); + return 0; + } + + free(wpath); + return info.st_mtime; +} + +int +fz_mkdir(char *path) +{ + int ret; + wchar_t *wpath = wchar_from_utf8(path); + + if (wpath == NULL) + return -1; + + ret = _wmkdir(wpath); + + free(wpath); + + return ret; +} + +#else + +int64_t +fz_stat_ctime(const char *path) +{ + struct stat info; + if (stat(path, &info) < 0) + return 0; + return info.st_ctime; +} + +int64_t +fz_stat_mtime(const char *path) +{ + struct stat info; + if (stat(path, &info) < 0) + return 0; + return info.st_mtime; +} + +int +fz_mkdir(char *path) +{ + return mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO); +} + +#endif /* _WIN32 */
