From afb8b6055c5e54be762e220cf9b7b65a22266733 Mon Sep 17 00:00:00 2001 From: ajs Date: Fri, 28 Jan 2005 20:41:07 +0000 Subject: 2005-01-28 Andrew J. Schorr * lib/buffer.h: Document behavior of buffer_getstr function. * lib/buffer.c: (buffer_getstr) Fix bug: must handle case where the string extends beyond the head struct buffer_data. --- lib/ChangeLog | 6 ++++++ lib/buffer.c | 18 +++++++++++++++++- lib/buffer.h | 7 +++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/ChangeLog b/lib/ChangeLog index 750e310f..7955f098 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,9 @@ +2005-01-28 Andrew J. Schorr + + * lib/buffer.h: Document behavior of buffer_getstr function. + * lib/buffer.c: (buffer_getstr) Fix bug: must handle case where + the string extends beyond the head struct buffer_data. + 2005-01-28 Andrew J. Schorr * lib/command.h: Document behavior of argv_concat function. diff --git a/lib/buffer.c b/lib/buffer.c index 296fd144..60048bc0 100644 --- a/lib/buffer.c +++ b/lib/buffer.c @@ -88,7 +88,23 @@ buffer_free (struct buffer *b) char * buffer_getstr (struct buffer *b) { - return strdup ((char *)b->head->data); + size_t totlen = 0; + struct buffer_data *data; + char *s; + char *p; + + for (data = b->head; data; data = data->next) + totlen += data->cp - data->sp; + if (!(s = malloc(totlen+1))) + return NULL; + p = s; + for (data = b->head; data; data = data->next) + { + memcpy(p, data->data + data->sp, data->cp - data->sp); + p += data->cp - data->sp; + } + *p = '\0'; + return s; } /* Return 1 if buffer is empty. */ diff --git a/lib/buffer.h b/lib/buffer.h index 65b8a8ca..c3787d78 100644 --- a/lib/buffer.h +++ b/lib/buffer.h @@ -65,7 +65,14 @@ struct buffer_data struct buffer *buffer_new (size_t); int buffer_write (struct buffer *, const void *, size_t); void buffer_free (struct buffer *); + +/* Combine all accumulated (and unflushed) data inside the buffer into a + single NUL-terminated string allocated using malloc (N.B. should be changed + to use XMALLOC(MTYPE_TMP)). Note that this function does not alter + the state of the buffer, so the data is still inside waiting to be + flushed. */ char *buffer_getstr (struct buffer *); + int buffer_putc (struct buffer *, u_char); int buffer_putstr (struct buffer *, const char *); void buffer_reset (struct buffer *); -- cgit v1.2.1