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