From 5ae9fa13f5ac640bec113120d540f70971aa635d Mon Sep 17 00:00:00 2001 From: Derek Buitenhuis Date: Mon, 24 Sep 2012 18:44:20 -0400 Subject: [PATCH] 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 --- compat/msvcrt/snprintf.c | 4 ++++ compat/msvcrt/snprintf.h | 38 ++++++++++++++++++++++++++++++++++++++ configure | 8 ++++++++ libavutil/Makefile | 5 +++-- 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 compat/msvcrt/snprintf.h 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 + * + * 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 +#include + +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 */ diff --git a/configure b/configure index 3f22cc182a..5c60b01d53 100755 --- a/configure +++ b/configure @@ -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 \