diff options
| author | Jake Koroman <jake@jakekoroman.com> | 2025-08-29 13:06:29 -0400 |
|---|---|---|
| committer | Jake Koroman <jake@jakekoroman.com> | 2025-08-29 13:06:29 -0400 |
| commit | 5b8f96812dfd56a7e2fa60097f8099db9368a3f4 (patch) | |
| tree | 76c4fd1397f27bdfc4c673e600906b6c6322e0cb | |
| parent | c182812afa69bebed307411bd11a06cb5eeeb508 (diff) | |
add jrk_sb_append_buf_at.
| -rw-r--r-- | jrk.h | 27 |
1 files changed, 26 insertions, 1 deletions
@@ -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 |
