From 22ac239266b01f067ece83eb6addcdc9f825780e Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 12 Dec 2011 05:10:49 +0000 Subject: Make bulk writer internal and inlinable to avoid function call overhead in the writer. git-svn-id: http://svn.drobilla.net/serd/trunk@254 490d8e77-9747-427b-9fa3-0b8f29cee8a0 --- src/sink.c | 83 -------------------------------------------------------------- 1 file changed, 83 deletions(-) delete mode 100644 src/sink.c (limited to 'src/sink.c') diff --git a/src/sink.c b/src/sink.c deleted file mode 100644 index 3fa90e8c..00000000 --- a/src/sink.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - Copyright 2011 David Robillard - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -#include "serd_internal.h" - -#include -#include - -#ifndef MIN -# define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#endif - -struct SerdBulkSinkImpl { - SerdSink sink; - void* stream; - uint8_t* buf; - size_t size; - size_t block_size; -}; - -SERD_API -SerdBulkSink* -serd_bulk_sink_new(SerdSink sink, void* stream, size_t block_size) -{ - SerdBulkSink* bsink = (SerdBulkSink*)malloc(sizeof(SerdBulkSink)); - bsink->sink = sink; - bsink->stream = stream; - bsink->size = 0; - bsink->block_size = block_size; - bsink->buf = serd_bufalloc(block_size); - return bsink; -} - -SERD_API -void -serd_bulk_sink_free(SerdBulkSink* bsink) -{ - if (bsink) { - // Flush any remaining output - if (bsink->size > 0) { - bsink->sink(bsink->buf, bsink->size, bsink->stream); - } - free(bsink->buf); - free(bsink); - } -} - -SERD_API -size_t -serd_bulk_sink_write(const void* buf, size_t len, SerdBulkSink* bsink) -{ - const size_t orig_len = len; - while (len > 0) { - const size_t space = bsink->block_size - bsink->size; - const size_t n = MIN(space, len); - - // Write as much as possible into the remaining buffer space - memcpy(bsink->buf + bsink->size, buf, n); - bsink->size += n; - buf = (uint8_t*)buf + n; - len -= n; - - // Flush page if buffer is full - if (bsink->size == bsink->block_size) { - bsink->sink(bsink->buf, bsink->block_size, bsink->stream); - bsink->size = 0; - } - } - return orig_len; -} -- cgit v1.2.1