annotate lib/xstrtod.c @ 10375:f96e845fc36d

Avoid some "gcc -pedantic" warnings.
author Bruno Haible <bruno@clisp.org>
date Sat, 30 Aug 2008 03:09:15 +0200
parents bbbbbf4cd1c5
children e8d2c6fc33ad
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
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
3 Copyright (C) 1996, 1999, 2000, 2003, 2004, 2005, 2006 Free
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
4 Software Foundation, Inc.
569
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
5
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 7302
diff changeset
6 This program is free software: you can redistribute it and/or modify
569
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
7 it under the terms of the GNU General Public License as published by
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 7302
diff changeset
8 the Free Software Foundation; either version 3 of the License, or
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 7302
diff changeset
9 (at your option) any later version.
569
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
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 7302
diff changeset
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
569
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
18
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
19 /* Written by Jim Meyering. */
Jim Meyering <jim@meyering.net>
parents: 568
diff changeset
20
7302
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6912
diff changeset
21 #include <config.h>
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
22
4691
ce37d22a271f Remove K&R cruft.
Paul Eggert <eggert@cs.ucla.edu>
parents: 2081
diff changeset
23 #include "xstrtod.h"
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
24
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25 #include <errno.h>
4691
ce37d22a271f Remove K&R cruft.
Paul Eggert <eggert@cs.ucla.edu>
parents: 2081
diff changeset
26 #include <limits.h>
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27 #include <stdio.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
28
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
29 #if LONG
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
30 # define XSTRTOD xstrtold
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
31 # define DOUBLE long double
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
32 #else
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
33 # define XSTRTOD xstrtod
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
34 # define DOUBLE double
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
35 #endif
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
36
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
37 /* An interface to a string-to-floating-point conversion function that
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
38 encapsulates all the error checking one should usually perform.
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
39 Like strtod/strtold, but upon successful
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4910
diff changeset
40 conversion put the result in *RESULT and return true. Return
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4910
diff changeset
41 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
42 specifies the conversion function, e.g., strtod itself. */
568
Jim Meyering <jim@meyering.net>
parents: 513
diff changeset
43
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4910
diff changeset
44 bool
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
45 XSTRTOD (char const *str, char const **ptr, DOUBLE *result,
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
46 DOUBLE (*convert) (char const *, char **))
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
47 {
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
48 DOUBLE val;
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
49 char *terminator;
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4910
diff changeset
50 bool ok = true;
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
51
Jim Meyering <jim@meyering.net>
parents:
diff changeset
52 errno = 0;
4910
de285d9e7c4d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4691
diff changeset
53 val = convert (str, &terminator);
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
54
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 /* Having a non-zero terminator is an error only when PTR is NULL. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56 if (terminator == str || (ptr == NULL && *terminator != '\0'))
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 else
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59 {
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
60 /* Allow underflow (in which case CONVERT returns zero),
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
61 but flag overflow as an error. */
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6455
diff changeset
62 if (val != 0 && errno == ERANGE)
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4910
diff changeset
63 ok = false;
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
64 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
65
Jim Meyering <jim@meyering.net>
parents:
diff changeset
66 if (ptr != NULL)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
67 *ptr = terminator;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
68
Jim Meyering <jim@meyering.net>
parents:
diff changeset
69 *result = val;
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4910
diff changeset
70 return ok;
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
71 }