PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? 2004, PHP 5.0.2
-- SoapClient->__call() is renamed to SoapClinet->__soap_call(). (Dmitry)
-- Add interface_exists() and make class_exists() only return true for real
+- Added the sorting flag SORT_LOCALE_STRING to the sort() functions which makes
+ them sort based on the current locale. (Derick)
+- Added interface_exists() and make class_exists() only return true for real
classes. (Andrey)
-- Implemented periodic PCRE compiled regexp cache cleanup, to avoid memory
- exhaustion. (Andrei)
- Added PHP_EOL constant that contains the OS way of representing newlines.
(Paul Hudson, Derick)
+- Implemented periodic PCRE compiled regexp cache cleanup, to avoid memory
+ exhaustion. (Andrei)
+- Renamed SoapClient->__call() to SoapClinet->__soap_call(). (Dmitry)
- Fixed bug with raw_post_data not getting set (Brian)
- Fixed a file-descriptor leak with phpinfo() and other 'special' URLs (Zeev)
- Fixed bug #29985 (unserialize()/ __PHP_Incomplete_class does not report
return SUCCESS;
}
+#if HAVE_STRCOLL
+ZEND_API int string_locale_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
+{
+ zval op1_copy, op2_copy;
+ int use_copy1, use_copy2;
+
+ zend_make_printable_zval(op1, &op1_copy, &use_copy1);
+ zend_make_printable_zval(op2, &op2_copy, &use_copy2);
+
+ if (use_copy1) {
+ op1 = &op1_copy;
+ }
+ if (use_copy2) {
+ op2 = &op2_copy;
+ }
+
+ result->value.lval = strcoll(op1->value.str.val, op2->value.str.val);
+ result->type = IS_LONG;
+
+ if (use_copy1) {
+ zval_dtor(op1);
+ }
+ if (use_copy2) {
+ zval_dtor(op2);
+ }
+ return SUCCESS;
+}
+#endif
+
ZEND_API int numeric_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
{
zval op1_copy, op2_copy;
ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC);
ZEND_API int numeric_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC);
ZEND_API int string_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC);
+#if HAVE_STRCOLL
+ZEND_API int string_locale_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC);
+#endif
ZEND_API void zend_str_tolower(char *str, unsigned int length);
ZEND_API char *zend_str_tolower_copy(char *dest, const char *source, unsigned int length);
#define SORT_REGULAR 0
#define SORT_NUMERIC 1
#define SORT_STRING 2
+#define SORT_LOCALE_STRING 5
#define SORT_DESC 3
#define SORT_ASC 4
REGISTER_LONG_CONSTANT("SORT_REGULAR", SORT_REGULAR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SORT_NUMERIC", SORT_NUMERIC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SORT_STRING", SORT_STRING, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("SORT_LOCALE_STRING", SORT_LOCALE_STRING, CONST_CS | CONST_PERSISTENT);
+
REGISTER_LONG_CONSTANT("CASE_LOWER", CASE_LOWER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("CASE_UPPER", CASE_UPPER, CONST_CS | CONST_PERSISTENT);
ARRAYG(compare_func) = string_compare_function;
break;
+#if HAVE_STRCOLL
+ case SORT_LOCALE_STRING:
+ ARRAYG(compare_func) = string_locale_compare_function;
+ break;
+#endif
+
case SORT_REGULAR:
default:
ARRAYG(compare_func) = compare_function;