diff options
| author | Mistivia <i@mistivia.com> | 2025-07-29 12:54:27 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-07-29 12:54:27 +0800 |
| commit | d731583a050cff254fcc6360d1080e4b15afb939 (patch) | |
| tree | 60f6f4b2527ee481f25ec7d18386abac1e119379 | |
| parent | 0a7e5145fb82c0d6e49dab457ac467ab4bf6d3be (diff) | |
add new interface for string builder
| -rw-r--r-- | str.c | 31 | ||||
| -rw-r--r-- | str.h | 8 |
2 files changed, 39 insertions, 0 deletions
@@ -84,6 +84,26 @@ char *str_strip(char *str) { memcpy(buf, begin, len); return buf; } +void StrBuilder_init(StrBuilder* self) { + init_str_builder(self); +} + +void StrBuilder_free(StrBuilder* self) { + free(self->buf); +} + +StrBuilder StrBuilder_move(StrBuilder* self) { + StrBuilder neo; + neo.buf = self->buf; + self->buf = NULL; + self->cap = 0; + self->size = 0; + return neo; +} + +void StrBuilder_append_char(StrBuilder *sb, char c) { + str_builder_append_char(sb, c); +} void init_str_builder(str_builder_t *sb) { *sb = (str_builder_t){.size = 0, .cap = 16}; @@ -100,6 +120,17 @@ static void sb_reserve(str_builder_t *sb, int extra) { sb->cap = new_cap; } +void StrBuilder_append(StrBuilder *sb, char *format, ...) { + va_list va1; + va_list va2; + va_start(va1, format); + va_copy(va2, va1); + int size = vsnprintf(NULL, 0, format, va1); + sb_reserve(sb, size); + vsnprintf(sb->buf + sb->size, sb->cap - sb->size + 1, format, va2); + sb->size += size; +} + void str_builder_append(str_builder_t *sb, char *format, ...) { va_list va1; va_list va2; @@ -13,7 +13,15 @@ struct str_builder { int cap; }; typedef struct str_builder str_builder_t; +typedef struct str_builder StrBuilder; +void StrBuilder_init(StrBuilder* self); +void StrBuilder_append(StrBuilder *self, char *format, ...); +void StrBuilder_append_char(StrBuilder *self, char c); +StrBuilder StrBuilder_move(StrBuilder* self); +void StrBuilder_free(StrBuilder* self); + +// legacy void init_str_builder(str_builder_t *sb); void str_builder_append(str_builder_t *sb, char *format, ...); void str_builder_append_char(str_builder_t *sb, char c); |
