summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
Diffstat (limited to 'Python')
-rw-r--r--Python/pystrtod.c73
1 files changed, 25 insertions, 48 deletions
diff --git a/Python/pystrtod.c b/Python/pystrtod.c
index ab25799..19f25da 100644
--- a/Python/pystrtod.c
+++ b/Python/pystrtod.c
@@ -38,8 +38,7 @@
* Return value: the #gdouble value.
**/
double
-PyOS_ascii_strtod(const char *nptr,
- char **endptr)
+PyOS_ascii_strtod(const char *nptr, char **endptr)
{
char *fail_pos;
double val;
@@ -49,7 +48,6 @@ PyOS_ascii_strtod(const char *nptr,
const char *p, *decimal_point_pos;
const char *end = NULL; /* Silence gcc */
-/* g_return_val_if_fail (nptr != NULL, 0); */
assert(nptr != NULL);
fail_pos = NULL;
@@ -73,64 +71,36 @@ PyOS_ascii_strtod(const char *nptr,
if (*p == '+' || *p == '-')
p++;
- if (p[0] == '0' &&
- (p[1] == 'x' || p[1] == 'X'))
+ while (ISDIGIT(*p))
+ p++;
+
+ if (*p == '.')
{
- p += 2;
- /* HEX - find the (optional) decimal point */
+ decimal_point_pos = p++;
- while (ISXDIGIT(*p))
+ while (ISDIGIT(*p))
p++;
- if (*p == '.')
- {
- decimal_point_pos = p++;
-
- while (ISXDIGIT(*p))
- p++;
-
- if (*p == 'p' || *p == 'P')
- p++;
- if (*p == '+' || *p == '-')
- p++;
- while (ISDIGIT(*p))
- p++;
- end = p;
- }
- }
- else
- {
+ if (*p == 'e' || *p == 'E')
+ p++;
+ if (*p == '+' || *p == '-')
+ p++;
while (ISDIGIT(*p))
p++;
-
- if (*p == '.')
- {
- decimal_point_pos = p++;
-
- while (ISDIGIT(*p))
- p++;
-
- if (*p == 'e' || *p == 'E')
- p++;
- if (*p == '+' || *p == '-')
- p++;
- while (ISDIGIT(*p))
- p++;
- end = p;
- }
+ end = p;
}
- /* For the other cases, we need not convert the decimal point */
+ /* For the other cases, we need not convert the decimal point */
}
- /* Set errno to zero, so that we can distinguish zero results
- and underflows */
+ /* Set errno to zero, so that we can distinguish zero results
+ and underflows */
errno = 0;
if (decimal_point_pos)
{
char *copy, *c;
- /* We need to convert the '.' to the locale specific decimal point */
+ /* We need to convert the '.' to the locale specific decimal point */
copy = malloc(end - nptr + 1 + decimal_point_len);
c = copy;
@@ -155,8 +125,15 @@ PyOS_ascii_strtod(const char *nptr,
free(copy);
}
- else
- val = strtod(nptr, &fail_pos);
+ else {
+ unsigned i = 0;
+ if (nptr[i] == '-')
+ i++;
+ if (nptr[i] == '0' && (nptr[i+1] == 'x' || nptr[i+1] == 'X'))
+ fail_pos = nptr;
+ else
+ val = strtod(nptr, &fail_pos);
+ }
if (endptr)
*endptr = fail_pos;