commit d5ba4851bd8c05ac5a43e302506a1ed67f6be7e7 Author: Nick Mathewson nickm@torproject.org Date: Wed Sep 6 09:07:50 2017 -0400
Add buf_t API helpers for using buffers to construct outputs. --- src/common/buffers.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ src/common/buffers.h | 6 ++++++ 2 files changed, 53 insertions(+)
diff --git a/src/common/buffers.c b/src/common/buffers.c index 50673646d..d7c4e4d8c 100644 --- a/src/common/buffers.c +++ b/src/common/buffers.c @@ -710,6 +710,53 @@ buf_add(buf_t *buf, const char *string, size_t string_len) return (int)buf->datalen; }
+/** Add a nul-terminated <b>string</b> to <b>buf</b>, not including the + * terminating NUL. */ +void +buf_add_string(buf_t *buf, const char *string) +{ + buf_add(buf, string, strlen(string)); +} + +/** As tor_snprintf, but write the results into a buf_t */ +void +buf_add_printf(buf_t *buf, const char *format, ...) +{ + va_list ap; + va_start(ap,format); + buf_add_vprintf(buf, format, ap); + va_end(ap); +} + +/** As tor_vsnprintf, but write the results into a buf_t. */ +void +buf_add_vprintf(buf_t *buf, const char *format, va_list args) +{ + /* XXXX Faster implementations are easy enough, but let's optimize later */ + char *tmp; + tor_vasprintf(&tmp, format, args); + buf_add(buf, tmp, strlen(tmp)); + tor_free(tmp); +} + +/** Return a heap-allocated string containing the contents of <b>buf</b>, plus + * a NUL byte. If <b>sz_out</b> is provided, set *<b>sz_out</b> to the length + * of the returned string, not including the terminating NUL. */ +char * +buf_extract(buf_t *buf, size_t *sz_out) +{ + tor_assert(buf); + + size_t sz = buf_datalen(buf); + char *result; + result = tor_malloc(sz+1); + buf_peek(buf, result, sz); + result[sz] = 0; + if (sz_out) + *sz_out = sz; + return result; +} + /** Helper: copy the first <b>string_len</b> bytes from <b>buf</b> * onto <b>string</b>. */ diff --git a/src/common/buffers.h b/src/common/buffers.h index 5a52b2a81..b05c5b13d 100644 --- a/src/common/buffers.h +++ b/src/common/buffers.h @@ -43,6 +43,11 @@ int buf_flush_to_socket(buf_t *buf, tor_socket_t s, size_t sz, size_t *buf_flushlen);
int buf_add(buf_t *buf, const char *string, size_t string_len); +void buf_add_string(buf_t *buf, const char *string); +void buf_add_printf(buf_t *buf, const char *format, ...) + CHECK_PRINTF(2, 3); +void buf_add_vprintf(buf_t *buf, const char *format, va_list args) + CHECK_PRINTF(2, 0); int buf_add_compress(buf_t *buf, struct tor_compress_state_t *state, const char *data, size_t data_len, int done); int buf_move_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen); @@ -62,6 +67,7 @@ void buf_assert_ok(buf_t *buf); int buf_find_string_offset(const buf_t *buf, const char *s, size_t n); void buf_pullup(buf_t *buf, size_t bytes, const char **head_out, size_t *len_out); +char *buf_extract(buf_t *buf, size_t *sz_out);
#ifdef BUFFERS_PRIVATE #ifdef TOR_UNIT_TESTS