mirror of
https://github.com/php/php-src.git
synced 2025-08-19 17:04:47 +02:00
Merge from 5.2:
Improve tolower()-related functions on Windows and VC2005 by caching locale and using tolower_l function.
This commit is contained in:
parent
bc07f14f7a
commit
40b496d63f
5 changed files with 38 additions and 6 deletions
|
@ -35,6 +35,15 @@
|
|||
|
||||
#define LONG_SIGN_MASK (1L << (8*sizeof(long)-1))
|
||||
|
||||
#if ZEND_USE_TOLOWER_L
|
||||
#include <locale.h>
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
/*
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -6083,6 +6083,7 @@ PHP_FUNCTION(setlocale)
|
|||
}
|
||||
|
||||
retval = setlocale (cat, loc);
|
||||
zend_update_current_locale();
|
||||
if (retval) {
|
||||
/* Remember if locale was changed */
|
||||
if (loc) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue