diff options
| author | Jake Koroman <jake@jakekoroman.com> | 2026-04-20 14:44:23 -0400 |
|---|---|---|
| committer | Jake Koroman <jake@jakekoroman.com> | 2026-04-20 14:44:23 -0400 |
| commit | 250c8fa41bdae8988f410cf9fe8106bf1e8017ee (patch) | |
| tree | 37e98a7222c4b440ffaf63a98f91b365c09c9d20 /jrk.h | |
| parent | bc92965968b0dddfb590c154a6412a2e7df1a9e7 (diff) | |
rework some of the jrk_String api.
Diffstat (limited to 'jrk.h')
| -rw-r--r-- | jrk.h | 39 |
1 files changed, 35 insertions, 4 deletions
@@ -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) { |
