summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jrk.h39
1 files changed, 35 insertions, 4 deletions
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)
{