annotate ffmpeg/compat/strtod.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * C99-compatible strtod() implementation
yading@10 3 * Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com>
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 #include <limits.h>
yading@10 23 #include <stdlib.h>
yading@10 24
yading@10 25 #include "libavutil/avstring.h"
yading@10 26 #include "libavutil/mathematics.h"
yading@10 27
yading@10 28 static char *check_nan_suffix(char *s)
yading@10 29 {
yading@10 30 char *start = s;
yading@10 31
yading@10 32 if (*s++ != '(')
yading@10 33 return start;
yading@10 34
yading@10 35 while ((*s >= 'a' && *s <= 'z') || (*s >= 'A' && *s <= 'Z') ||
yading@10 36 (*s >= '0' && *s <= '9') || *s == '_')
yading@10 37 s++;
yading@10 38
yading@10 39 return *s == ')' ? s + 1 : start;
yading@10 40 }
yading@10 41
yading@10 42 #undef strtod
yading@10 43 double strtod(const char *, char **);
yading@10 44
yading@10 45 double avpriv_strtod(const char *nptr, char **endptr)
yading@10 46 {
yading@10 47 char *end;
yading@10 48 double res;
yading@10 49
yading@10 50 /* Skip leading spaces */
yading@10 51 while (av_isspace(*nptr))
yading@10 52 nptr++;
yading@10 53
yading@10 54 if (!av_strncasecmp(nptr, "infinity", 8)) {
yading@10 55 end = nptr + 8;
yading@10 56 res = INFINITY;
yading@10 57 } else if (!av_strncasecmp(nptr, "inf", 3)) {
yading@10 58 end = nptr + 3;
yading@10 59 res = INFINITY;
yading@10 60 } else if (!av_strncasecmp(nptr, "+infinity", 9)) {
yading@10 61 end = nptr + 9;
yading@10 62 res = INFINITY;
yading@10 63 } else if (!av_strncasecmp(nptr, "+inf", 4)) {
yading@10 64 end = nptr + 4;
yading@10 65 res = INFINITY;
yading@10 66 } else if (!av_strncasecmp(nptr, "-infinity", 9)) {
yading@10 67 end = nptr + 9;
yading@10 68 res = -INFINITY;
yading@10 69 } else if (!av_strncasecmp(nptr, "-inf", 4)) {
yading@10 70 end = nptr + 4;
yading@10 71 res = -INFINITY;
yading@10 72 } else if (!av_strncasecmp(nptr, "nan", 3)) {
yading@10 73 end = check_nan_suffix(nptr + 3);
yading@10 74 res = NAN;
yading@10 75 } else if (!av_strncasecmp(nptr, "+nan", 4) ||
yading@10 76 !av_strncasecmp(nptr, "-nan", 4)) {
yading@10 77 end = check_nan_suffix(nptr + 4);
yading@10 78 res = NAN;
yading@10 79 } else if (!av_strncasecmp(nptr, "0x", 2) ||
yading@10 80 !av_strncasecmp(nptr, "-0x", 3) ||
yading@10 81 !av_strncasecmp(nptr, "+0x", 3)) {
yading@10 82 /* FIXME this doesn't handle exponents, non-integers (float/double)
yading@10 83 * and numbers too large for long long */
yading@10 84 res = strtoll(nptr, &end, 16);
yading@10 85 } else {
yading@10 86 res = strtod(nptr, &end);
yading@10 87 }
yading@10 88
yading@10 89 if (endptr)
yading@10 90 *endptr = end;
yading@10 91
yading@10 92 return res;
yading@10 93 }