jrk

my own c stdlib to keep myself sane
git clone git://git.jakekoroman.com/jrk
Log | Files | Refs

commit eb80b3fc5644546f8a06ed1665392b6f90a8a3d5
parent f8e38ad61126db546feffb16dce3fb4c7781ffba
Author: Jake Koroman <jake@jakekoroman.com>
Date:   Tue, 16 Sep 2025 19:15:05 -0400

jrk_Arena fixups.

Diffstat:
Mjrk.h | 47+++++++++++++++++++++++++++++------------------
1 file changed, 29 insertions(+), 18 deletions(-)

diff --git a/jrk.h b/jrk.h @@ -125,20 +125,22 @@ char *jrk_tmpstrings_pushf(char *, ...); } \ } while (0) -#define jrk_arena_da_reserve(arena, da, expected_capacity) \ - do { \ - if ((da)->capacity == 0) { \ - (da)->capacity = JRK_DA_DEFAULT_INIT_CAPACITY; \ - (da)->items = jrk_arena_push(arena, (da)->capacity); \ - break; \ - } \ - if ((expected_capacity) > (da)->capacity) { \ - u64 old_cap = (da)->capacity; \ - while ((expected_capacity) > (da)->capacity) { \ - (da)->capacity *= 2; \ - } \ - (da)->items = jrk_arena_resize((arena), (da)->items, old_cap, (da)->capacity); \ - } \ +#define jrk_arena_da_reserve(arena, da, expected_capacity) \ + do { \ + if ((da)->capacity == 0) { \ + (da)->capacity = JRK_DA_DEFAULT_INIT_CAPACITY; \ + (da)->items = jrk_arena_push(arena, (da)->capacity * sizeof(*(da)->items)); \ + break; \ + } \ + if ((expected_capacity) > (da)->capacity) { \ + u64 old_cap = (da)->capacity; \ + while ((expected_capacity) > (da)->capacity) { \ + (da)->capacity *= 2; \ + } \ + u64 old_size = old_cap * sizeof(*(da)->items); \ + u64 new_size = (da)->capacity * sizeof(*(da)->items); \ + (da)->items = jrk_arena_resize((arena), (da)->items, old_size, new_size); \ + } \ } while (0) #define jrk_arena_da_append(arena, da, item) \ @@ -379,11 +381,15 @@ jrk_arena_push(jrk_Arena *arena, u64 n) jrk_assertv(arena->offset + n <= arena->capacity, "jrk_arena_push(%p, %ld): arena push requires %ld bytes but has a capacity of %ld bytes", arena, n, arena->offset + n, arena->capacity); - void *result = &arena->data[arena->offset]; arena->prev_offset = arena->offset; arena->offset += n; memset(result, 0, n); + +#ifdef JRK_ARENA_DIAGNOSTICS + printf("pushed(%p, %ld)\n offset: %ld\n prev_offset: %ld\n", arena, n, arena->offset, arena->prev_offset); +#endif + return result; } @@ -400,6 +406,11 @@ jrk_arena_resize(jrk_Arena *arena, void *old, u64 old_size, u64 new_size) void *result = NULL; +#ifdef JRK_ARENA_DIAGNOSTICS + printf("resize(%p, %p, %ld, %ld): resizing\n", + arena, old, old_size, new_size); +#endif + if (old == &arena->data[arena->prev_offset]) { result = old; arena->offset = new_size; @@ -407,8 +418,8 @@ jrk_arena_resize(jrk_Arena *arena, void *old, u64 old_size, u64 new_size) result = &arena->data[arena->offset]; arena->prev_offset = arena->offset; arena->offset += new_size; - memset(result, 0, new_size); memmove(result, old, old_size); + memset(result + old_size, 0, new_size - old_size); } return result; @@ -498,8 +509,8 @@ jrk_arena_sb_append_buf_at(jrk_Arena *arena, jrk_StringBuilder *sb, char *buf, u void jrk_sb_append_buf_at(jrk_StringBuilder *sb, char *buf, u64 size, u64 idx) { - jrk_assertv(idx < sb->count, "jrk_sb_append_buf_at(%p, %p, %ld, %ld): idx is greater than sb->count", - sb, buf, size, idx); + jrk_assertv(idx < sb->count, "jrk_sb_append_buf_at(%p, %p, %ld, %ld): idx is greater than sb->count (%ld > %ld)", + sb, buf, size, idx, idx, sb->count); u64 new_size = sb->count + size; char *temp = jrk_emalloc(new_size);