diff --git a/src/array.c b/src/array.c index b1cf7c100f511b9309dc7bb48eea1014fe5cdf76..4cbf089a8d2baa893de37bf07d4c83d1b6565462 100644 --- a/src/array.c +++ b/src/array.c @@ -441,6 +441,27 @@ struct array *slice_array(struct array *v,INT32 start,INT32 end) return a; } +/* + * Slice a pice of an array (nondestructively) + * return an array consisting of v[start..end-1] + */ +struct array *friendly_slice_array(struct array *v,INT32 start,INT32 end) +{ + struct array *a; + +#ifdef DEBUG + if(start > end || end>v->size || start<0) + fatal("Illegal arguments to slice_array()\n"); +#endif + + a=allocate_array_no_init(end-start,0); + a->type_field = v->type_field; + + assign_svalues_no_free(ITEM(a), ITEM(v)+start, end-start, v->type_field); + + return a; +} + /* * Copy an array */ diff --git a/src/array.h b/src/array.h index a9f69a6a64d6f8511ebb813be79351d73bffb9a9..107f97495449c785b44fc92fe455cd5bb98a1902 100644 --- a/src/array.h +++ b/src/array.h @@ -76,6 +76,7 @@ struct array *array_shrink(struct array *v,INT32 size); struct array *array_remove(struct array *v,INT32 index); INT32 array_search(struct array *v, struct svalue *s,INT32 start); struct array *slice_array(struct array *v,INT32 start,INT32 end); +struct array *friendly_slice_array(struct array *v,INT32 start,INT32 end); struct array *copy_array(struct array *v); void check_array_for_destruct(struct array *v); INT32 array_find_destructed_object(struct array *v);