jrk

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

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:
Mjrk.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