From 839244f63732bee2061a71ac97b5207aef0aad20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Mon, 21 Jun 2010 18:55:01 +0000 Subject: [PATCH] Fix size computation failure Add function for appending a htsbuf_queue to another --- src/htsbuf.c | 28 +++++++++++++++++++++++++++- src/htsbuf.h | 5 +++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/htsbuf.c b/src/htsbuf.c index 071ceccd..91a368ac 100644 --- a/src/htsbuf.c +++ b/src/htsbuf.c @@ -47,6 +47,18 @@ htsbuf_queue_init(htsbuf_queue_t *hq, unsigned int maxsize) } +/** + * + */ +htsbuf_queue_t * +htsbuf_queue_alloc(unsigned int maxsize) +{ + htsbuf_queue_t *hq = malloc(sizeof(htsbuf_queue_t)); + htsbuf_queue_init(hq, maxsize); + return hq; +} + + /** * */ @@ -218,7 +230,8 @@ htsbuf_drop(htsbuf_queue_t *hq, size_t len) c = MIN(hd->hd_data_len - hd->hd_data_off, len); len -= c; hd->hd_data_off += c; - + hq->hq_size -= c; + if(hd->hd_data_off == hd->hd_data_len) htsbuf_data_free(hq, hd); } @@ -249,3 +262,16 @@ htsbuf_qprintf(htsbuf_queue_t *hq, const char *fmt, ...) } +void +htsbuf_appendq(htsbuf_queue_t *hq, htsbuf_queue_t *src) +{ + htsbuf_data_t *hd; + + hq->hq_size += src->hq_size; + src->hq_size = 0; + + while((hd = TAILQ_FIRST(&src->hq_q)) != NULL) { + TAILQ_REMOVE(&src->hq_q, hd, hd_link); + TAILQ_INSERT_TAIL(&hq->hq_q, hd, hd_link); + } +} diff --git a/src/htsbuf.h b/src/htsbuf.h index f152f761..ed1c0244 100644 --- a/src/htsbuf.h +++ b/src/htsbuf.h @@ -20,6 +20,7 @@ #define HTSBUF_H__ #include +#include #include "queue.h" #include @@ -41,6 +42,8 @@ typedef struct htsbuf_queue { void htsbuf_queue_init(htsbuf_queue_t *hq, unsigned int maxsize); +htsbuf_queue_t *htsbuf_queue_alloc(unsigned int maxsize); + void htsbuf_queue_flush(htsbuf_queue_t *hq); void htsbuf_vqprintf(htsbuf_queue_t *hq, const char *fmt, va_list ap); @@ -51,6 +54,8 @@ void htsbuf_append(htsbuf_queue_t *hq, const void *buf, size_t len); void htsbuf_append_prealloc(htsbuf_queue_t *hq, const void *buf, size_t len); +void htsbuf_appendq(htsbuf_queue_t *hq, htsbuf_queue_t *src); + void htsbuf_data_free(htsbuf_queue_t *hq, htsbuf_data_t *hd); size_t htsbuf_read(htsbuf_queue_t *hq, void *buf, size_t len);