mirror of https://github.com/FFmpeg/FFmpeg.git
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>pull/28/head
parent
416d2f7a12
commit
ba53720280
6 changed files with 268 additions and 0 deletions
@ -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 */ |
Loading…
Reference in new issue