pike.git / src / array.c

version» Context lines:

pike.git/src/array.c:1541:    struct array *m;    for(m=empty_array.next;m!=&empty_array;m=m->next)    {    num++;    size+=sizeof(struct array)+    sizeof(struct svalue) * (m->malloced_size - 1);    }    *num_=num;    *size_=size;   } +  + struct array *explode_array(struct array *a, struct array *b) + { +  INT32 e,d,q,start; +  struct array *tmp; +  +  q=start=0; +  push_array(a); /* Save us from destructive slice_arrays */ +  a->refs++; +  if(b->size) +  { +  for(e=0;e<a->size - b->size;e++) +  { +  for(d=0;d<b->size;d++) +  { +  if(!is_eq(ITEM(a)+(e+d),ITEM(b)+d)) +  break; +  } +  if(d==b->size) +  { +  check_stack(1); +  push_array(slice_array(a, start, e)); +  q++; +  e+=b->size-1; +  start=e+1; +  } +  } +  check_stack(1); +  push_array(slice_array(a, start, a->size)); +  q++; +  }else{ +  check_stack(a->size); +  for(e=0;e<a->size;e++) push_array(slice_array(a, e, e+1)); +  q=a->size; +  } +  tmp=aggregate_array(q); +  if(tmp->size) tmp->type_field=BIT_ARRAY; +  pop_stack(); +  return tmp; + } +  + struct array *implode_array(struct array *a, struct array *b) + { +  INT32 e,size; +  struct array *ret; +  size=0; +  for(e=0;e<a->size;e++) +  { +  if(ITEM(a)[e].type!=T_ARRAY) +  error("Implode array contains non-arrays.\n"); +  size+=ITEM(a)[e].u.array->size; +  } +  +  ret=allocate_array((a->size -1) * b->size + size); +  size=0; +  ret->type_field=0; +  for(e=0;e<a->size;e++) +  { +  if(e) +  { +  ret->type_field|=b->type_field; +  assign_svalues_no_free(ITEM(ret)+size, +  ITEM(b), +  b->size, +  b->type_field); +  size+=b->size; +  } +  ret->type_field|=ITEM(a)[e].u.array->type_field; +  assign_svalues_no_free(ITEM(ret)+size, +  ITEM(ITEM(a)[e].u.array), +  ITEM(a)[e].u.array->size, +  ITEM(a)[e].u.array->type_field); +  size+=ITEM(a)[e].u.array->size; +  } + #ifdef DEBUG +  if(size != ret->size) +  fatal("Implode_array failed miserably\n"); + #endif +  return ret; + }