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