jrk

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

commit 7f11bac149dc155e41bc45a990a15b9eadc50c8a
parent bfcf3f845482a39bca4a5e8a3602ef5e4ad3dc6d
Author: Jake Koroman <jake@jakekoroman.com>
Date:   Fri, 22 Aug 2025 10:01:29 -0400

add jrk_sv_chop_delim.

Diffstat:
Mjrk.h | 33+++++++++++++++++++++++++++++++--
1 file changed, 31 insertions(+), 2 deletions(-)

diff --git a/jrk.h b/jrk.h @@ -1,7 +1,9 @@ /* - * TODO(jake): + * TODO: * - application shouldn't be dying on all failures, have a way * to configure that ... just die without calling exit() + * - look at at the jrk_sv_chop_delim_loop stuff. there must + * must be a better way of handling things. */ #include <stdint.h> @@ -70,8 +72,13 @@ jrk_StringView jrk_sv_trim_right(jrk_StringView); jrk_StringView jrk_sv_trim_left(jrk_StringView); jrk_StringView jrk_sv_trim(jrk_StringView); jrk_StringView jrk_sv_from_cstr(char*); +jrk_StringView jrk_sv_chop_delim(jrk_StringView*, char delim); -/* NOTE(jake): no shortname as 'assert' is just too generic */ +/* XXX: im not thrilled with this api, the memory can get messy real fast */ +#define jrk_sv_chop_delim_loop(sv, it, delim) \ + for (jrk_StringView it = jrk_sv_chop_delim(sv, delim); it.count != 0; it = jrk_sv_chop_delim(sv, delim)) + +/* NOTE: no shortname as 'assert' is just too generic */ #define jrk_assert(c, msg) do { if (!(c)) jrk_die("jrk_assert: "msg); } while(0) #define jrk_shift(x, n) ((n)--, *(x)++) @@ -162,6 +169,7 @@ jrk_StringView jrk_sv_from_cstr(char*); #define sv_trim jrk_sv_trim #define sv_from_cstr jrk_sv_from_cstr #define sv_from_parts jrk_sv_from_parts + #define sv_chop_delim jrk_sv_chop_delim #define ecalloc jrk_ecalloc #define erealloc jrk_erealloc @@ -426,6 +434,27 @@ jrk_sv_trim(jrk_StringView sv) return jrk_sv_trim_right(jrk_sv_trim_left(sv)); } +jrk_StringView +jrk_sv_chop_delim(jrk_StringView *sv, char delim) +{ + u64 i = 0; + while (i < sv->count && sv->data[i] != delim) + ++i; + + jrk_StringView result = jrk_sv_from_parts(sv->data, i); + + if (i < sv->count) { + sv->data += i + 1; + sv->count -= i + 1; + } else { + sv->data += i; + sv->count -= i; + result.count++; + } + + return result; +} + i32 jrk_rand_num(i32 upbound) {