diff --git a/src/array.c b/src/array.c index e0838c3dc0f24f14d8a16ccb66cc817662bb987f..a8d58f51b445b9516af39f7213c074b81041923a 100644 --- a/src/array.c +++ b/src/array.c @@ -529,6 +529,7 @@ INT32 *get_order(struct array *v, cmpfun fun) current_order=(INT32 *)xalloc(v->size * sizeof(INT32)); for(e=0; e<v->size; e++) current_order[e]=e; + if(current_array_p) free((char *)current_array_p); current_array_p = ITEM(v); current_cmpfun = fun; fsort((char *)current_order, @@ -536,6 +537,7 @@ INT32 *get_order(struct array *v, cmpfun fun) sizeof(INT32), (fsortfun)internal_cmpfun); + current_array_p=0; return current_order; } @@ -592,31 +594,40 @@ static int switch_svalue_cmpfun(struct svalue *a, struct svalue *b) static int alpha_svalue_cmpfun(struct svalue *a, struct svalue *b) { - if(a->type != b->type) return a->type - b->type; - switch(a->type) + if(a->type == b->type) { - case T_INT: - if(a->u.integer < b->u.integer) return -1; - if(a->u.integer > b->u.integer) return 1; - return 0; - - case T_FLOAT: - if(a->u.float_number < b->u.float_number) return -1; - if(a->u.float_number > b->u.float_number) return 1; - return 0; - - case T_STRING: - return my_strcmp(a->u.string, b->u.string); - - case T_ARRAY: - if(a==b) return 0; - if(!a->u.array->size) return -1; - if(!b->u.array->size) return 1; - return alpha_svalue_cmpfun(ITEM(a->u.array), ITEM(b->u.array)); - - default: - return set_svalue_cmpfun(a,b); + switch(a->type) + { + case T_INT: + if(a->u.integer < b->u.integer) return -1; + if(a->u.integer > b->u.integer) return 1; + return 0; + + case T_FLOAT: + if(a->u.float_number < b->u.float_number) return -1; + if(a->u.float_number > b->u.float_number) return 1; + return 0; + + case T_STRING: + return my_strcmp(a->u.string, b->u.string); + + case T_ARRAY: + if(a==b) return 0; + if(!a->u.array->size) return -1; + if(!b->u.array->size) return 1; + return alpha_svalue_cmpfun(ITEM(a->u.array), ITEM(b->u.array)); + + default: + return set_svalue_cmpfun(a,b); + + case T_OBJECT: + break; + } + }else{ + if(a->type!=T_OBJECT && b->type!=T_OBJECT) + return a->type - b->type; } + return is_gt(a,b); } void sort_array_destructively(struct array *v)