Branch: Tag:

1997-02-19

1997-02-19 05:04:19 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

division and multiplication on array implemented

Rev: src/array.c:1.6
Rev: src/array.h:1.3
Rev: src/operators.c:1.9

1548:    *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; + }