annotate lib/xstrtod.c @ 513:9af85df20faa

.
author Jim Meyering <jim@meyering.net>
date Wed, 15 Nov 1995 21:58:58 +0000
parents
children a0eb0db5621b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
513
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1 #ifdef HAVE_CONFIG_H
Jim Meyering <jim@meyering.net>
parents:
diff changeset
2 #include <config.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
3 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
4
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5 #ifdef STDC_HEADERS
Jim Meyering <jim@meyering.net>
parents:
diff changeset
6 #include <stdlib.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
7 #else
Jim Meyering <jim@meyering.net>
parents:
diff changeset
8 double strtod ();
Jim Meyering <jim@meyering.net>
parents:
diff changeset
9 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10
Jim Meyering <jim@meyering.net>
parents:
diff changeset
11 #include <errno.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 #include <stdio.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
13 #include <limits.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14 #include <ctype.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15 #include "xstrtod.h"
Jim Meyering <jim@meyering.net>
parents:
diff changeset
16
Jim Meyering <jim@meyering.net>
parents:
diff changeset
17 int
Jim Meyering <jim@meyering.net>
parents:
diff changeset
18 xstrtod (str, ptr, result)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
19 const char *str;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
20 const char **ptr;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
21 double *result;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
22 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
23 double val;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
24 char *terminator;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25 int fail;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
26
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27 fail = 0;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
28 errno = 0;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
29 val = strtod (str, &terminator);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
30
Jim Meyering <jim@meyering.net>
parents:
diff changeset
31 /* Having a non-zero terminator is an error only when PTR is NULL. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
32 if (terminator == str || (ptr == NULL && *terminator != '\0'))
Jim Meyering <jim@meyering.net>
parents:
diff changeset
33 fail = 1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
34 else
Jim Meyering <jim@meyering.net>
parents:
diff changeset
35 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
36 /* Allow underflow (in which case strtod returns zero),
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 but flag overflow as an error. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
38 if (val != 0.0 && errno == ERANGE)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
39 fail = 1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41
Jim Meyering <jim@meyering.net>
parents:
diff changeset
42 if (ptr != NULL)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
43 *ptr = terminator;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
44
Jim Meyering <jim@meyering.net>
parents:
diff changeset
45 *result = val;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
46 return fail;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
47 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
48