diff options
author | Mark Dickinson <dickinsm@gmail.com> | 2009-05-03 22:33:34 (GMT) |
---|---|---|
committer | Mark Dickinson <dickinsm@gmail.com> | 2009-05-03 22:33:34 (GMT) |
commit | 01fce5adc0ca353122a72af905a084ac37ea7bc1 (patch) | |
tree | 746a1af029ded3d952827b7678c1000b1f344041 /Python | |
parent | 777e4ff5039d1ac5aba9bb16b6edcb00d4d7c151 (diff) | |
download | cpython-01fce5adc0ca353122a72af905a084ac37ea7bc1.zip cpython-01fce5adc0ca353122a72af905a084ac37ea7bc1.tar.gz cpython-01fce5adc0ca353122a72af905a084ac37ea7bc1.tar.bz2 |
Don't use PyOS_strnicmp for NaN and Inf detection: it's locale-aware.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/pystrtod.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/Python/pystrtod.c b/Python/pystrtod.c index 9aeef28..2be3834 100644 --- a/Python/pystrtod.c +++ b/Python/pystrtod.c @@ -40,6 +40,19 @@ correctly rounded results. */ +/* Case-insensitive string match used for nan and inf detection; t should be + lower-case. Returns 1 for a successful match, 0 otherwise. */ + +static int +case_insensitive_match(const char *s, const char *t) +{ + while(*t && Py_TOLOWER(*s) == *t) { + s++; + t++; + } + return *t ? 0 : 1; +} + double PyOS_ascii_strtod(const char *nptr, char **endptr) { @@ -89,9 +102,9 @@ PyOS_ascii_strtod(const char *nptr, char **endptr) /* Parse infinities and nans */ if (*p == 'i' || *p == 'I') { - if (PyOS_strnicmp(p, "inf", 3) == 0) { + if (case_insensitive_match(p+1, "nf")) { val = Py_HUGE_VAL; - if (PyOS_strnicmp(p+3, "inity", 5) == 0) + if (case_insensitive_match(p+3, "inity")) fail_pos = (char *)p+8; else fail_pos = (char *)p+3; @@ -102,7 +115,7 @@ PyOS_ascii_strtod(const char *nptr, char **endptr) } #ifdef Py_NAN if (*p == 'n' || *p == 'N') { - if (PyOS_strnicmp(p, "nan", 3) == 0) { + if (case_insensitive_match(p+1, "an")) { val = Py_NAN; fail_pos = (char *)p+3; goto got_val; |