mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Add buf_t API helpers for using buffers to construct outputs.
This commit is contained in:
parent
342712b9ef
commit
d5ba4851bd
@ -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>.
|
||||
*/
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user