[FFmpeg-cvslog] MinGW: Use our snprintf/vsnprintf when MinGW's is broken

Derek Buitenhuis git at videolan.org
Wed Sep 26 00:14:24 CEST 2012


ffmpeg | branch: master | Derek Buitenhuis <derek.buitenhuis at gmail.com> | Mon Sep 24 18:44:20 2012 -0400| [5ae9fa13f5ac640bec113120d540f70971aa635d] | committer: Derek Buitenhuis

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 at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5ae9fa13f5ac640bec113120d540f70971aa635d
---

 compat/msvcrt/snprintf.c |    4 ++++
 compat/msvcrt/snprintf.h |   38 ++++++++++++++++++++++++++++++++++++++
 configure                |    8 ++++++++
 libavutil/Makefile       |    5 +++--
 4 files changed, 53 insertions(+), 2 deletions(-)

diff --git a/compat/msvcrt/snprintf.c b/compat/msvcrt/snprintf.c
index 6787aad..c64653f 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 0000000..f02113c
--- /dev/null
+++ b/compat/msvcrt/snprintf.h
@@ -0,0 +1,38 @@
+/*
+ * C99-compatible snprintf() and vsnprintf() implementations
+ * Copyright (c) 2012 Ronald S. Bultje <rsbultje at 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 */
diff --git a/configure b/configure
index 3f22cc1..5c60b01 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 75039b1..18a5a63 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                                                         \



More information about the ffmpeg-cvslog mailing list