[PATCH 3/5] Add strbuf_printf() to do formatted printing to a strbuf.
From: Kristian Høgsberg <hidden>
Date: 2016-06-15 22:43:25
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Kristian Høgsberg <redacted> Also, expose strbuf_add() and strbuf_add_char() to add raw data to the buffer. Signed-off-by: Kristian Høgsberg <redacted> --- strbuf.c | 37 +++++++++++++++++++++++++++++++------ strbuf.h | 3 +++ 2 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/strbuf.c b/strbuf.c
index e33d06b..a0539db 100644
--- a/strbuf.c
+++ b/strbuf.c@@ -11,16 +11,28 @@ static void strbuf_begin(struct strbuf *sb) { strbuf_init(sb); } -static void inline strbuf_add(struct strbuf *sb, int ch) { - if (sb->alloc <= sb->len) { +static void inline strbuf_grow(struct strbuf *sb, size_t extra) +{ + while (sb->alloc < sb->len + extra) sb->alloc = sb->alloc * 3 / 2 + 16; - sb->buf = xrealloc(sb->buf, sb->alloc); - } + sb->buf = xrealloc(sb->buf, sb->alloc); +} + +void strbuf_add(struct strbuf *sb, const char *data, size_t len) +{ + strbuf_grow(sb, len); + memcpy(sb->buf + sb->len, data, len); + sb->len += len; +} + +void strbuf_add_char(struct strbuf *sb, int ch) +{ + strbuf_grow(sb, 1); sb->buf[sb->len++] = ch; } static void strbuf_end(struct strbuf *sb) { - strbuf_add(sb, 0); + strbuf_add_char(sb, 0); } void read_line(struct strbuf *sb, FILE *fp, int term) {
@@ -33,9 +45,22 @@ void read_line(struct strbuf *sb, FILE *fp, int term) { while ((ch = fgetc(fp)) != EOF) { if (ch == term) break; - strbuf_add(sb, ch); + strbuf_add_char(sb, ch); } if (ch == EOF && sb->len == 0) sb->eof = 1; strbuf_end(sb); } + +void strbuf_printf(struct strbuf *sb, const char *fmt, ...) +{ + char one_line[2048]; + va_list args; + int len; + + va_start(args, fmt); + len = vsnprintf(one_line, sizeof(one_line), fmt, args); + va_end(args); + strbuf_add(sb, one_line, len); +} +
diff --git a/strbuf.h b/strbuf.h
index 74cc012..1e5d09e 100644
--- a/strbuf.h
+++ b/strbuf.h@@ -9,5 +9,8 @@ struct strbuf { extern void strbuf_init(struct strbuf *); extern void read_line(struct strbuf *, FILE *, int); +extern void strbuf_add(struct strbuf *sb, const char *data, size_t len); +extern void strbuf_add_char(struct strbuf *sb, int ch); +extern void strbuf_printf(struct strbuf *sb, const char *fmt, ...); #endif /* STRBUF_H */
--
1.5.2.GIT