commit 1df4dd145d87b3fb1c71382940dd5f0cef7bdc14
parent f9d4f4b1d711ded078027e12ebc3141ba66180fb
Author: Jake Koroman <jake@jakekoroman.com>
Date: Mon, 28 Jul 2025 19:38:30 -0400
remove jrk_string in favour of jrk_StringBuilder api.
Diffstat:
M | jrk.h | | | 125 | +++++++++++++++++++++++++++++++------------------------------------------------ |
1 file changed, 49 insertions(+), 76 deletions(-)
diff --git a/jrk.h b/jrk.h
@@ -22,31 +22,20 @@ typedef struct {
u8 *data;
u64 length;
u64 capacity;
-} jrk_arena;
-
-/* NOTE(jake):
- * I could use the existing jrk_array_header approach to strings
- * but I much prefer just setting the data pointer to strings
- * than dealing with using the hyper specific arr functions when
- * using strings.
- */
+} jrk_Arena;
+
typedef struct {
- char *data;
- u64 length;
-} jrk_string;
+ char *items;
+ u64 count;
+ u64 capacity;
+} jrk_StringBuilder;
void *jrk_ecalloc(u64, u64);
void *jrk_erealloc(void*, u64);
-jrk_arena jrk_arena_create(u64);
-void *jrk__arena_push(jrk_arena*, u64);
-void jrk_arena_expand(jrk_arena*, u64);
-
-char *jrk_string_to_cstr_arena(jrk_arena*, jrk_string);
-jrk_string jrk_string_from_parts(char*, u64);
-jrk_string jrk_strchop_delim(char*, char, u64);
-void jrk_strput(jrk_string);
-void jrk_strputn(jrk_string, u64);
+jrk_Arena jrk_arena_create(u64);
+void *jrk__arena_push(jrk_Arena*, u64);
+void jrk_arena_expand(jrk_Arena*, u64);
i32 jrk_rand_num(i32);
i32 jrk_rand_num_range(i32, i32);
@@ -60,10 +49,6 @@ i32 jrk_rand_num_range(i32, i32);
#define jrk_arena_push_array(arena, type, n) (type *) jrk__arena_push(arena, sizeof(type) * n)
#define jrk_arena_push_struct(arena, type) (type *) jrk__arena_push(arena, sizeof(type))
-#define jrk_strchop_delim_next(jrk_str,str,delim,n) jrk_strchop_delim(jrk_str.data ? \
- str + (jrk_str.data - str) + jrk_str.length + 1 : str, \
- delim, n)
-
#define jrk_da_reserve(da, expected_capacity) \
do { \
if ((expected_capacity) > (da)->capacity) { \
@@ -105,7 +90,28 @@ i32 jrk_rand_num_range(i32, i32);
#define jrk_da_foreach(type,it,da) for (type *it = (da)->items; it < (da)->items + (da)->count; ++it)
+#define jrk_sb_append_null(sb) jrk_da_append_many(sb, "\0", 1)
+#define jrk_sb_free(sb) jrk_da_free(sb)
+
+#define jrk_sb_append_cstr(sb, cstr) \
+ do { \
+ const char *s = (cstr); \
+ i64 n = strlen(cstr); \
+ jrk_da_append_many(sb, s, n); \
+ } while (0)
+
+#define jrk_sb_append_buf(sb, buf, size) jrk_da_append_many(sb, buf, size)
+
#ifdef JRK_SHORTNAMES
+#define Arena jrk_Arena
+#define StringBuilder jrk_StringBuilder
+
+#define sb_appendf jrk_sb_appendf
+#define sb_append_null jrk_sb_append_null
+#define sb_append_buf jrk_sb_append_buf
+#define sb_append_cstr jrk_sb_append_cstr
+#define sb_free jrk_sb_free
+
#define ecalloc jrk_ecalloc
#define erealloc jrk_erealloc
#define emalloc jrk_emalloc
@@ -123,19 +129,13 @@ i32 jrk_rand_num_range(i32, i32);
#define arena_push_array jrk_arena_push_array
#define arena_expand jrk_arena_expand
-#define strchop_delim jrk_strchop_delim
-#define strchop_delim_next jrk_strchop_delim_next
-#define strput jrk_strput
-#define strputn jrk_strputn
-#define string_from_parts jrk_string_from_parts
-#define string_to_cstr_arena jrk_string_to_cstr_arena
-
#define rand_num jrk_rand_num
#define rand_num_range jrk_rand_num_range
#endif // JRK_SHORTNAMES
#ifdef JRK_IMPLEMENTATION
#include <errno.h>
+#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -168,10 +168,10 @@ jrk_erealloc(void *ptr, u64 size)
return p;
}
-jrk_arena
+jrk_Arena
jrk_arena_create(u64 n)
{
- jrk_arena result;
+ jrk_Arena result;
result.length = 0;
result.capacity = n;
result.data = jrk_ecalloc(result.capacity, 1);
@@ -179,7 +179,7 @@ jrk_arena_create(u64 n)
}
void *
-jrk__arena_push(jrk_arena *arena, u64 n)
+jrk__arena_push(jrk_Arena *arena, u64 n)
{
while (arena->length + n >= arena->capacity)
jrk_arena_expand(arena, arena->capacity * 2);
@@ -190,7 +190,7 @@ jrk__arena_push(jrk_arena *arena, u64 n)
}
void
-jrk_arena_expand(jrk_arena *arena, u64 new_capacity)
+jrk_arena_expand(jrk_Arena *arena, u64 new_capacity)
{
u8 *tmp = jrk_erealloc(arena->data, new_capacity);
@@ -198,48 +198,21 @@ jrk_arena_expand(jrk_arena *arena, u64 new_capacity)
arena->data = tmp;
}
-jrk_string
-jrk_string_from_parts(char *str, u64 n)
-{
- jrk_string result = {0};
- result.data = str;
- result.length = n;
- return result;
-}
-
-jrk_string
-jrk_strchop_delim(char *str, char delim, u64 n)
-{
- for (u64 i = 0; i < n; ++i) {
- if (str[i] == '\0')
- return jrk_string_from_parts(str, i);
-
- if (str[i] == delim)
- return jrk_string_from_parts(str, i);
- }
-
- return (jrk_string) {0};
-}
-
-char *
-jrk_string_to_cstr_arena(jrk_arena *arena, jrk_string string)
-{
- char *result = arena_push_array(arena, char, string.length);
- memcpy(result, string.data, string.length);
- result[string.length] = '\0';
- return result;
-}
-
-void
-jrk_strput(jrk_string string)
-{
- printf("%*.*s\n", (int) string.length, (int) string.length, string.data);
-}
-
-void
-jrk_strputn(jrk_string string, u64 n)
+i32
+jrk_sb_appendf(jrk_StringBuilder *sb, const char *fmt, ...)
{
- printf("%*.*s\n", (int) n, (int) n, string.data);
+ va_list args;
+ va_start(args, fmt);
+ i32 n = vsnprintf(NULL, 0, fmt, args);
+ va_end(args);
+
+ jrk_da_reserve(sb, sb->count + n + 1);
+ va_start(args, fmt);
+ vsnprintf(sb->items + sb->count, n + 1, fmt, args);
+ va_end(args);
+ sb->count += n;
+
+ return n;
}
i32