]> granicus.if.org Git - php/commitdiff
- Rewrite zend_u_binary_strncmp() to work on codepoint level. Calling
authorAndrei Zmievski <andrei@php.net>
Tue, 23 Aug 2005 20:11:59 +0000 (20:11 +0000)
committerAndrei Zmievski <andrei@php.net>
Tue, 23 Aug 2005 20:11:59 +0000 (20:11 +0000)
  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).

Zend/zend_operators.c

index 06cd90917d71782519d2761b43653e71e018430d..5b0ce694266fad55db6f9ed5af4cde3768f6a93c 100644 (file)
@@ -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;
 }