jrk

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

commit 5b8f96812dfd56a7e2fa60097f8099db9368a3f4
parent c182812afa69bebed307411bd11a06cb5eeeb508
Author: Jake Koroman <jake@jakekoroman.com>
Date:   Fri, 29 Aug 2025 13:06:29 -0400

add jrk_sb_append_buf_at.

Diffstat:
Mjrk.h | 27++++++++++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/jrk.h b/jrk.h @@ -67,6 +67,7 @@ void jrk_sb_fd_read_all(jrk_StringBuilder*, i32); u64 jrk_sb_fd_write_all(jrk_StringBuilder*, i32); void jrk_sb_write_file(jrk_StringBuilder*, char*); void jrk_sb_read_entire_file(jrk_StringBuilder*, char*); +void jrk_sb_append_buf_at(jrk_StringBuilder*, char*, u64, u64); jrk_StringView jrk_sv_from_parts(char*, u64); jrk_StringView jrk_sv_trim_right(jrk_StringView); @@ -94,11 +95,12 @@ jrk_StringView jrk_sv_chop_delim(jrk_StringView*, char delim); #define jrk_sb_to_sv(sb) jrk_sv_from_parts((sb).items, (sb).count) +#define JRK_DA_DEFAULT_INIT_CAPACITY 16 #define jrk_da_reserve(da, expected_capacity) \ do { \ if ((expected_capacity) > (da)->capacity) { \ if ((da)->capacity == 0) { \ - (da)->capacity = 4; \ + (da)->capacity = JRK_DA_DEFAULT_INIT_CAPACITY; \ } \ while ((expected_capacity) > (da)->capacity) { \ (da)->capacity *= 2; \ @@ -159,6 +161,7 @@ jrk_StringView jrk_sv_chop_delim(jrk_StringView*, char delim); #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_buf_at jrk_sb_append_buf_at #define sb_append_cstr jrk_sb_append_cstr #define sb_free jrk_sb_free #define sb_fd_read_all jrk_sb_fd_read_all @@ -303,6 +306,27 @@ jrk_sb_appendf(jrk_StringBuilder *sb, const char *fmt, ...) return n; } +void +jrk_sb_append_buf_at(jrk_StringBuilder *sb, char *buf, u64 size, u64 idx) +{ + jrk_assertv(idx < sb->count, "jrk_sb_append_buf_at(%p, %p, %ld, %ld): idx is greater than sb->count", + sb, buf, size, idx); + + u64 new_size = sb->count + size; + char *temp = jrk_emalloc(new_size); + + memcpy(temp, sb->items, idx); + memcpy(temp + idx, buf, size); + memcpy(temp + idx + size, sb->items + idx, sb->count - idx); + + free(sb->items); + sb->items = temp; + sb->count = new_size; + + // NOTE: maybe keep it a proper ^2? + sb->capacity = new_size; +} + u64 jrk_fd_size(i32 fd) { @@ -399,6 +423,7 @@ jrk_sv_from_parts(char *data, u64 count) { jrk_StringView result = {0}; result.data = data; + if (data[count] == '\0') result.count = count-1; else