aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-07-13 21:04:54 +0200
committerDavid Robillard <d@drobilla.net>2020-10-27 13:13:58 +0100
commit2f8014934fc8f4c6946bf81fe3898c39db611261 (patch)
treeaa60e7ca30a79c96655cfe08936f3983c2c5393f
parent9fe9d6a934aa40250a804de9b7ac2a4daefcc774 (diff)
downloadserd-2f8014934fc8f4c6946bf81fe3898c39db611261.tar.gz
serd-2f8014934fc8f4c6946bf81fe3898c39db611261.tar.bz2
serd-2f8014934fc8f4c6946bf81fe3898c39db611261.zip
Separate ByteSink from Writer
-rw-r--r--serd/serd.h7
-rw-r--r--src/serdi.c10
-rw-r--r--src/writer.c13
-rw-r--r--tests/serd_test.c14
4 files changed, 26 insertions, 18 deletions
diff --git a/serd/serd.h b/serd/serd.h
index 7dae8b3b..135e2b81 100644
--- a/serd/serd.h
+++ b/serd/serd.h
@@ -305,9 +305,8 @@ typedef struct {
*/
typedef enum {
SERD_STYLE_ASCII = 1 << 0, /**< Escape all non-ASCII characters. */
- SERD_STYLE_BULK = 1 << 1, /**< Write output in pages. */
- SERD_STYLE_UNQUALIFIED = 1 << 2, /**< Do not shorten URIs into CURIEs. */
- SERD_STYLE_UNRESOLVED = 1 << 3 /**< Do not make URIs relative. */
+ SERD_STYLE_UNQUALIFIED = 1 << 1, /**< Do not shorten URIs into CURIEs. */
+ SERD_STYLE_UNRESOLVED = 1 << 2 /**< Do not make URIs relative. */
} SerdStyle;
/**
@@ -1239,7 +1238,7 @@ serd_writer_new(SerdWorld* world,
SerdSyntax syntax,
SerdStyleFlags style,
SerdEnv* env,
- SerdWriteFunc ssink,
+ SerdWriteFunc write_func,
void* stream);
/**
diff --git a/src/serdi.c b/src/serdi.c
index 9bf42ac2..566a5c60 100644
--- a/src/serdi.c
+++ b/src/serdi.c
@@ -207,15 +207,17 @@ main(int argc, char** argv)
const SerdStyleFlags output_style =
((ascii ? SERD_STYLE_ASCII : 0) | //
- (bulk_write ? SERD_STYLE_BULK : 0) | //
(full_uris ? (SERD_STYLE_UNQUALIFIED | SERD_STYLE_UNRESOLVED) : 0));
+ SerdByteSink* byte_sink = serd_byte_sink_new(
+ (SerdWriteFunc)fwrite, out_fd, bulk_write ? 4096 : 1);
+
SerdWriter* writer = serd_writer_new(world,
output_syntax,
output_style,
env,
- (SerdWriteFunc)fwrite,
- out_fd);
+ (SerdWriteFunc)serd_byte_sink_write,
+ byte_sink);
SerdReader* reader = serd_reader_new(
world, input_syntax, serd_writer_get_sink(writer), stack_size);
@@ -254,8 +256,8 @@ main(int argc, char** argv)
serd_reader_finish(reader);
serd_reader_free(reader);
- serd_writer_finish(writer);
serd_writer_free(writer);
+ serd_byte_sink_free(byte_sink);
serd_env_free(env);
serd_node_free(base);
serd_world_free(world);
diff --git a/src/writer.c b/src/writer.c
index 8e0a5c04..eb9d79ea 100644
--- a/src/writer.c
+++ b/src/writer.c
@@ -94,7 +94,8 @@ struct SerdWriterImpl {
SerdNode* root_node;
SerdURI root_uri;
SerdStack anon_stack;
- SerdByteSink* byte_sink;
+ SerdWriteFunc write_func;
+ void* stream;
SerdErrorSink error_sink;
void* error_handle;
WriteContext context;
@@ -155,7 +156,7 @@ ctx(SerdWriter* writer, const SerdField field)
static inline size_t
sink(const void* buf, size_t len, SerdWriter* writer)
{
- return serd_byte_sink_write(buf, 1, len, writer->byte_sink);
+ return writer->write_func(buf, 1, len, writer->stream);
}
// Write a single character, as an escape for single byte characters
@@ -859,7 +860,6 @@ serd_writer_finish(SerdWriter* writer)
if (ctx(writer, SERD_GRAPH)) {
write_sep(writer, SEP_GRAPH_END);
}
- serd_byte_sink_flush(writer->byte_sink);
free_context(writer);
writer->indent = 0;
writer->context = WRITE_CONTEXT_NULL;
@@ -871,7 +871,7 @@ serd_writer_new(SerdWorld* world,
SerdSyntax syntax,
SerdStyleFlags style,
SerdEnv* env,
- SerdWriteFunc ssink,
+ SerdWriteFunc write_func,
void* stream)
{
const WriteContext context = WRITE_CONTEXT_NULL;
@@ -883,11 +883,11 @@ serd_writer_new(SerdWorld* world,
writer->root_node = NULL;
writer->root_uri = SERD_URI_NULL;
writer->anon_stack = serd_stack_new(SERD_PAGE_SIZE);
+ writer->write_func = write_func;
+ writer->stream = stream;
writer->context = context;
writer->list_subj = NULL;
writer->empty = true;
- writer->byte_sink = serd_byte_sink_new(
- ssink, stream, (style & SERD_STYLE_BULK) ? SERD_PAGE_SIZE : 1);
writer->iface.handle = writer;
writer->iface.base = (SerdBaseSink)serd_writer_set_base_uri;
@@ -980,7 +980,6 @@ serd_writer_free(SerdWriter* writer)
serd_writer_finish(writer);
serd_stack_free(&writer->anon_stack);
free(writer->bprefix);
- serd_byte_sink_free(writer->byte_sink);
serd_node_free(writer->root_node);
free(writer);
}
diff --git a/tests/serd_test.c b/tests/serd_test.c
index fa13c1b2..6e69fc0d 100644
--- a/tests/serd_test.c
+++ b/tests/serd_test.c
@@ -674,15 +674,23 @@ test_writer(const char* const path)
serd_node_free(urn_Type);
// Test buffer sink
- SerdBuffer buffer = { NULL, 0 };
- writer = serd_writer_new(
- world, SERD_TURTLE, 0, env, serd_buffer_sink, &buffer);
+ SerdBuffer buffer = { NULL, 0 };
+ SerdByteSink* byte_sink =
+ serd_byte_sink_new((SerdWriteFunc)serd_buffer_sink, &buffer, 1);
+
+ writer = serd_writer_new(world,
+ SERD_TURTLE,
+ 0,
+ env,
+ (SerdWriteFunc)serd_byte_sink_write,
+ byte_sink);
o = serd_new_uri("http://example.org/base");
assert(!serd_writer_set_base_uri(writer, o));
serd_node_free(o);
serd_writer_free(writer);
+ serd_byte_sink_free(byte_sink);
char* out = serd_buffer_sink_finish(&buffer);
assert(!strcmp(out, "@base <http://example.org/base> .\n"));