jrk

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

commit 8900544bc321d13f4f9d16dae3e30ba5d1ab3b1d
parent 4c0295319889381fc61cc8e3a067a23262485374
Author: Jake Koroman <jake@jakekoroman.com>
Date:   Mon, 27 Oct 2025 12:53:22 -0400

jrk.h: jrk_arena functions converted.

Diffstat:
Mjrk.h | 149++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
1 file changed, 84 insertions(+), 65 deletions(-)

diff --git a/jrk.h b/jrk.h @@ -1,5 +1,11 @@ /* * TODO: + * - remove assertions from here + * nothing in here should crash the program. + * jrk_die macros should always die, just don't call it here + * remove JRK_NO_EXIT_ON_DIE, i dont think its elegant. it is + * just a bandaid fix for the above issues. + * * - look at at the jrk_sv_chop_delim_loop stuff. there must * must be a better way of handling things. * @@ -75,8 +81,8 @@ char *jrk_arena_push_strf(jrk_Arena*, char*, ...); void jrk_arena_reset(jrk_Arena*); void *jrk_arena_resize(jrk_Arena*, void*, u64, u64); -i32 jrk_arena_sb_appendf(jrk_Arena*, jrk_StringBuilder*, const char*, ...); -void jrk_arena_sb_append_buf_at(jrk_Arena*, jrk_StringBuilder*, char*, u64, u64); +bool jrk_arena_sb_appendf(jrk_Arena*, jrk_StringBuilder*, const char*, ...); +bool jrk_arena_sb_append_buf_at(jrk_Arena*, jrk_StringBuilder*, char*, u64, u64); i32 jrk_rand_num(i32); i32 jrk_rand_num_range(i32, i32); @@ -149,39 +155,31 @@ char *jrk_tmpstrings_pushf(char*, ...); #define jrk_elogv(x, ...) jrk_logv(x": %s", __VA_ARGS__, strerror(errno)) #endif -#define jrk_eelog(x) jrk_elog(x": %s", strerror(errno)) -#define jrk_eelogv(x, ...) jrk_elogv(x": %s", __VA_ARGS__, strerror(errno)) - -#ifdef JRK_NO_EXIT_ON_DIE - #undef jrk_edie - #define jrk_edie jrk_eelog +#ifndef jrk_error + #define jrk_error(x) \ + do { \ + fprintf(stderr, "error: "x"\n"); \ + } while (0) +#endif - #undef jrk_ediev - #define jrk_ediev jrk_eelogv +#ifndef jrk_errorv + #define jrk_errorv(x, ...) \ + do { \ + fprintf(stderr, "error: "x"\n", __VA_ARGS__); \ + } while (0) +#endif - #undef jrk_die - #define jrk_die jrk_elog +#ifndef jrk_eerror + #define jrk_eerror(x) jrk_errorv(x": %s", strerror(errno)) +#endif - #undef jrk_diev - #define jrk_diev jrk_elogv +#ifndef jrk_eerrorv + #define jrk_eerrorv(x, ...) jrk_errorv(x": %s", __VA_ARGS__, strerror(errno)) #endif /* NOTE: no shortname as 'assert' is just too generic */ -#define jrk_assert(c, msg) \ - do { \ - if (!(c)) { \ - fprintf(stderr, "%s:%d: error: "msg"\n", __FILE__, __LINE__); \ - exit(69); \ - } \ - } while(0) - -#define jrk_assertv(c, msg, ...) \ - do { \ - if (!(c)) { \ - fprintf(stderr, "%s:%d: error: "msg"\n", __FILE__, __LINE__, __VA_ARGS__); \ - exit(69); \ - } \ - } while(0) +#define jrk_assert(c, msg) do { if (!(c)) jrk_die("jrk_assert: "msg); } while(0) +#define jrk_assertv(c, msg, ...) do { if (!(c)) jrk_diev("jrk_assert: "msg, __VA_ARGS__); } while(0) #define jrk_shift(x, n) ((n)--, *(x)++) #define jrk_shift_loop(x, n, it) for (char *it = jrk_shift(x, n); n >= 0; it = jrk_shift(x, n)) @@ -204,6 +202,7 @@ char *jrk_tmpstrings_pushf(char*, ...); } \ } while (0) +// NOTE: caller should verify (da)->items is valid #define jrk_arena_da_reserve(arena, da, expected_capacity) \ do { \ if ((da)->capacity == 0) { \ @@ -222,17 +221,23 @@ char *jrk_tmpstrings_pushf(char*, ...); } \ } while (0) +// NOTE: caller should verify (da)->items is valid #define jrk_arena_da_append(arena, da, item) \ do { \ jrk_arena_da_reserve((arena), (da), (da)->count + 1); \ - (da)->items[(da)->count++] = (item); \ + if ((da)->items) { \ + (da)->items[(da)->count++] = (item); \ + } \ } while (0) -#define jrk_arena_da_append_many(arena, da, new_items, new_items_count) \ - do { \ - jrk_arena_da_reserve((arena), (da), (da)->count + (new_items_count)); \ - memcpy((da)->items + (da)->count, (new_items), (new_items_count)*sizeof(*(da)->items)); \ - (da)->count += (new_items_count); \ +// NOTE: caller should verify (da)->items is valid +#define jrk_arena_da_append_many(arena, da, new_items, new_items_count) \ + do { \ + jrk_arena_da_reserve((arena), (da), (da)->count + (new_items_count)); \ + if ((da)->items) { \ + memcpy((da)->items + (da)->count, (new_items), (new_items_count)*sizeof(*(da)->items)); \ + (da)->count += (new_items_count); \ + } \ } while (0) #define jrk_da_append(da, item) \ @@ -303,6 +308,8 @@ char *jrk_tmpstrings_pushf(char*, ...); #define ediev jrk_ediev #define log jrk_log #define logv jrk_logv + #define error jrk_error + #define errorv jrk_errorv #define Arena jrk_Arena #define StringBuilder jrk_StringBuilder @@ -442,19 +449,17 @@ jrk_arena_create(u8 *buffer, u64 buffer_count) void * 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", - (void *) arena, n, arena->offset + n, arena->capacity); + if (arena->offset + n > arena->capacity) { + jrk_errorv("jrk_arena_push(%p, %ld): arena push requires %ld bytes but has a capacity of %ld bytes", + (void *) arena, n, arena->offset + n, arena->capacity); + return NULL; + } 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; } @@ -469,6 +474,7 @@ jrk_arena_push_strf(jrk_Arena *arena, char *fmt, ...) va_end(args); result = jrk_arena_push(arena, (u64) n + 1); + if (!result) return NULL; va_start(args, fmt); vsnprintf(result, n + 1, fmt, args); @@ -480,20 +486,19 @@ jrk_arena_push_strf(jrk_Arena *arena, char *fmt, ...) void * jrk_arena_resize(jrk_Arena *arena, void *old, u64 old_size, u64 new_size) { - jrk_assertv(new_size > old_size, - "jrk_arena_resize(%p, %p, %ld, %ld): new_size is smaller than the old_size", - (void *) arena, old, old_size, new_size); - - jrk_assertv(arena->offset + (new_size - old_size) <= arena->capacity, - "jrk_arena_resize(%p, %p, %ld, %ld): arena resize requires %ld bytes but has a capacity of %ld bytes", - (void *) arena, old, old_size, new_size, arena->offset + (new_size - old_size), arena->capacity); - u8 *result = NULL; -#ifdef JRK_ARENA_DIAGNOSTICS - printf("resize(%p, %p, %ld, %ld): resizing\n", - arena, old, old_size, new_size); -#endif + if (new_size < old_size) { + jrk_errorv("jrk_arena_resize(%p, %p, %ld, %ld): new_size is smaller than the old_size", + (void *) arena, old, old_size, new_size); + return result; + } + + if (arena->offset + (new_size - old_size) > arena->capacity) { + jrk_errorv("jrk_arena_resize(%p, %p, %ld, %ld): arena resize requires %ld bytes but has a capacity of %ld bytes", + (void *) arena, old, old_size, new_size, arena->offset + (new_size - old_size), arena->capacity); + return result; + } if (old == &arena->data[arena->prev_offset]) { result = old; @@ -502,6 +507,11 @@ 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; + if (arena->offset > arena->capacity) { + jrk_errorv("jrk_arena_resize(%p, %p, %ld, %ld): arena resize requires %ld bytes but has a capacity of %ld bytes", + (void *) arena, old, old_size, new_size, arena->offset, arena->capacity); + return NULL; + } memmove(result, old, old_size); memset(result + old_size, 0, new_size - old_size); } @@ -517,24 +527,23 @@ jrk_arena_reset(jrk_Arena *arena) memset(arena->data, 0, arena->capacity); } -i32 +bool jrk_arena_sb_appendf(jrk_Arena *arena, jrk_StringBuilder *sb, const char *fmt, ...) { - i32 result = -1; - va_list args; va_start(args, fmt); - result = vsnprintf(NULL, 0, fmt, args); + i32 n = vsnprintf(NULL, 0, fmt, args); va_end(args); - jrk_arena_da_reserve(arena, sb, sb->count + result + 1); + jrk_arena_da_reserve(arena, sb, sb->count + n + 1); + if (!sb->items) return false; va_start(args, fmt); - vsnprintf(sb->items + sb->count, result + 1, fmt, args); + vsnprintf(sb->items + sb->count, n + 1, fmt, args); va_end(args); - sb->count += result; + sb->count += n; - return result; + return true; } i32 @@ -557,16 +566,24 @@ jrk_sb_appendf(jrk_StringBuilder *sb, const char *fmt, ...) return result; } -void +bool jrk_arena_sb_append_buf_at(jrk_Arena *arena, jrk_StringBuilder *sb, char *buf, u64 size, u64 idx) { - jrk_assertv(idx < sb->count, "jrk_arena_sb_append_buf_at(%p, %p, %p, %ld, %ld): idx is greater than sb->count", - (void *) arena, (void *) sb, buf, size, idx); + if (idx >= sb->count) { + jrk_errorv("jrk_arena_sb_append_buf_at(%p, %p, %p, %ld, %ld): idx is greater than sb->count", + (void *) arena, (void *) sb, buf, size, idx); + return false; + } u64 new_size = sb->count + size; char *old_items = sb->items; jrk_arena_da_reserve(arena, sb, new_size); + if (!sb->items) { + jrk_errorv("jrk_arena_sb_append_buf_at(%p, %p, %p, %ld, %ld): failed to reserve space for the jrk_StringBuilder", + (void *) arena, (void *) sb, buf, size, idx); + return false; + } if (old_items == sb->items) { // didn't move jrk_StringBuilder temp_builder = {0}; @@ -587,6 +604,8 @@ jrk_arena_sb_append_buf_at(jrk_Arena *arena, jrk_StringBuilder *sb, char *buf, u } sb->count = new_size; + + return true; } void