annotate lib/xstrtod.c @ 6455:8cf44d5bb070

* xstrtod.c: Don't bother with #pragma STDC FENV_ACCESS ON, as coreutils no longer futzes with rounding modes.
author Paul Eggert <eggert@cs.ucla.edu>
date Tue, 15 Nov 2005 18:30:06 +0000
parents a48fb0e98c8c
children 314715e0260d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4910
de285d9e7c4d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4691
diff changeset
1 /* error-checking interface to strtod-like functions
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4910
diff changeset
2
6455
8cf44d5bb070 * xstrtod.c: Don't bother with #pragma STDC FENV_ACCESS ON, as
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
3 Copyright (C) 1996, 1999, 2000, 2003, 2004, 2005 Free Software
8cf44d5bb070 * xstrtod.c: Don't bother with #pragma STDC FENV_ACCESS ON, as
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
4 Foundation, Inc.
569
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
5
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
6 This program is free software; you can redistribute it and/or modify
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
7 it under the terms of the GNU General Public License as published by
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
9 any later version.
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
10
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
11 This program is distributed in the hope that it will be useful,
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
14 GNU General Public License for more details.
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
15
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
16 You should have received a copy of the GNU General Public License
570
Jim Meyering <jim@meyering.net>
parents: 569
diff changeset
17 along with this program; if not, write to the Free Software Foundation,
5848
a48fb0e98c8c *** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents: 5159
diff changeset
18 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
569
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
19
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
20 /* Written by Jim Meyering. */
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
21
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
22 #ifdef HAVE_CONFIG_H
653
b63f146fd963 indent cpp-directives
Jim Meyering <jim@meyering.net>
parents: 570
diff changeset
23 # include <config.h>
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
24 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25
4691
ce37d22a271f Remove K&R cruft.
Paul Eggert <eggert@cs.ucla.edu>
parents: 2081
diff changeset
26 #include "xstrtod.h"
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27
Jim Meyering <jim@meyering.net>
parents:
diff changeset
28 #include <errno.h>
4691
ce37d22a271f Remove K&R cruft.
Paul Eggert <eggert@cs.ucla.edu>
parents: 2081
diff changeset
29 #include <limits.h>
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
30 #include <stdio.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
31
568
Jim Meyering <jim@meyering.net>
parents: 513
diff changeset
32 /* An interface to strtod that encapsulates all the error checking
569
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
33 one should usually perform. Like strtod, but upon successful
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4910
diff changeset
34 conversion put the result in *RESULT and return true. Return
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4910
diff changeset
35 false and don't modify *RESULT upon any failure. CONVERT
4910
de285d9e7c4d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4691
diff changeset
36 specifies the conversion function, e.g., strtod itself. */
568
Jim Meyering <jim@meyering.net>
parents: 513
diff changeset
37
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4910
diff changeset
38 bool
4910
de285d9e7c4d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4691
diff changeset
39 xstrtod (char const *str, char const **ptr, double *result,
de285d9e7c4d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4691
diff changeset
40 double (*convert) (char const *, char **))
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
42 double val;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
43 char *terminator;
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4910
diff changeset
44 bool ok = true;
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
45
Jim Meyering <jim@meyering.net>
parents:
diff changeset
46 errno = 0;
4910
de285d9e7c4d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4691
diff changeset
47 val = convert (str, &terminator);
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
48
Jim Meyering <jim@meyering.net>
parents:
diff changeset
49 /* Having a non-zero terminator is an error only when PTR is NULL. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
50 if (terminator == str || (ptr == NULL && *terminator != '\0'))
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4910
diff changeset
51 ok = false;
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
52 else
Jim Meyering <jim@meyering.net>
parents:
diff changeset
53 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
54 /* Allow underflow (in which case strtod returns zero),
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 but flag overflow as an error. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56 if (val != 0.0 && errno == ERANGE)
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4910
diff changeset
57 ok = false;
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59
Jim Meyering <jim@meyering.net>
parents:
diff changeset
60 if (ptr != NULL)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
61 *ptr = terminator;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
62
Jim Meyering <jim@meyering.net>
parents:
diff changeset
63 *result = val;
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4910
diff changeset
64 return ok;
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
65 }