Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.0
| @@ -0,0 +1,64 @@ | |||||
| /* | |||||
| * 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 | |||||
| */ | |||||
| #include <limits.h> | |||||
| #include <string.h> | |||||
| #include "libavutil/error.h" | |||||
| #include "snprintf.h" | |||||
| #undef snprintf | |||||
| int avpriv_snprintf(char *restrict s, size_t n, const char *restrict fmt, ...) | |||||
| { | |||||
| va_list ap; | |||||
| int ret; | |||||
| va_start(ap, fmt); | |||||
| ret = avpriv_vsnprintf(s, n, fmt, ap); | |||||
| va_end(ap); | |||||
| return ret; | |||||
| } | |||||
| #undef vsnprintf | |||||
| int avpriv_vsnprintf(char *restrict s, size_t n, const char *restrict fmt, | |||||
| va_list ap) | |||||
| { | |||||
| int ret; | |||||
| if (n == 0) | |||||
| return 0; | |||||
| else if (n > INT_MAX) | |||||
| return AVERROR(EINVAL); | |||||
| /* we use n - 1 here because if the buffer is not big enough, the MS | |||||
| * runtime libraries don't add a terminating zero at the end. MSDN | |||||
| * recommends to provide _snprintf/_vsnprintf() a buffer size that | |||||
| * is one less than the actual buffer, and zero it before calling | |||||
| * _snprintf/_vsnprintf() to workaround this problem. | |||||
| * See http://msdn.microsoft.com/en-us/library/1kt27hek(v=vs.80).aspx */ | |||||
| memset(s, 0, n); | |||||
| ret = vsnprintf(s, n - 1, fmt, ap); | |||||
| if (ret == -1) | |||||
| ret = n; | |||||
| return ret; | |||||
| } | |||||
| @@ -0,0 +1,46 @@ | |||||
| /* | |||||
| * 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 AVCOMPAT_SNPRINTF_H | |||||
| #define AVCOMPAT_SNPRINTF_H | |||||
| #include <stdarg.h> | |||||
| #include <stdio.h> | |||||
| /* | |||||
| * snprintf() on MSVCRT returns -1 (instead of required buffer length) | |||||
| * if the input buffer isn't big enough. Also, if the required buffer | |||||
| * length is exactly identical to the input buffer size, or if the | |||||
| * return value is -1 because the input buffer isn't big enough, MSVCRT | |||||
| * will fail to NULL-terminate the output buffer. vsnprintf() has the | |||||
| * same issue. | |||||
| * | |||||
| * Thus, provide our own fallback wrappers with correct behaviour. | |||||
| */ | |||||
| #undef snprintf | |||||
| #define snprintf avpriv_snprintf | |||||
| int snprintf(char *restrict s, size_t n, const char *restrict format, ...); | |||||
| #undef vsnprintf | |||||
| #define vsnprintf avpriv_vsnprintf | |||||
| int vsnprintf(char *restrict s, size_t n, const char *restrict format, va_list ap); | |||||
| #endif /* AVCOMPAT_SNPRINTF_H */ | |||||
| @@ -0,0 +1,92 @@ | |||||
| /* | |||||
| * C99-compatible strtod() implementation | |||||
| * 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 | |||||
| */ | |||||
| #include <ctype.h> | |||||
| #include <limits.h> | |||||
| #include "libavutil/avstring.h" | |||||
| #include "libavutil/mathematics.h" | |||||
| #include "strtod.h" | |||||
| static char *check_nan_suffix(char *s) | |||||
| { | |||||
| char *start = s; | |||||
| if (*s++ != '(') | |||||
| return start; | |||||
| while ((*s >= 'a' && *s <= 'z') || (*s >= 'A' && *s <= 'Z') || | |||||
| (*s >= '0' && *s <= '9') || *s == '_') | |||||
| s++; | |||||
| return *s == ')' ? s + 1 : start; | |||||
| } | |||||
| #undef strtod | |||||
| double avpriv_strtod(char *restrict nptr, char **restrict endptr) | |||||
| { | |||||
| char *end; | |||||
| double res; | |||||
| /* Skip leading spaces */ | |||||
| while (isspace(*nptr)) | |||||
| nptr++; | |||||
| if (!av_strncasecmp(nptr, "infinity", 8)) { | |||||
| end = nptr + 8; | |||||
| res = INFINITY; | |||||
| } else if (!av_strncasecmp(nptr, "inf", 3)) { | |||||
| end = nptr + 3; | |||||
| res = INFINITY; | |||||
| } else if (!av_strncasecmp(nptr, "+infinity", 9)) { | |||||
| end = nptr + 9; | |||||
| res = INFINITY; | |||||
| } else if (!av_strncasecmp(nptr, "+inf", 4)) { | |||||
| end = nptr + 4; | |||||
| res = INFINITY; | |||||
| } else if (!av_strncasecmp(nptr, "-infinity", 9)) { | |||||
| end = nptr + 9; | |||||
| res = -INFINITY; | |||||
| } else if (!av_strncasecmp(nptr, "-inf", 4)) { | |||||
| end = nptr + 4; | |||||
| res = -INFINITY; | |||||
| } else if (!av_strncasecmp(nptr, "nan", 3)) { | |||||
| end = check_nan_suffix(nptr + 3); | |||||
| res = NAN; | |||||
| } else if (!av_strncasecmp(nptr, "+nan", 4) || | |||||
| !av_strncasecmp(nptr, "-nan", 4)) { | |||||
| end = check_nan_suffix(nptr + 4); | |||||
| res = NAN; | |||||
| } else if (!av_strncasecmp(nptr, "0x", 2) || | |||||
| !av_strncasecmp(nptr, "-0x", 3) || | |||||
| !av_strncasecmp(nptr, "+0x", 3)) { | |||||
| /* FIXME this doesn't handle exponents, non-integers (float/double) | |||||
| * and numbers too large for long long */ | |||||
| res = strtoll(nptr, &end, 16); | |||||
| } else { | |||||
| res = strtod(nptr, &end); | |||||
| } | |||||
| if (endptr) | |||||
| *endptr = end; | |||||
| return res; | |||||
| } | |||||
| @@ -0,0 +1,37 @@ | |||||
| /* | |||||
| * C99-compatible strtod() implementation | |||||
| * 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 AVCOMPAT_STRTOD_H | |||||
| #define AVCOMPAT_STRTOD_H | |||||
| #include <stdlib.h> | |||||
| /* | |||||
| * strtod() on MSVCRT doesn't handle strings like 'inf' or 'nan'. Also, | |||||
| * it doesn't handle "0x" prefixes for hexadecimal input. | |||||
| * | |||||
| * Thus, provide our own fallback wrapper with correct behaviour. | |||||
| */ | |||||
| #undef strtod | |||||
| #define strtod avpriv_strtod | |||||
| double strtod(char *restrict nptr, char **restrict endptr); | |||||
| #endif /* AVCOMPAT_STRTOD_H */ | |||||
| @@ -1043,6 +1043,11 @@ cp_if_changed(){ | |||||
| cp -f "$1" "$2" | cp -f "$1" "$2" | ||||
| } | } | ||||
| force_include(){ | |||||
| flag=$(eval printf '%s%s\\n' '$FORCE_INC' $1) | |||||
| append CFLAGS "$flag" | |||||
| } | |||||
| # CONFIG_LIST contains configurable options, while HAVE_LIST is for | # CONFIG_LIST contains configurable options, while HAVE_LIST is for | ||||
| # system-dependent things. | # system-dependent things. | ||||
| @@ -1240,6 +1245,7 @@ HAVE_LIST=" | |||||
| asm_types_h | asm_types_h | ||||
| attribute_may_alias | attribute_may_alias | ||||
| attribute_packed | attribute_packed | ||||
| broken_strtod | |||||
| cbrtf | cbrtf | ||||
| clock_gettime | clock_gettime | ||||
| closesocket | closesocket | ||||
| @@ -1326,6 +1332,7 @@ HAVE_LIST=" | |||||
| setrlimit | setrlimit | ||||
| Sleep | Sleep | ||||
| sndio_h | sndio_h | ||||
| snprintf | |||||
| socklen_t | socklen_t | ||||
| soundcard_h | soundcard_h | ||||
| strerror_r | strerror_r | ||||
| @@ -2038,6 +2045,7 @@ CC_O='-o $@' | |||||
| CXX_C='-c' | CXX_C='-c' | ||||
| CXX_O='-o $@' | CXX_O='-o $@' | ||||
| LD_O='-o $@' | LD_O='-o $@' | ||||
| FORCE_INC="-include" | |||||
| HOSTCC_C='-c' | HOSTCC_C='-c' | ||||
| HOSTCC_O='-o $@' | HOSTCC_O='-o $@' | ||||
| @@ -3358,6 +3366,7 @@ check_func mmap | |||||
| check_func ${malloc_prefix}posix_memalign && enable posix_memalign | check_func ${malloc_prefix}posix_memalign && enable posix_memalign | ||||
| check_func_headers malloc.h _aligned_malloc && enable aligned_malloc | check_func_headers malloc.h _aligned_malloc && enable aligned_malloc | ||||
| check_func setrlimit | check_func setrlimit | ||||
| check_func snprintf | |||||
| check_func strerror_r | check_func strerror_r | ||||
| check_func strptime | check_func strptime | ||||
| check_func sched_getaffinity | check_func sched_getaffinity | ||||
| @@ -3378,6 +3387,15 @@ check_func_headers windows.h Sleep | |||||
| check_func_headers windows.h VirtualAlloc | check_func_headers windows.h VirtualAlloc | ||||
| check_func_headers glob.h glob | check_func_headers glob.h glob | ||||
| # Check for MSVCRT; it has a broken strtod() that can't parse some input. | |||||
| # Use old dos symbol to detect it. If we are on mingw, it already provides | |||||
| # its own replacement and we don't need to redo that. | |||||
| if check_func _get_doserrno; then | |||||
| if test $target_os != mingw32; then | |||||
| enable broken_strtod | |||||
| fi | |||||
| fi | |||||
| check_header dlfcn.h | check_header dlfcn.h | ||||
| check_header dxva.h | check_header dxva.h | ||||
| check_header dxva2api.h -D_WIN32_WINNT=0x0600 | check_header dxva2api.h -D_WIN32_WINNT=0x0600 | ||||
| @@ -3749,6 +3767,14 @@ elif enabled pathscale; then | |||||
| add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF | add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF | ||||
| fi | fi | ||||
| # If a missing snprintf/broken strtod is detected, force-include headers | |||||
| # that override prototypes and define it to a prefixed one implemented in | |||||
| # libavutil. We do this at the end since -I flags aren't set in configure, | |||||
| # and any additional check_cflags() beyond here will thus fail (because | |||||
| # it can't find these files, because the -I$(srcdir) wasn't set). | |||||
| enabled snprintf || force_include compat/snprintf.h | |||||
| enabled broken_strtod && force_include compat/strtod.h | |||||
| enabled_any $THREADS_LIST && enable threads | enabled_any $THREADS_LIST && enable threads | ||||
| check_deps $CONFIG_LIST \ | check_deps $CONFIG_LIST \ | ||||
| @@ -94,6 +94,9 @@ OBJS = adler32.o \ | |||||
| utils.o \ | utils.o \ | ||||
| xtea.o \ | xtea.o \ | ||||
| OBJS-$(!HAVE_SNPRINTF) += ../compat/snprintf.o | |||||
| OBJS-$(HAVE_BROKEN_STRTOD) += ../compat/strtod.o | |||||
| TESTPROGS = adler32 \ | TESTPROGS = adler32 \ | ||||
| aes \ | aes \ | ||||
| avstring \ | avstring \ | ||||