diff options
author | David Robillard <d@drobilla.net> | 2011-12-12 05:10:49 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2011-12-12 05:10:49 +0000 |
commit | 22ac239266b01f067ece83eb6addcdc9f825780e (patch) | |
tree | 918516d71f7303d6e05699f8b60d20a6f6372409 /src/sink.c | |
parent | e731c88e809459ef4adb4988e433d6be7b043aa6 (diff) | |
download | serd-22ac239266b01f067ece83eb6addcdc9f825780e.tar.gz serd-22ac239266b01f067ece83eb6addcdc9f825780e.tar.bz2 serd-22ac239266b01f067ece83eb6addcdc9f825780e.zip |
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
Diffstat (limited to 'src/sink.c')
-rw-r--r-- | src/sink.c | 83 |
1 files changed, 0 insertions, 83 deletions
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 <http://drobilla.net> - - 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 <stdlib.h> -#include <string.h> - -#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; -} |