Currently, the data in a strbuf is modified using add operations. To set the buffer to some data a reset must be performed before an add. strbuf_reset(buf); strbuf_add(buf, cb.buf.buf, cb.buf.len); And this is a common sequence of operations with 70 occurrences found in the current source code. This includes all the different variations (add, addf, addstr, addbuf, addch). FILES=`find ./ -name '*.c'` CNT=$(pcregrep -M "strbuf_reset.*\n.*strbuf_add" $FILES | wc -l) CNT=$(echo "$CNT / 2" | bc) echo $CNT 70 These patches add strbuf_set operations which allow this common sequence to be performed in one line instead of two. strbuf_set(buf, cb.buf.buf, cb.buf.len); Signed-off-by: Jeremiah Mahler <jmmahler@xxxxxxxxx> --- Documentation/technical/api-strbuf.txt | 18 ++++++++++++++++++ strbuf.c | 21 +++++++++++++++++++++ strbuf.h | 14 ++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/Documentation/technical/api-strbuf.txt b/Documentation/technical/api-strbuf.txt index 077a709..b7e23da 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 the buffer content with data of a given length. + +`strbuf_setstr`:: + + Replace the buffer content with data from a NUL-terminated string. + +`strbuf_setf`:: + + Replace the buffer content with a formatted string. + +`strbuf_setbuf`:: + + Replace the buffer 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..b339f08 100644 --- a/strbuf.h +++ b/strbuf.h @@ -101,6 +101,20 @@ 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.592.gf55b190 -- 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