summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThies C. Arntzen <thies@php.net>1999-11-14 19:59:52 +0000
committerThies C. Arntzen <thies@php.net>1999-11-14 19:59:52 +0000
commit2b08dfec2875932d3aeca1bef5007d8006be5ea9 (patch)
tree8f568558c791a1a2d4d9bda885c15ea3a08473bc
parentf3bcc012c647e7c354d2d00cecf8364af58f922c (diff)
downloadphp-git-2b08dfec2875932d3aeca1bef5007d8006be5ea9.tar.gz
(PHP k[r]sort) now use compare_function from libzend to be consistent with the language-core.
-rw-r--r--NEWS4
-rw-r--r--ext/standard/array.c47
2 files changed, 35 insertions, 16 deletions
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;
}
}