diff options
| author | Ilia Alshanetsky <iliaa@php.net> | 2006-12-26 16:44:20 +0000 |
|---|---|---|
| committer | Ilia Alshanetsky <iliaa@php.net> | 2006-12-26 16:44:20 +0000 |
| commit | ff9d0fcc783c19d729ae475fe8baf76d94a003a9 (patch) | |
| tree | d65d57b4975f5ebbb243ab538b871ca2f57d3c91 /Zend/zend_strtod.c | |
| parent | 24124518ab1387dcc63e3ddeec2acdf43362e20f (diff) | |
| download | php-git-ff9d0fcc783c19d729ae475fe8baf76d94a003a9.tar.gz | |
is_numeric_string() optimization
# Original Patch by Matt Wilmas
Diffstat (limited to 'Zend/zend_strtod.c')
| -rw-r--r-- | Zend/zend_strtod.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/Zend/zend_strtod.c b/Zend/zend_strtod.c index 4fed8c3552..d388697f5b 100644 --- a/Zend/zend_strtod.c +++ b/Zend/zend_strtod.c @@ -2557,6 +2557,39 @@ ret: return result; } +ZEND_API double zend_hex_strtod(const char *str, char **endptr) +{ + const char *s = str; + char c; + int any = 0; + double value = 0; + + if (*s == '0' && (s[1] == 'x' || s[1] == 'X')) { + s += 2; + } + + while (c = *s++) { + if (c >= '0' && c <= '9') { + c -= '0'; + } else if (c >= 'A' && c <= 'F') { + c -= 'A' - 10; + } else if (c >= 'a' && c <= 'f') { + c -= 'a' - 10; + } else { + break; + } + + any = 1; + value = value * 16 + c; + } + + if (endptr != NULL) { + *endptr = (char *)(any ? s - 1 : str); + } + + return value; +} + /* * Local variables: * tab-width: 4 |
