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