diff options
author | Martin Storsjö <martin@martin.st> | 2022-05-20 23:37:15 +0300 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2022-05-23 13:35:59 +0300 |
commit | 3fb924464244bc317a5d19ab25625ae35abde512 (patch) | |
tree | 1088f8eebc771a4ca03f00663eb13f64c12b7ec6 /fftools/fopen_utf8.h | |
parent | 1f9b5fa5815c0ea22d830da6cc4cbfcb6098def4 (diff) | |
download | ffmpeg-3fb924464244bc317a5d19ab25625ae35abde512.tar.gz |
fftools: Stop using av_fopen_utf8
Provide a header based inline reimplementation of it.
Using av_fopen_utf8 doesn't work outside of the libraries when built
with MSVC as shared libraries (in the default configuration, where
each DLL gets a separate statically linked CRT).
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'fftools/fopen_utf8.h')
-rw-r--r-- | fftools/fopen_utf8.h | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/fftools/fopen_utf8.h b/fftools/fopen_utf8.h new file mode 100644 index 0000000000..db57fcaec4 --- /dev/null +++ b/fftools/fopen_utf8.h @@ -0,0 +1,71 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef FFTOOLS_FOPEN_UTF8_H +#define FFTOOLS_FOPEN_UTF8_H + +#include <stdio.h> + +/* The fopen_utf8 function here is essentially equivalent to av_fopen_utf8, + * except that it doesn't set O_CLOEXEC, and that it isn't exported + * from a different library. (On Windows, each DLL might use a different + * CRT, and FILE* handles can't be shared across them.) */ + +#ifdef _WIN32 +#include "libavutil/wchar_filename.h" + +static inline FILE *fopen_utf8(const char *path_utf8, const char *mode) +{ + wchar_t *path_w, *mode_w; + FILE *f; + + /* convert UTF-8 to wide chars */ + if (utf8towchar(path_utf8, &path_w)) /* This sets errno on error. */ + return NULL; + if (!path_w) + goto fallback; + + if (utf8towchar(mode, &mode_w)) + return NULL; + if (!mode_w) { + /* If failing to interpret the mode string as utf8, it is an invalid + * parameter. */ + av_freep(&path_w); + errno = EINVAL; + return NULL; + } + + f = _wfopen(path_w, mode_w); + av_freep(&path_w); + av_freep(&mode_w); + + return f; +fallback: + /* path may be in CP_ACP */ + return fopen(path_utf8, mode); +} + +#else + +static inline FILE *fopen_utf8(const char *path, const char *mode) +{ + return fopen(path, mode); +} +#endif + +#endif /* FFTOOLS_FOPEN_UTF8_H */ |