summaryrefslogtreecommitdiff
path: root/arena.h
diff options
context:
space:
mode:
Diffstat (limited to 'arena.h')
-rw-r--r--arena.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/arena.h b/arena.h
index 1be5cd7..5235204 100644
--- a/arena.h
+++ b/arena.h
@@ -24,6 +24,7 @@ void arena_free(Arena *a);
void arena_reset(Arena *a);
void *arena_alloc(Arena *a, size_t n, size_t align);
void *arena_realloc(Arena *a, void *old, size_t oldsz, size_t newsz, size_t align);
+void *arena_concat(Arena *m, void *a, size_t asz, void *b, size_t bsz, size_t align);
#define new(a, t)\
memset(arena_alloc(a, sizeof(t), _Alignof(__typeof__(t))), 0, sizeof(t))
@@ -89,5 +90,15 @@ void *arena_realloc(Arena *a, void *old, size_t oldsz, size_t newsz, size_t alig
}
}
+void *arena_concat(Arena *m, void *a, size_t asz, void *b, size_t bsz, size_t align) {
+ if (!asz)
+ return b;
+ if (!bsz || (char*)a + asz == b)
+ return a;
+ void *p = arena_realloc(m, a, asz, asz + bsz, align);
+ memcpy((char*)p + asz, b, bsz);
+ return p;
+}
+
#endif
#endif