From f34e1baa9fdbe74a89634992a266984e7b01ee9a Mon Sep 17 00:00:00 2001 From: Andrei Zmievski Date: Wed, 2 Aug 2006 20:31:40 +0000 Subject: [PATCH] Make string comparison functions conver to unicode or printable strings depending on unicode.semantics and do the right thing. --- Zend/zend_operators.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 98133a4cb3d..f2d4d2c49cc 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1648,8 +1648,13 @@ ZEND_API int string_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_D 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 (UG(unicode)) { + zend_make_unicode_zval(op1, &op1_copy, &use_copy1); + zend_make_unicode_zval(op2, &op2_copy, &use_copy2); + } else { + zend_make_printable_zval(op1, &op1_copy, &use_copy1); + zend_make_printable_zval(op2, &op2_copy, &use_copy2); + } if (use_copy1) { op1 = &op1_copy; @@ -1658,7 +1663,11 @@ ZEND_API int string_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_D op2 = &op2_copy; } - Z_LVAL_P(result) = zend_binary_zval_strcmp(op1, op2); + if (UG(unicode)) { + Z_LVAL_P(result) = zend_u_binary_zval_strcmp(op1, op2); + } else { + Z_LVAL_P(result) = zend_binary_zval_strcmp(op1, op2); + } Z_TYPE_P(result) = IS_LONG; if (use_copy1) { @@ -1675,8 +1684,13 @@ ZEND_API int string_locale_compare_function(zval *result, zval *op1, zval *op2 T zval op1_copy, op2_copy; int use_copy1, use_copy2; - zend_make_unicode_zval(op1, &op1_copy, &use_copy1); - zend_make_unicode_zval(op2, &op2_copy, &use_copy2); + if (UG(unicode)) { + zend_make_unicode_zval(op1, &op1_copy, &use_copy1); + zend_make_unicode_zval(op2, &op2_copy, &use_copy2); + } else { + zend_make_printable_zval(op1, &op1_copy, &use_copy1); + zend_make_printable_zval(op2, &op2_copy, &use_copy2); + } if (use_copy1) { op1 = &op1_copy; @@ -1685,7 +1699,11 @@ ZEND_API int string_locale_compare_function(zval *result, zval *op1, zval *op2 T op2 = &op2_copy; } - Z_LVAL_P(result) = ucol_strcoll(UG(default_collator)->coll, Z_USTRVAL_P(op1), Z_USTRLEN_P(op1), Z_USTRVAL_P(op2), Z_USTRLEN_P(op2)); + if (UG(unicode)) { + Z_LVAL_P(result) = ucol_strcoll(UG(default_collator)->coll, Z_USTRVAL_P(op1), Z_USTRLEN_P(op1), Z_USTRVAL_P(op2), Z_USTRLEN_P(op2)); + } else { + Z_LVAL_P(result) = strcoll(Z_STRVAL_P(op1), Z_STRVAL_P(op2)); + } Z_TYPE_P(result) = IS_LONG; if (use_copy1) {