pajoye Fri Nov 7 13:11:35 2008 UTC Modified files: /php-src/win32/build config.w32 /php-src/win32 php_strtoi64.h strtoi64.c Log: - MFB: strtoi64 forward compatible replacement for VC6 http://cvs.php.net/viewvc.cgi/php-src/win32/build/config.w32?r1=1.87&r2=1.88&diff_format=u Index: php-src/win32/build/config.w32 diff -u php-src/win32/build/config.w32:1.87 php-src/win32/build/config.w32:1.88 --- php-src/win32/build/config.w32:1.87 Fri Sep 26 13:31:01 2008 +++ php-src/win32/build/config.w32 Fri Nov 7 13:11:35 2008 @@ -1,5 +1,5 @@ // vim:ft=javascript -// $Id: config.w32,v 1.87 2008/09/26 13:31:01 pajoye Exp $ +// $Id: config.w32,v 1.88 2008/11/07 13:11:35 pajoye Exp $ // "Master" config file; think of it as a configure.in // equivalent. @@ -344,6 +344,11 @@ ADD_SOURCES("win32", "inet.c"); +// Newer versions have it +if (VCVERS <= 1300) { + ADD_SOURCES("win32", "strtoi64.c"); +} + ADD_SOURCES("main/streams", "streams.c cast.c memory.c filter.c plain_wrapper.c \ userspace.c transports.c xp_socket.c mmap.c unicode_filter.c glob_wrapper.c"); http://cvs.php.net/viewvc.cgi/php-src/win32/php_strtoi64.h?r1=1.1&r2=1.2&diff_format=u Index: php-src/win32/php_strtoi64.h diff -u /dev/null php-src/win32/php_strtoi64.h:1.2 --- /dev/null Fri Nov 7 13:11:35 2008 +++ php-src/win32/php_strtoi64.h Fri Nov 7 13:11:35 2008 @@ -0,0 +1,7 @@ +#if _MSC_VERS <= 1300 +#include "php.h" +#include "php_stdint.h" + +PHPAPI int64_t _strtoi64(const char *nptr, char **endptr, int base); +#define _strtoui64 _strtoi64 +#endif http://cvs.php.net/viewvc.cgi/php-src/win32/strtoi64.c?r1=1.1&r2=1.2&diff_format=u Index: php-src/win32/strtoi64.c diff -u /dev/null php-src/win32/strtoi64.c:1.2 --- /dev/null Fri Nov 7 13:11:35 2008 +++ php-src/win32/strtoi64.c Fri Nov 7 13:11:35 2008 @@ -0,0 +1,122 @@ +#if _MSC_VERS <= 1300 +#include "php_strtoi64.h" +/* + From APR, apr_strings.c + See http://www.apache.org/licenses/LICENSE-2.0 +*/ + +PHPAPI int64_t _strtoi64(const char *nptr, char **endptr, int base) +{ + const char *s; + int64_t acc; + int64_t val; + int neg, any; + char c; + + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + s = nptr; + do { + c = *s++; + } while (isspace((unsigned char)c)); + if (c == '-') { + neg = 1; + c = *s++; + } else { + neg = 0; + if (c == '+') { + c = *s++; + } + } + + if ((base == 0 || base == 16) && c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) { + base = c == '0' ? 8 : 10; + } + acc = any = 0; + if (base < 2 || base > 36) { + errno = EINVAL; + if (endptr != NULL) { + *endptr = (char *)(any ? s - 1 : nptr); + } + return acc; + } + + /* The classic bsd implementation requires div/mod operators + * to compute a cutoff. Benchmarking proves that iss very, very + * evil to some 32 bit processors. Instead, look for underflow + * in both the mult and add/sub operation. Unlike the bsd impl, + * we also work strictly in a signed int64 word as we haven't + * implemented the unsigned type in win32. + * + * Set 'any' if any `digits' consumed; make it negative to indicate + * overflow. + */ + val = 0; + for ( ; ; c = *s++) { + if (c >= '0' && c <= '9') + c -= '0'; + +#if (('Z' - 'A') == 25) + else if (c >= 'A' && c <= 'Z') + c -= 'A' - 10; + else if (c >= 'a' && c <= 'z') + c -= 'a' - 10; +#elif APR_CHARSET_EBCDIC + else if (c >= 'A' && c <= 'I') + c -= 'A' - 10; + else if (c >= 'J' && c <= 'R') + c -= 'J' - 19; + else if (c >= 'S' && c <= 'Z') + c -= 'S' - 28; + else if (c >= 'a' && c <= 'i') + c -= 'a' - 10; + else if (c >= 'j' && c <= 'r') + c -= 'j' - 19; + else if (c >= 's' && c <= 'z') + c -= 'z' - 28; +#else +# error "CANNOT COMPILE apr_strtoi64(), only ASCII and EBCDIC supported" +#endif + else { + break; + } + + if (c >= base) { + break; + } + + val *= base; + if ( (any < 0) /* already noted an over/under flow - short circuit */ + || (neg && (val > acc || (val -= c) > acc)) /* underflow */ + || (val < acc || (val += c) < acc)) { /* overflow */ + any = -1; /* once noted, over/underflows never go away */ +#ifdef APR_STRTOI64_OVERFLOW_IS_BAD_CHAR + break; +#endif + } else { + acc = val; + any = 1; + } + } + + if (any < 0) { + acc = neg ? INT64_MIN : INT64_MAX; + errno = ERANGE; + } else if (!any) { + errno = EINVAL; + } + + if (endptr != NULL) { + *endptr = (char *)(any ? s - 1 : nptr); + } + return (acc); +} +#endif
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php