From: Thies C. Arntzen Date: Sun, 14 Nov 1999 19:59:52 +0000 (+0000) Subject: (PHP k[r]sort) now use compare_function from libzend to be consistent with the langua... X-Git-Tag: php-4.0b3_RC5~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2b08dfec2875932d3aeca1bef5007d8006be5ea9;p=php (PHP k[r]sort) now use compare_function from libzend to be consistent with the language-core. --- diff --git a/NEWS b/NEWS index 15108bafde..a633deb8c3 100644 --- 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) diff --git a/ext/standard/array.c b/ext/standard/array.c index 1615d3848a..cf8114a2b6 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -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; } }