mirror of https://github.com/FFmpeg/FFmpeg.git
Signed-off-by: Martin Storsjö <martin@martin.st>pull/28/head
parent
0db2d94280
commit
4fa661a857
4 changed files with 167 additions and 0 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 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; |
||||||
|
} |
Loading…
Reference in new issue