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:
| M | jrk.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