summaryrefslogtreecommitdiff
path: root/ext/standard/array.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r--ext/standard/array.c47
1 files changed, 33 insertions, 14 deletions
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;
}
}