From 250c8fa41bdae8988f410cf9fe8106bf1e8017ee Mon Sep 17 00:00:00 2001 From: Jake Koroman Date: Mon, 20 Apr 2026 14:44:23 -0400 Subject: rework some of the jrk_String api. --- jrk.h | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) (limited to 'jrk.h') diff --git a/jrk.h b/jrk.h index e21fa97..ad5b126 100644 --- a/jrk.h +++ b/jrk.h @@ -37,6 +37,8 @@ typedef double f64; #define JRK_MIN(a, b) ((a) < (b) ? (a) : (b)) #define JRK_MAX(a, b) ((a) > (b) ? (a) : (b)) +#define JRK_SAFE_DECREMENT(a) (a == 0 ? a - 0 : a - 1) + #define jrk_return_defer(value) \ do { result = value; goto defer; } while(0) @@ -90,9 +92,12 @@ jrk_String jrk_string_from_parts(const char*, u64); jrk_String jrk_string_trim_right(jrk_String); jrk_String jrk_string_trim_left(jrk_String); jrk_String jrk_string_trim(jrk_String); +typedef jrk_String(*jrk_string_trim_fn_t) (jrk_String); +jrk_String jrk_string_trim_fn(jrk_String, jrk_string_trim_fn_t); jrk_String jrk_string_from_cstr(const char*); #define jrk_string_from_lit(str_lit) jrk_string_from_parts((str_lit), sizeof((str_lit)) - 1) -jrk_String jrk_string_chop_delim(jrk_String*, char delim); +jrk_String jrk_string_chop_by_delim(jrk_String*, char delim); +jrk_String jrk_string_chop_by_space(jrk_String*); bool jrk_string_equals(jrk_String, jrk_String); /* takes the lowest len and matches up to that size */ bool jrk_string_equals_exact(jrk_String, jrk_String); /* must be same len to be equal */ @@ -703,8 +708,8 @@ jrk_arena_create(u8 *buffer, u64 buffer_count) void * jrk_arena_push(jrk_Arena *arena, u64 n) { - u8 *aligned = (u8 *) jrk_align_forward((uintptr_t)(arena->data + arena->offset), _JRK_DEFAULT_ALIGNMENT); - u64 new_offset = aligned - arena->data; + uintptr_t aligned = jrk_align_forward((uintptr_t)(arena->data + arena->offset), _JRK_DEFAULT_ALIGNMENT); + u64 new_offset = aligned - (uintptr_t) arena->data; if (new_offset + n > arena->capacity) { jrk_errorv("jrk_arena_push(%p, %ld): arena push requires %ld bytes but has a capacity of %ld bytes", @@ -894,7 +899,13 @@ jrk_string_trim(jrk_String str) } jrk_String -jrk_string_chop_delim(jrk_String *str, char delim) +jrk_string_trim_fn(jrk_String str, jrk_string_trim_fn_t trimfn) +{ + return trimfn(str); +} + +jrk_String +jrk_string_chop_by_delim(jrk_String *str, char delim) { u64 i = 0; while (i < str->len && str->data[i] != delim) @@ -913,6 +924,26 @@ jrk_string_chop_delim(jrk_String *str, char delim) return result; } +jrk_String +jrk_string_chop_by_space(jrk_String *str) +{ + u64 i = 0; + while (i < str->len && !isspace(str->data[i])) + ++i; + + jrk_String result = jrk_string_from_parts(str->data, i); + + if (i < str->len) { + str->data += i + 1; + str->len -= i + 1; + } else { + str->data += i; + str->len -= i; + } + + return result; +} + bool jrk_string_equals(jrk_String a, jrk_String b) { -- cgit v1.2.3