diff options
author | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2012-09-25 02:44:20 +0400 |
---|---|---|
committer | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2012-09-26 02:14:14 +0400 |
commit | 5ae9fa13f5ac640bec113120d540f70971aa635d (patch) | |
tree | 859f54e978977b136151ebac1733c18f1d4de175 | |
parent | de73ae6b1a3ff0398988dc683f94ea07e3bb1372 (diff) |
MinGW: Use our snprintf/vsnprintf when MinGW's is broken
All versions of MinGW-w64 prior to version 3, as well as
all versions of MinGW32 have broken implementations of
vsnprintf.
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
-rw-r--r-- | compat/msvcrt/snprintf.c | 4 | ||||
-rw-r--r-- | compat/msvcrt/snprintf.h | 38 | ||||
-rwxr-xr-x | configure | 8 | ||||
-rw-r--r-- | libavutil/Makefile | 5 |
4 files changed, 53 insertions, 2 deletions
diff --git a/compat/msvcrt/snprintf.c b/compat/msvcrt/snprintf.c index 6787aad1c6..c64653fe82 100644 --- a/compat/msvcrt/snprintf.c +++ b/compat/msvcrt/snprintf.c @@ -27,6 +27,10 @@ #include "compat/va_copy.h" #include "libavutil/error.h" +#if defined(__MINGW32__) +#define EOVERFLOW EFBIG +#endif + int avpriv_snprintf(char *s, size_t n, const char *fmt, ...) { va_list ap; diff --git a/compat/msvcrt/snprintf.h b/compat/msvcrt/snprintf.h new file mode 100644 index 0000000000..f02113c5a2 --- /dev/null +++ b/compat/msvcrt/snprintf.h @@ -0,0 +1,38 @@ +/* + * C99-compatible snprintf() and vsnprintf() implementations + * Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com> + * + * 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 COMPAT_SNPRINTF_H +#define COMPAT_SNPRINTF_H + +#include <stdarg.h> +#include <stdio.h> + +int avpriv_snprintf(char *s, size_t n, const char *fmt, ...); +int avpriv_vsnprintf(char *s, size_t n, const char *fmt, va_list ap); + +#undef snprintf +#undef _snprintf +#undef vsnprintf +#define snprintf avpriv_snprintf +#define _snprintf avpriv_snprintf +#define vsnprintf avpriv_vsnprintf + +#endif /* COMPAT_SNPRINTF_H */ @@ -1265,6 +1265,7 @@ HAVE_LIST=" asm_types_h attribute_may_alias attribute_packed + broken_snprintf cbrtf clock_gettime closesocket @@ -3194,10 +3195,17 @@ elif check_header _mingw.h; then "defined (__MINGW64_VERSION_MAJOR) || (__MINGW32_MAJOR_VERSION > 3) || \ (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" || die "ERROR: MinGW runtime version must be >= 3.15." + if check_cpp_condition _mingw.h \ + "(defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64_VERSION_MAJOR)) || \ + __MINGW64_VERSION_MAJOR < 3"; then + enable broken_snprintf + add_cflags "-include $source_path/compat/msvcrt/snprintf.h" + fi elif check_cpp_condition newlib.h "defined _NEWLIB_VERSION"; then libc_type=newlib elif check_func_headers stdlib.h _get_doserrno; then libc_type=msvcrt + enable broken_snprintf add_cflags -Dstrtod=avpriv_strtod add_cflags -Dsnprintf=avpriv_snprintf \ -D_snprintf=avpriv_snprintf \ diff --git a/libavutil/Makefile b/libavutil/Makefile index 75039b1887..18a5a63557 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -94,8 +94,9 @@ OBJS = adler32.o \ utils.o \ xtea.o \ -OBJS-$(HAVE_MSVCRT) += ../compat/msvcrt/snprintf.o \ - ../compat/strtod.o +OBJS-$(HAVE_BROKEN_SNPRINTF) += ../compat/msvcrt/snprintf.o + +OBJS-$(HAVE_MSVCRT) += ../compat/strtod.o TESTPROGS = adler32 \ aes \ |