A common use case with strubfs is to set the buffer to a new value. This must be done in two steps: a reset followed by an add. strbuf_reset(buf); strbuf_add(buf, new_buf, len); In cases where the buffer is being built up in steps, these operations make sense and correctly convey what is being performed. strbuf_reset(buf); strbuf_add(buf, data1, len1); strbuf_add(buf, data2, len2); strbuf_add(buf, data3, len3); However, in other cases, it can be confusing and is not very concise. strbuf_reset(buf); strbuf_add(buf, default, len1); if (cond1) { strbuf_reset(buf); strbuf_add(buf, data2, len2); } if (cond2) { strbuf_reset(buf); strbuf_add(buf, data3, len3); } Add strbuf_set operations so that it can be re-written in a clear and concise way. strbuf_set(buf, default len1); if (cond1) { strbuf_set(buf, data2, len2); } if (cond2) { strbuf_set(buf, data3, len3); } Signed-off-by: Jeremiah Mahler <jmmahler@xxxxxxxxx> --- Documentation/technical/api-strbuf.txt | 18 ++++++++++++++++++ strbuf.c | 21 +++++++++++++++++++++ strbuf.h | 13 +++++++++++++ 3 files changed, 52 insertions(+) diff --git a/Documentation/technical/api-strbuf.txt b/Documentation/technical/api-strbuf.txt index f9c06a7..ae9c9cc 100644 --- a/Documentation/technical/api-strbuf.txt +++ b/Documentation/technical/api-strbuf.txt @@ -149,6 +149,24 @@ Functions than zero if the first buffer is found, respectively, to be less than, to match, or be greater than the second buffer. +* Setting the buffer + +`strbuf_set`:: + + Replace content with data of a given length. + +`strbuf_setstr`:: + + Replace content with data from a NUL-terminated string. + +`strbuf_setf`:: + + Replace content with a formatted string. + +`strbuf_setbuf`:: + + Replace content with data from another buffer. + * Adding data to the buffer NOTE: All of the functions in this section will grow the buffer as necessary. diff --git a/strbuf.c b/strbuf.c index ac62982..9d64b00 100644 --- a/strbuf.c +++ b/strbuf.c @@ -189,6 +189,27 @@ void strbuf_splice(struct strbuf *sb, size_t pos, size_t len, strbuf_setlen(sb, sb->len + dlen - len); } +void strbuf_set(struct strbuf *sb, const void *data, size_t len) +{ + strbuf_reset(sb); + strbuf_add(sb, data, len); +} + +void strbuf_setf(struct strbuf *sb, const char *fmt, ...) +{ + va_list ap; + strbuf_reset(sb); + va_start(ap, fmt); + strbuf_vaddf(sb, fmt, ap); + va_end(ap); +} + +void strbuf_setbuf(struct strbuf *sb, const struct strbuf *sb2) +{ + strbuf_reset(sb); + strbuf_add(sb, sb2->buf, sb2->len); +} + void strbuf_insert(struct strbuf *sb, size_t pos, const void *data, size_t len) { strbuf_splice(sb, pos, 0, data, len); diff --git a/strbuf.h b/strbuf.h index e9ad03e..5041c35 100644 --- a/strbuf.h +++ b/strbuf.h @@ -101,6 +101,19 @@ static inline struct strbuf **strbuf_split(const struct strbuf *sb, */ extern void strbuf_list_free(struct strbuf **); +/*----- set buffer to data -----*/ +extern void strbuf_set(struct strbuf *sb, const void *data, size_t len); + +static inline void strbuf_setstr(struct strbuf *sb, const char *s) +{ + strbuf_set(sb, s, strlen(s)); +} + +__attribute__((format (printf,2,3))) +extern void strbuf_setf(struct strbuf *sb, const char *fmt, ...); + +extern void strbuf_setbuf(struct strbuf *sb, const struct strbuf *sb2); + /*----- add data in your buffer -----*/ static inline void strbuf_addch(struct strbuf *sb, int c) { -- 2.0.0 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html