From 40b496d63f2813db9ddff6dd4300a5f613ff7b6c Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 5 Dec 2006 02:55:27 +0000 Subject: [PATCH] Merge from 5.2: Improve tolower()-related functions on Windows and VC2005 by caching locale and using tolower_l function. --- Zend/zend_operators.c | 28 ++++++++++++++++++++++------ Zend/zend_operators.h | 13 +++++++++++++ ext/standard/basic_functions.c | 1 + ext/standard/string.c | 1 + main/main.c | 1 + 5 files changed, 38 insertions(+), 6 deletions(-) diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index ca9cac948c..8f49df7c01 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -35,6 +35,15 @@ #define LONG_SIGN_MASK (1L << (8*sizeof(long)-1)) +#if ZEND_USE_TOLOWER_L +#include +static _locale_t current_locale = NULL; +/* this is true global! may lead to strange effects on ZTS, but so may setlocale() */ +#define zend_tolower(c) _tolower_l(c, current_locale) +#else +#define zend_tolower(c) tolower(c) +#endif + ZEND_API int zend_atoi(const char *str, int str_len) { int retval; @@ -2331,6 +2340,13 @@ ZEND_API int zval_is_true(zval *op) return (Z_LVAL_P(op) ? 1 : 0); } +#ifdef ZEND_USE_TOLOWER_L +ZEND_API void zend_update_current_locale() +{ + current_locale = _get_current_locale(); +} +#endif + ZEND_API char *zend_str_tolower_copy(char *dest, const char *source, unsigned int length) { register unsigned char *str = (unsigned char*)source; @@ -2338,7 +2354,7 @@ ZEND_API char *zend_str_tolower_copy(char *dest, const char *source, unsigned in register unsigned char *end = str + length; while (str < end) { - *result++ = tolower((int)*str++); + *result++ = zend_tolower((int)*str++); } *result = '\0'; @@ -2390,7 +2406,7 @@ ZEND_API void zend_str_tolower(char *str, unsigned int length) register unsigned char *end = p + length; while (p < end) { - *p = tolower((int)*p); + *p = zend_tolower((int)*p); p++; } } @@ -2503,8 +2519,8 @@ ZEND_API int zend_binary_strcasecmp(char *s1, uint len1, char *s2, uint len2) len = MIN(len1, len2); while (len--) { - c1 = tolower((int)*(unsigned char *)s1++); - c2 = tolower((int)*(unsigned char *)s2++); + c1 = zend_tolower((int)*(unsigned char *)s1++); + c2 = zend_tolower((int)*(unsigned char *)s2++); if (c1 != c2) { return c1 - c2; } @@ -2530,8 +2546,8 @@ ZEND_API int zend_binary_strncasecmp(char *s1, uint len1, char *s2, uint len2, u len = MIN(length, MIN(len1, len2)); while (len--) { - c1 = tolower((int)*(unsigned char *)s1++); - c2 = tolower((int)*(unsigned char *)s2++); + c1 = zend_tolower((int)*(unsigned char *)s1++); + c2 = zend_tolower((int)*(unsigned char *)s2++); if (c1 != c2) { return c1 - c2; } diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index e5dc13c4ab..ec826b6059 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -451,6 +451,19 @@ END_EXTERN_C() #define Z_TYPE_P(zval_p) Z_TYPE(*zval_p) #define Z_TYPE_PP(zval_pp) Z_TYPE(**zval_pp) +#if HAVE_SETLOCALE && defined(ZEND_WIN32) && !defined(ZTS) && defined(_MSC_VER) && (_MSC_VER >= 1400) +/* This is performance improvement of tolower() on Windows and VC2005 + * Gives 10-18% on bench.php + */ +#define ZEND_USE_TOLOWER_L 1 +#endif + +#ifdef ZEND_USE_TOLOWER_L +ZEND_API void zend_update_current_locale(); +#else +#define zend_update_current_locale() +#endif + #endif /* diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index e295b165ca..2891d0e457 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -4164,6 +4164,7 @@ PHP_RSHUTDOWN_FUNCTION(basic) if (BG(locale_string) != NULL) { setlocale(LC_ALL, "C"); setlocale(LC_CTYPE, ""); + zend_update_current_locale(); } STR_FREE(BG(locale_string)); BG(locale_string) = NULL; diff --git a/ext/standard/string.c b/ext/standard/string.c index ab173a39e7..ab610e0a79 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -6083,6 +6083,7 @@ PHP_FUNCTION(setlocale) } retval = setlocale (cat, loc); + zend_update_current_locale(); if (retval) { /* Remember if locale was changed */ if (loc) { diff --git a/main/main.c b/main/main.c index 0653415069..fc9984c519 100644 --- a/main/main.c +++ b/main/main.c @@ -1620,6 +1620,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod #if HAVE_SETLOCALE setlocale(LC_CTYPE, ""); + zend_update_current_locale(); #endif #if HAVE_TZSET -- 2.40.0