]> granicus.if.org Git - php/commitdiff
(PHP k[r]sort) now use compare_function from libzend to be consistent with the langua...
authorThies C. Arntzen <thies@php.net>
Sun, 14 Nov 1999 19:59:52 +0000 (19:59 +0000)
committerThies C. Arntzen <thies@php.net>
Sun, 14 Nov 1999 19:59:52 +0000 (19:59 +0000)
NEWS
ext/standard/array.c

diff --git a/NEWS b/NEWS
index 15108bafde15c75176236ad270aa7cf14a710ef8..a633deb8c3ed028c8aafe3d587a29cbeaccdf02c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,8 +6,8 @@ PHP 4.0                                                                    NEWS
 - Fixed selecting nested-tables in OCI8. (Thies)
 - RFC-854 fix for internal FTP-Code. Commands have to end in "\r\n" (Thies)
 - Fix OpenLink ODBC support (Stig)
-- min(),max(),a[r]sort(),[r]sort() now work consistent with the language-core.
-  (Thies)
+- min(),max(),a[r]sort(),[r]sort(),k[r]sort() now work consistent with the 
+  language-core. (Thies)
 - tempnam() now uses mkstemp() if available (Stig)
 - serialize() and var_dump() now honor the precision as set in php.ini
   for doubles. (Thies)
index 1615d3848a66cef27d6da9e8b58fb641762ef985..cf8114a2b60909fbb194c20cb704a51af9d7a12e 100644 (file)
@@ -118,25 +118,44 @@ PHP_RINIT_FUNCTION(array)
        
 static int array_key_compare(const void *a, const void *b)
 {
-       Bucket *first;
-       Bucket *second;
-       int min, r;
+       Bucket *f;
+       Bucket *s;
+       pval result;
+       pval first;
+       pval second;
+       f = *((Bucket **) a);
+       s = *((Bucket **) b);
 
-       first = *((Bucket **) a);
-       second = *((Bucket **) b);
+       if (f->nKeyLength == 0) {
+               first.type = IS_LONG;
+               first.value.lval = f->h;
+       } else {
+               first.type = IS_STRING;
+               first.value.str.val = f->arKey;
+               first.value.str.len = f->nKeyLength;
+       }
 
-       if (first->nKeyLength == 0 && second->nKeyLength == 0) {
-               return (first->h - second->h);
-       } else if (first->nKeyLength == 0) {
+       if (s->nKeyLength == 0) {
+               second.type = IS_LONG;
+               second.value.lval = s->h;
+       } else {
+               second.type = IS_STRING;
+               second.value.str.val = s->arKey;
+               second.value.str.len = s->nKeyLength;
+       }
+    if (compare_function(&result, &first, &second) == FAILURE) {
+        return 0;
+    } 
+
+       convert_to_long(&result);
+       if (result.value.lval < 0) {
                return -1;
-       } else if (second->nKeyLength == 0) {
+       } else if (result.value.lval > 0) {
                return 1;
-       }
-       min = MIN(first->nKeyLength, second->nKeyLength);
-       if ((r = memcmp(first->arKey, second->arKey, min)) == 0) {
-               return (first->nKeyLength - second->nKeyLength);
        } else {
-               return r;
+               return 0;
        }
 }