pike.git/
src/
array.c
Branch:
Tag:
Non-build tags
All tags
No tags
1999-03-05
1999-03-05 02:14:31 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>
e051cf3fb0746a2be7653df1439a17fc27310aa0 (
98
lines) (+
96
/-
2
)
[
Show
|
Annotate
]
Branch:
7.9
optimization...
Rev: src/array.c:1.44
20:
#include "main.h" #include "security.h"
-
RCSID("$Id: array.c,v 1.
43
1999/
01
/
21
09
:14:
56
hubbe Exp $");
+
RCSID("$Id: array.c,v 1.
44
1999/
03
/
05
02
:14:
31
hubbe Exp $");
struct array empty_array= {
311:
return a; }else{ struct array *ret;
-
ret=low_allocate_array(size, (size>>
3
)
+1
);
+
ret=low_allocate_array(size, (size>>
1
)
+ 4
);
MEMCPY(ITEM(ret),ITEM(a),sizeof(struct svalue)*a->size); ret->type_field = a->type_field | BIT_INT; a->size=0;
1108:
} }
+
+
/* * merge two arrays and retain their order, this is done by arranging them * into ordered sets, merging them as sets and then rearranging the zipper
1141:
}
+
#define CMP(X,Y) set_svalue_cmpfun(X,Y)
+
#define TYPE struct svalue
+
#define ID set_sort_svalues
+
#include "fsort_template.h"
+
#undef CMP
+
#undef TYPE
+
#undef ID
+
+
+
/*
+
* merge two arrays and retain their order, this is done by arranging them
+
* into ordered sets, merging them as sets and then rearranging the zipper
+
* before zipping the sets together.
+
*/
+
struct array *merge_array_without_order2(struct array *a, struct array *b,INT32 op)
+
{
+
INT32 ap,bp,i;
+
struct svalue *arra,*arrb;
+
struct array *ret;
+
+
#ifdef PIKE_DEBUG
+
if(d_flag > 1)
+
{
+
array_check_type_field(a);
+
array_check_type_field(b);
+
}
+
#endif
+
+
if(a->refs==1 || !a->size)
+
{
+
arra=ITEM(a);
+
}else{
+
arra=(struct svalue *)xalloc(a->size*sizeof(struct svalue));
+
MEMCPY(arra,ITEM(a),a->size*sizeof(struct svalue));
+
}
+
+
if(b->refs==1 || !b->size)
+
{
+
arrb=ITEM(b);
+
}else{
+
arrb=(struct svalue *)xalloc(b->size*sizeof(struct svalue));
+
MEMCPY(arrb,ITEM(b),b->size*sizeof(struct svalue));
+
}
+
+
set_sort_svalues(arra,arra+a->size-1);
+
set_sort_svalues(arrb,arrb+b->size-1);
+
+
ret=low_allocate_array(0,32);
+
ap=bp=0;
+
+
while(ap < a->size && bp < b->size)
+
{
+
i=set_svalue_cmpfun(arra+ap,arrb+bp);
+
if(i < 0)
+
i=op >> 8;
+
else if(i > 0)
+
i=op;
+
else
+
i=op >> 4;
+
+
if(i & PIKE_ARRAY_OP_A) ret=append_array(ret,arra+ap);
+
if(i & PIKE_ARRAY_OP_B) ret=append_array(ret,arrb+bp);
+
if(i & PIKE_ARRAY_OP_SKIP_A) ap++;
+
if(i & PIKE_ARRAY_OP_SKIP_B) bp++;
+
}
+
+
if((op >> 8) & PIKE_ARRAY_OP_A)
+
while(ap<a->size)
+
ret=append_array(ret,arra + ap++);
+
+
if(op & PIKE_ARRAY_OP_B)
+
while(bp<b->size)
+
ret=append_array(ret,arrb + bp++);
+
+
if(arra != ITEM(a)) free((char *)arra);
+
if(arrb != ITEM(b)) free((char *)arrb);
+
+
free_array(a);
+
free_array(b);
+
+
return ret;
+
}
+
+
/* merge two arrays without paying attention to the order * the elements has presently */
1148:
struct array *b, INT32 op) {
+
#if 0
INT32 *zipper; struct array *tmpa,*tmpb,*ret;
1170:
free_array(tmpb); free((char *)zipper); return ret;
+
+
#else
+
add_ref(a);
+
add_ref(b);
+
return merge_array_without_order2(a,b,op);
+
#endif
} /* subtract an array from another */