aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-07-29 12:54:27 +0800
committerMistivia <i@mistivia.com>2025-07-29 12:54:27 +0800
commitd731583a050cff254fcc6360d1080e4b15afb939 (patch)
tree60f6f4b2527ee481f25ec7d18386abac1e119379
parent0a7e5145fb82c0d6e49dab457ac467ab4bf6d3be (diff)
add new interface for string builder
-rw-r--r--str.c31
-rw-r--r--str.h8
2 files changed, 39 insertions, 0 deletions
diff --git a/str.c b/str.c
index 2d7d177..a8c2200 100644
--- a/str.c
+++ b/str.c
@@ -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;
diff --git a/str.h b/str.h
index 441451e..62a7e15 100644
--- a/str.h
+++ b/str.h
@@ -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);