pike.git / src / array.c

version» Context lines:

pike.git/src/array.c:1904:         #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    -  - PMOD_EXPORT struct array *merge_array_without_order2(struct array *a, struct array *b,INT32 op) - { -  ONERROR r1,r2,r3,r4,r5; -  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 -  -  SET_ONERROR(r1,do_free_array,a); -  SET_ONERROR(r2,do_free_array,b); -  -  if(a->refs==1 || !a->size) -  { -  arra=ITEM(a); -  }else{ -  /* Overlow safe: ((1<<29)-4)*8 < ULONG_MAX */ -  arra=xalloc(a->size*sizeof(struct svalue)); -  MEMCPY(arra,ITEM(a),a->size*sizeof(struct svalue)); -  SET_ONERROR(r3,free,arra); -  } -  -  if(b->refs==1 || !b->size) -  { -  arrb=ITEM(b); -  }else{ -  /* Overlow safe: ((1<<29)-4)*8 < ULONG_MAX */ -  arrb=xalloc(b->size*sizeof(struct svalue)); -  MEMCPY(arrb,ITEM(b),b->size*sizeof(struct svalue)); -  SET_ONERROR(r4,free,arrb); -  } -  -  set_sort_svalues(arra,arra+a->size-1); -  set_sort_svalues(arrb,arrb+b->size-1); -  -  ret=low_allocate_array(0,32); -  SET_ONERROR(r5,do_free_array,ret); -  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++); -  -  UNSET_ONERROR(r5); -  -  if(arrb != ITEM(b)) -  { -  UNSET_ONERROR(r4); -  free(arrb); -  } -  -  if(arra != ITEM(a)) -  { -  UNSET_ONERROR(r3); -  free(arra); -  } -  -  UNSET_ONERROR(r2); -  free_array(b); -  -  UNSET_ONERROR(r1); -  free_array(a); -  -  return ret; - } -  -  - /** merge two arrays without paying attention to the order -  * the elements has presently -  */ - PMOD_EXPORT struct array *merge_array_without_order(struct array *a, -  struct array *b, -  INT32 op) - { - #if 0 -  /* FIXME: If this routine is ever reinstated, it has to be -  * fixed to use ONERROR -  */ -  INT32 *zipper; -  struct array *tmpa,*tmpb,*ret; -  -  if(ordera) { free(ordera); ordera=0; } -  if(orderb) { free(orderb); orderb=0; } -  -  ordera=get_set_order(a); -  tmpa=reorder_and_copy_array(a,ordera); -  free(ordera); -  ordera=0; -  -  orderb=get_set_order(b); -  tmpb=reorder_and_copy_array(b,orderb); -  free(orderb); -  orderb=0; -  -  zipper=merge(tmpa,tmpb,op); -  ret=array_zip(tmpa,tmpb,zipper); -  free_array(tmpa); -  free_array(tmpb); -  free(zipper); -  return ret; -  - #else -  add_ref(a); -  add_ref(b); -  return merge_array_without_order2(a,b,op); - #endif - } -  +    /** Remove all instances of an svalue from an array   */   static struct array *subtract_array_svalue(struct array *a, struct svalue *b)   {    size_t size = a->size;    size_t from=0, to=0;    TYPE_FIELD to_type = 1<<TYPEOF(*b);    TYPE_FIELD type_field = 0;    ONERROR ouch;    struct svalue *ip=ITEM(a), *dp=ip;