diff --git a/scary.c b/scary.c index 1e19a2c..06801c8 100644 --- a/scary.c +++ b/scary.c @@ -113,3 +113,12 @@ void scary_pop(void *p) Scary *ary = get(p); ary->length--; // do not shrink for speed } + +void *scary_dup(void *p) +{ + Scary *ary = get(p); + Scary *dup = xmalloc(sizeof(Scary) + ary->capacity); + *dup = *ary; + memcpy(dup->space, ary->space, ary->capacity); + return opaque(dup); +} diff --git a/scary.h b/scary.h index 3244766..fdf74cb 100644 --- a/scary.h +++ b/scary.h @@ -41,5 +41,6 @@ void scary_push_uint32(void *, uint32_t); void scary_push_uint64(void *, uint64_t); void scary_push_ptr(void *, const void *); void scary_pop(void *ary); +void *scary_dup(void *ary); #endif diff --git a/testlib.c b/testlib.c index 9d3858f..1ccccba 100644 --- a/testlib.c +++ b/testlib.c @@ -52,3 +52,16 @@ Test(libscary, pop) { cr_expect(eq(sz, 1, scary_length(a))); scary_free(a); } + +Test(libscary, dup) { + int *a = scary_new(sizeof(int)); + scary_push(&a, 42); + scary_push(&a, -42); + int *b = scary_dup(a); + cr_expect(ne(ptr, a, b)); + cr_expect(eq(sz, scary_length(a), scary_length(b))); + cr_expect(eq(sz, 2, scary_length(b))); + cr_expect(eq(int[2], a, b)); + scary_free(b); + scary_free(a); +}