Signed-off-by: Martin Storsjö <martin@martin.st>tags/n1.0
@@ -0,0 +1,63 @@ | |||||
/* | |||||
* C99-compatible snprintf() and vsnprintf() implementations | |||||
* Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com> | |||||
* | |||||
* This file is part of Libav. | |||||
* | |||||
* Libav 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. | |||||
* | |||||
* Libav 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 Libav; if not, write to the Free Software | |||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
*/ | |||||
#include <stdio.h> | |||||
#include <stdarg.h> | |||||
#include <limits.h> | |||||
#include <string.h> | |||||
#include "libavutil/error.h" | |||||
int avpriv_snprintf(char *s, size_t n, const char *fmt, ...) | |||||
{ | |||||
va_list ap; | |||||
int ret; | |||||
va_start(ap, fmt); | |||||
ret = avpriv_vsnprintf(s, n, fmt, ap); | |||||
va_end(ap); | |||||
return ret; | |||||
} | |||||
int avpriv_vsnprintf(char *s, size_t n, const char *fmt, | |||||
va_list ap) | |||||
{ | |||||
int ret; | |||||
if (n == 0) | |||||
return 0; | |||||
else if (n > INT_MAX) | |||||
return AVERROR(EOVERFLOW); | |||||
/* 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,94 @@ | |||||
/* | |||||
* C99-compatible strtod() implementation | |||||
* Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com> | |||||
* | |||||
* This file is part of Libav. | |||||
* | |||||
* Libav 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. | |||||
* | |||||
* Libav 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 Libav; 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 <stdlib.h> | |||||
#include "libavutil/avstring.h" | |||||
#include "libavutil/mathematics.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 strtod(const char *, char **); | |||||
double avpriv_strtod(const char *nptr, char **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; | |||||
} |
@@ -1183,6 +1183,7 @@ HAVE_LIST=" | |||||
mkstemp | mkstemp | ||||
mm_empty | mm_empty | ||||
mmap | mmap | ||||
msvcrt | |||||
nanosleep | nanosleep | ||||
poll_h | poll_h | ||||
posix_memalign | posix_memalign | ||||
@@ -2808,6 +2809,12 @@ elif check_header _mingw.h; then | |||||
die "ERROR: MinGW runtime version must be >= 3.15." | die "ERROR: MinGW runtime version must be >= 3.15." | ||||
elif check_cpp_condition newlib.h "defined _NEWLIB_VERSION"; then | elif check_cpp_condition newlib.h "defined _NEWLIB_VERSION"; then | ||||
libc_type=newlib | libc_type=newlib | ||||
elif check_func_headers stdlib.h _get_doserrno; then | |||||
libc_type=msvcrt | |||||
add_cflags -Dstrtod=avpriv_strtod | |||||
add_cflags -Dsnprintf=avpriv_snprintf \ | |||||
-D_snprintf=avpriv_snprintf \ | |||||
-Dvsnprintf=avpriv_vsnprintf | |||||
elif check_cpp_condition stddef.h "defined __KLIBC__"; then | elif check_cpp_condition stddef.h "defined __KLIBC__"; then | ||||
libc_type=klibc | libc_type=klibc | ||||
fi | fi | ||||
@@ -87,6 +87,9 @@ OBJS = adler32.o \ | |||||
utils.o \ | utils.o \ | ||||
xtea.o \ | xtea.o \ | ||||
OBJS-$(HAVE_MSVCRT) += ../compat/msvcrt/snprintf.o \ | |||||
../compat/strtod.o | |||||
TESTPROGS = adler32 \ | TESTPROGS = adler32 \ | ||||
aes \ | aes \ | ||||
avstring \ | avstring \ | ||||