Mercurial > hg > octave-kai > gnulib-hg
annotate lib/xstrtod.c @ 3063:e0287ca43594
*** empty log message ***
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Tue, 19 Dec 2000 08:16:25 +0000 |
parents | a81cc8789f1f |
children | ce37d22a271f |
rev | line source |
---|---|
569 | 1 /* xstrtod.c - error-checking interface to strtod |
2081
a81cc8789f1f
Add #pragma STDC FENV_ACCESS ON if C99.
Jim Meyering <jim@meyering.net>
parents:
1853
diff
changeset
|
2 Copyright (C) 1996, 1999, 2000 Free Software Foundation, Inc. |
569 | 3 |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2, or (at your option) | |
7 any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
570 | 15 along with this program; if not, write to the Free Software Foundation, |
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
569 | 17 |
18 /* Written by Jim Meyering. */ | |
19 | |
513 | 20 #ifdef HAVE_CONFIG_H |
653 | 21 # include <config.h> |
513 | 22 #endif |
23 | |
24 #ifdef STDC_HEADERS | |
653 | 25 # include <stdlib.h> |
513 | 26 #else |
27 double strtod (); | |
28 #endif | |
29 | |
30 #include <errno.h> | |
31 #include <stdio.h> | |
32 #include <limits.h> | |
33 #include "xstrtod.h" | |
34 | |
2081
a81cc8789f1f
Add #pragma STDC FENV_ACCESS ON if C99.
Jim Meyering <jim@meyering.net>
parents:
1853
diff
changeset
|
35 /* Tell the compiler that non-default rounding modes are used. */ |
a81cc8789f1f
Add #pragma STDC FENV_ACCESS ON if C99.
Jim Meyering <jim@meyering.net>
parents:
1853
diff
changeset
|
36 #if 199901 <= __STDC_VERSION__ |
a81cc8789f1f
Add #pragma STDC FENV_ACCESS ON if C99.
Jim Meyering <jim@meyering.net>
parents:
1853
diff
changeset
|
37 #pragma STDC FENV_ACCESS ON |
a81cc8789f1f
Add #pragma STDC FENV_ACCESS ON if C99.
Jim Meyering <jim@meyering.net>
parents:
1853
diff
changeset
|
38 #endif |
a81cc8789f1f
Add #pragma STDC FENV_ACCESS ON if C99.
Jim Meyering <jim@meyering.net>
parents:
1853
diff
changeset
|
39 |
568 | 40 /* An interface to strtod that encapsulates all the error checking |
569 | 41 one should usually perform. Like strtod, but upon successful |
42 conversion put the result in *RESULT and return zero. Return | |
43 non-zero and don't modify *RESULT upon any failure. */ | |
568 | 44 |
513 | 45 int |
46 xstrtod (str, ptr, result) | |
47 const char *str; | |
48 const char **ptr; | |
49 double *result; | |
50 { | |
51 double val; | |
52 char *terminator; | |
53 int fail; | |
54 | |
55 fail = 0; | |
56 errno = 0; | |
57 val = strtod (str, &terminator); | |
58 | |
59 /* Having a non-zero terminator is an error only when PTR is NULL. */ | |
60 if (terminator == str || (ptr == NULL && *terminator != '\0')) | |
61 fail = 1; | |
62 else | |
63 { | |
64 /* Allow underflow (in which case strtod returns zero), | |
65 but flag overflow as an error. */ | |
66 if (val != 0.0 && errno == ERANGE) | |
67 fail = 1; | |
68 } | |
69 | |
70 if (ptr != NULL) | |
71 *ptr = terminator; | |
72 | |
73 *result = val; | |
74 return fail; | |
75 } |