]> granicus.if.org Git - php/commitdiff
- MFB: Added the sorting flag SORT_LOCALE_STRING to the sort() functions which
authorDerick Rethans <derick@php.net>
Sat, 11 Sep 2004 14:22:35 +0000 (14:22 +0000)
committerDerick Rethans <derick@php.net>
Sat, 11 Sep 2004 14:22:35 +0000 (14:22 +0000)
  makes them sort based on the current locale. (Derick)

Zend/zend_operators.c
Zend/zend_operators.h
ext/standard/array.c

index 446c62bbc337f0916cc3c18a3cdb725cb4e4992e..8038d457f20a8b81194a7664cab5cd291f2e8ec1 100644 (file)
@@ -1222,6 +1222,35 @@ ZEND_API int string_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_D
        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;
index b6b845ae76b958bb33bbbaa769ea0e4f63fd5443..67ee246592c6593dbbb40d1fb31022f0ae5eba07 100644 (file)
@@ -179,6 +179,9 @@ ZEND_API int zval_is_true(zval *op);
 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);
index 29f659e97ff9a47b690bf27407a54736168ca670..fbbe08678f53766a058d10f80bd3ac71afa57d26 100644 (file)
@@ -65,6 +65,7 @@ php_array_globals array_globals;
 #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
@@ -114,6 +115,8 @@ PHP_MINIT_FUNCTION(array)
        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);
 
@@ -143,6 +146,12 @@ static void set_compare_func(int sort_type TSRMLS_DC)
                        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;