Add buf_t API helpers for using buffers to construct outputs.

This commit is contained in:
Nick Mathewson 2017-09-06 09:07:50 -04:00
parent 342712b9ef
commit d5ba4851bd
2 changed files with 53 additions and 0 deletions

View File

@ -710,6 +710,53 @@ buf_add(buf_t *buf, const char *string, size_t string_len)
return (int)buf->datalen; 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> /** Helper: copy the first <b>string_len</b> bytes from <b>buf</b>
* onto <b>string</b>. * onto <b>string</b>.
*/ */

View File

@ -43,6 +43,11 @@ int buf_flush_to_socket(buf_t *buf, tor_socket_t s, size_t sz,
size_t *buf_flushlen); size_t *buf_flushlen);
int buf_add(buf_t *buf, const char *string, size_t string_len); 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, int buf_add_compress(buf_t *buf, struct tor_compress_state_t *state,
const char *data, size_t data_len, int done); 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); 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); int buf_find_string_offset(const buf_t *buf, const char *s, size_t n);
void buf_pullup(buf_t *buf, size_t bytes, void buf_pullup(buf_t *buf, size_t bytes,
const char **head_out, size_t *len_out); const char **head_out, size_t *len_out);
char *buf_extract(buf_t *buf, size_t *sz_out);
#ifdef BUFFERS_PRIVATE #ifdef BUFFERS_PRIVATE
#ifdef TOR_UNIT_TESTS #ifdef TOR_UNIT_TESTS