aboutsummaryrefslogtreecommitdiffstats
path: root/src/sink.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2011-12-12 05:10:49 +0000
committerDavid Robillard <d@drobilla.net>2011-12-12 05:10:49 +0000
commit22ac239266b01f067ece83eb6addcdc9f825780e (patch)
tree918516d71f7303d6e05699f8b60d20a6f6372409 /src/sink.c
parente731c88e809459ef4adb4988e433d6be7b043aa6 (diff)
downloadserd-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.c83
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;
-}