From: Andrei Zmievski Date: Tue, 23 Aug 2005 20:11:59 +0000 (+0000) Subject: - Rewrite zend_u_binary_strncmp() to work on codepoint level. Calling X-Git-Tag: PRE_NEW_OCI8_EXTENSION~113 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e3ec5efc5ef9e3b9c431ee597a62483e03981e8e;p=php - Rewrite zend_u_binary_strncmp() to work on codepoint level. Calling u_strCompare() doesn't help because it assumes that the input lengths specify the number of UChar's. - Change zend_u_binary_strcmp() to use u_strCompare() (and it's fine to use it here, since we work with whole strings here). --- diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 06cd90917d..5b0ce69426 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -2199,22 +2199,15 @@ ZEND_API int zend_binary_strcmp(char *s1, uint len1, char *s2, uint len2) ZEND_API int zend_u_binary_strcmp(UChar *s1, int32_t len1, UChar *s2, int32_t len2) { - int retval; - - retval = ZEND_NORMALIZE_BOOL(u_memcmpCodePointOrder(s1, s2, MIN(len1, len2))); - if (!retval) { - return (len1 - len2); - } else { - return retval; - } + return ZEND_NORMALIZE_BOOL(u_strCompare(s1, len1, s2, len2, 1)); } -ZEND_API int zend_u_binary_strncmp(UChar *s1, int32_t len1, UChar *s2, int32_t len2, uint length) +ZEND_API int zend_binary_strncmp(char *s1, uint len1, char *s2, uint len2, uint length) { int retval; - retval = ZEND_NORMALIZE_BOOL(u_memcmpCodePointOrder(s1, s2, MIN(length, MIN(len1, len2)))); + retval = memcmp(s1, s2, MIN(length, MIN(len1, len2))); if (!retval) { return (MIN(length, len1) - MIN(length, len2)); } else { @@ -2223,16 +2216,23 @@ ZEND_API int zend_u_binary_strncmp(UChar *s1, int32_t len1, UChar *s2, int32_t l } -ZEND_API int zend_binary_strncmp(char *s1, uint len1, char *s2, uint len2, uint length) +ZEND_API int zend_u_binary_strncmp(UChar *s1, int32_t len1, UChar *s2, int32_t len2, uint length) { - int retval; - - retval = memcmp(s1, s2, MIN(length, MIN(len1, len2))); - if (!retval) { - return (MIN(length, len1) - MIN(length, len2)); - } else { - return retval; + int32_t off1 = 0, off2 = 0; + UChar32 c1, c2; + + for( ; length > 0; --length) { + if (off1 >= len1 || off2 >= len2) { + return ZEND_NORMALIZE_BOOL(len1 - len2); + } + U16_NEXT(s1, off1, len1, c1); + U16_NEXT(s2, off2, len2, c2); + if (c1 != c2) { + return ZEND_NORMALIZE_BOOL((int32_t)c1-(int32_t)c2); + } } + + return 0; }