diff options
Diffstat (limited to 'lib/libhts/htsbuf.c')
-rw-r--r-- | lib/libhts/htsbuf.c | 255 |
1 files changed, 0 insertions, 255 deletions
diff --git a/lib/libhts/htsbuf.c b/lib/libhts/htsbuf.c deleted file mode 100644 index 09ec334486..0000000000 --- a/lib/libhts/htsbuf.c +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Buffer management functions - * Copyright (C) 2008 Andreas Öman - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include <assert.h> -#include <stdio.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> -#include "htsbuf.h" -#ifdef _MSC_VER -#include "msvc.h" -#endif - -#ifndef MIN -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif - -#ifndef MAX -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#endif - - -/** - * - */ -void -htsbuf_queue_init(htsbuf_queue_t *hq, unsigned int maxsize) -{ - if(maxsize == 0) - maxsize = INT32_MAX; - TAILQ_INIT(&hq->hq_q); - hq->hq_size = 0; - hq->hq_maxsize = maxsize; -} - - -/** - * - */ -void -htsbuf_data_free(htsbuf_queue_t *hq, htsbuf_data_t *hd) -{ - TAILQ_REMOVE(&hq->hq_q, hd, hd_link); - free(hd->hd_data); - free(hd); -} - - -/** - * - */ -void -htsbuf_queue_flush(htsbuf_queue_t *hq) -{ - htsbuf_data_t *hd; - - hq->hq_size = 0; - - while((hd = TAILQ_FIRST(&hq->hq_q)) != NULL) - htsbuf_data_free(hq, hd); -} - -/** - * - */ -void -htsbuf_append(htsbuf_queue_t *hq, const char *buf, size_t len) -{ - htsbuf_data_t *hd = TAILQ_LAST(&hq->hq_q, htsbuf_data_queue); - int c; - hq->hq_size += len; - - if(hd != NULL) { - /* Fill out any previous buffer */ - c = MIN(hd->hd_data_size - hd->hd_data_len, len); - memcpy(hd->hd_data + hd->hd_data_len, buf, c); - hd->hd_data_len += c; - buf += c; - len -= c; - } - if(len == 0) - return; - - hd = malloc(sizeof(htsbuf_data_t)); - TAILQ_INSERT_TAIL(&hq->hq_q, hd, hd_link); - - c = MAX(len, 1000); /* Allocate 1000 bytes to support lots of small writes */ - - hd->hd_data = malloc(c); - hd->hd_data_size = c; - hd->hd_data_len = len; - hd->hd_data_off = 0; - memcpy(hd->hd_data, buf, len); -} - -/** - * - */ -void -htsbuf_append_prealloc(htsbuf_queue_t *hq, const char *buf, size_t len) -{ - htsbuf_data_t *hd; - - hq->hq_size += len; - - hd = malloc(sizeof(htsbuf_data_t)); - TAILQ_INSERT_TAIL(&hq->hq_q, hd, hd_link); - - hd->hd_data = (void *)buf; - hd->hd_data_size = len; - hd->hd_data_len = len; - hd->hd_data_off = 0; -} - -/** - * - */ -size_t -htsbuf_read(htsbuf_queue_t *hq, char *buf, size_t len) -{ - size_t r = 0; - int c; - - htsbuf_data_t *hd; - - while(len > 0) { - hd = TAILQ_FIRST(&hq->hq_q); - if(hd == NULL) - break; - - c = MIN(hd->hd_data_len - hd->hd_data_off, len); - memcpy(buf, hd->hd_data + hd->hd_data_off, c); - - r += c; - buf += c; - 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); - } - return r; -} - - -/** - * - */ -size_t -htsbuf_find(htsbuf_queue_t *hq, uint8_t v) -{ - htsbuf_data_t *hd; - unsigned int i, o = 0; - - TAILQ_FOREACH(hd, &hq->hq_q, hd_link) { - for(i = hd->hd_data_off; i < hd->hd_data_len; i++) { - if(hd->hd_data[i] == v) - return o + i - hd->hd_data_off; - } - o += hd->hd_data_len - hd->hd_data_off; - } - return -1; -} - - - -/** - * - */ -size_t -htsbuf_peek(htsbuf_queue_t *hq, char *buf, size_t len) -{ - size_t r = 0; - int c; - - htsbuf_data_t *hd = TAILQ_FIRST(&hq->hq_q); - - while(len > 0 && hd != NULL) { - c = MIN(hd->hd_data_len - hd->hd_data_off, len); - memcpy(buf, hd->hd_data + hd->hd_data_off, c); - - buf += c; - len -= c; - - hd = TAILQ_NEXT(hd, hd_link); - } - return r; -} - -/** - * - */ -size_t -htsbuf_drop(htsbuf_queue_t *hq, size_t len) -{ - size_t r = 0; - int c; - htsbuf_data_t *hd; - - while(len > 0) { - hd = TAILQ_FIRST(&hq->hq_q); - if(hd == NULL) - break; - - c = MIN(hd->hd_data_len - hd->hd_data_off, len); - len -= c; - hd->hd_data_off += c; - - if(hd->hd_data_off == hd->hd_data_len) - htsbuf_data_free(hq, hd); - } - return r; -} - -/** - * - */ -void -htsbuf_vqprintf(htsbuf_queue_t *hq, const char *fmt, va_list ap) -{ - char buf[5000]; - htsbuf_append(hq, buf, vsnprintf(buf, sizeof(buf), fmt, ap)); -} - - -/** - * - */ -void -htsbuf_qprintf(htsbuf_queue_t *hq, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - htsbuf_vqprintf(hq, fmt, ap); - va_end(ap); -} - - |