mirror of https://github.com/FFmpeg/FFmpeg.git
* qatar/master: fate: Allow setting the ld parameter from the config file x86: dsputil: Do not redundantly check for CPU caps before calling init funcs configure: Disable some warnings in MSVC x86: vp56: cmov version of vp56_rac_get_prob requires inline asm avopt: fix examples to match the same style about default values as the actual code. configure: Add support for MSVC cl.exe/link.exe lavu: add snprintf(), vsnprint() and strtod() replacements for MS runtime. Conflicts: libavutil/opt.h Merged-by: Michael Niedermayer <michaelni@gmx.at>pull/28/head
commit
40112e7b35
8 changed files with 220 additions and 9 deletions
@ -0,0 +1,63 @@ |
||||
/*
|
||||
* 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 <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 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 <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; |
||||
} |
Loading…
Reference in new issue