From 269014e7843fabf395fca10c3364e50825f0fe20 Mon Sep 17 00:00:00 2001 From: spl3g Date: Wed, 19 Mar 2025 18:08:58 +0300 Subject: Add arena string builder --- lib/arena.h | 38 ++++++++++++++++++++++++++------------ lib/arena_strings.h | 19 +++++++++++++++++++ 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/lib/arena.h b/lib/arena.h index 7535f8a..1f53355 100644 --- a/lib/arena.h +++ b/lib/arena.h @@ -34,18 +34,32 @@ void *arena_realloc(arena *a, void *oldptr, size_t oldsz, size_t newsz); #define ARENA_REGION_DEFAULT_CAPACITY (8*1024) #define ARENA_DA_INIT_CAP (2) -#define arena_da_append(a, da, item) \ - do { \ - if ((da)->len >= (da)->cap) { \ - size_t new_cap = (da)->cap == 0 ? ARENA_DA_INIT_CAP : (da)->cap*2; \ - (da)->data = arena_realloc( \ - (a), (da)->data, \ - (da)->cap*sizeof(*(da)->data), \ - new_cap*sizeof(*(da)->data)); \ - (da)->cap = new_cap; \ - } \ - \ - (da)->data[(da)->len++] = (item); \ +#define arena_da_reserve(a, da, expected_size) \ + do { \ + if ((expected_size) >= (da)->cap) { \ + size_t new_cap = (da)->cap == 0 ? ARENA_DA_INIT_CAP : (da)->cap*2; \ + while (new_cap < expected_size) { \ + new_cap *= 2; \ + } \ + (da)->data = arena_realloc( \ + (a), (da)->data, \ + (da)->cap*sizeof(*(da)->data), \ + new_cap*sizeof(*(da)->data)); \ + (da)->cap = new_cap; \ + } \ + } while (0) + +#define arena_da_append(a, da, item) \ + do { \ + arena_da_reserve((a), (da), (da)->len + 1); \ + (da)->data[(da)->len++] = (item); \ + } while (0) + +#define arena_da_append_many(a, da, items, items_len) \ + do { \ + arena_da_reserve((a), (da), (da)->len+len); \ + memcpy((da)->data+(da)->len, (items), sizeof(*(da)->data)*items_len); \ + (da)->len += len; \ } while (0) #endif //ARENA_H_ diff --git a/lib/arena_strings.h b/lib/arena_strings.h index 85ffda3..b25435d 100644 --- a/lib/arena_strings.h +++ b/lib/arena_strings.h @@ -10,8 +10,27 @@ typedef struct { size_t cap; } const_string_da; +typedef struct { + char* data; + size_t len; + size_t cap; +} string_builder; + const_string arena_cs_append(arena *a, const_string dst, const_string src); const_string arena_cs_init(arena *a, int len); const_string arena_cs_concat(arena *a, const_string_da strings, const_string sep); +#define arena_sb_append_buf(a, sb, buf, len) arena_da_append_many((a), (sb), (buf), (len)) + +#define arena_sb_append_cstr(a, sb, cstr) \ + do { \ + const char * str = (cstr); \ + size_t len = strlen((cstr)); \ + arena_da_append_many((a), (sb), (str), len); \ + } while (0) + +#define arena_sb_append_null(a, sb) arena_da_append_many((a), (sb), "", 1) + +#define arena_sb_to_cs(sb) cs_from_parts((sb).data, (sb).len) + #endif // ARENA_STRINGS_H_ -- cgit v1.2.3