aboutsummaryrefslogtreecommitdiffstats
path: root/src/sink.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-12-29 17:36:15 -0500
committerDavid Robillard <d@drobilla.net>2019-04-13 19:15:32 +0200
commit2b775031fc4d239cbece7f0911f4be9e50e690d7 (patch)
tree0a58b292c1bae93b40e4e912450aa883d7bd2190 /src/sink.c
parentd6060f62d7dd3c9906fb4c58a75874f57d846162 (diff)
downloadserd-2b775031fc4d239cbece7f0911f4be9e50e690d7.tar.gz
serd-2b775031fc4d239cbece7f0911f4be9e50e690d7.tar.bz2
serd-2b775031fc4d239cbece7f0911f4be9e50e690d7.zip
Add Env to Sink
This isn't technically necessary for any sink, but is a pattern common to every sink implementation in serd, so having it here reduces boilerplate and parameters in user code.
Diffstat (limited to 'src/sink.c')
-rw-r--r--src/sink.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/sink.c b/src/sink.c
index d14ad8f1..1b693e88 100644
--- a/src/sink.c
+++ b/src/sink.c
@@ -23,11 +23,13 @@
#include <stdlib.h>
SerdSink*
-serd_sink_new(void* handle)
+serd_sink_new(void* handle, SerdEnv* env)
{
SerdSink* sink = (SerdSink*)calloc(1, sizeof(SerdSink));
sink->handle = handle;
+ sink->env = env;
+
return sink;
}
@@ -37,6 +39,12 @@ serd_sink_free(SerdSink* sink)
free(sink);
}
+const SerdEnv*
+serd_sink_get_env(const SerdSink* sink)
+{
+ return sink->env;
+}
+
SerdStatus
serd_sink_set_base_func(SerdSink* sink, SerdBaseSink base_func)
{
@@ -68,7 +76,10 @@ serd_sink_set_end_func(SerdSink* sink, SerdEndSink end_func)
SerdStatus
serd_sink_write_base(const SerdSink* sink, const SerdNode* uri)
{
- return sink->base ? sink->base(sink->handle, uri) : SERD_SUCCESS;
+ const SerdStatus st = (sink->env ? serd_env_set_base_uri(sink->env, uri)
+ : SERD_SUCCESS);
+
+ return (!st && sink->base) ? sink->base(sink->handle, uri) : st;
}
SerdStatus
@@ -76,7 +87,10 @@ serd_sink_write_prefix(const SerdSink* sink,
const SerdNode* name,
const SerdNode* uri)
{
- return sink->prefix ? sink->prefix(sink->handle, name, uri) : SERD_SUCCESS;
+ const SerdStatus st = (sink->env ? serd_env_set_prefix(sink->env, name, uri)
+ : SERD_SUCCESS);
+
+ return (!st && sink->prefix) ? sink->prefix(sink->handle, name, uri) : st;
}
SerdStatus