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