diff options
author | David Robillard <d@drobilla.net> | 2021-03-01 19:38:01 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2023-12-02 16:27:02 -0500 |
commit | c2e59da8865a8c5719b8ddaf5f68204729a8ebab (patch) | |
tree | 4a8c2eb24c4a274eac41a226df6679a6319b6ac4 /include | |
parent | b631e7a3d6a807aaf4919396b62ba96e1a9f0bd9 (diff) | |
download | serd-c2e59da8865a8c5719b8ddaf5f68204729a8ebab.tar.gz serd-c2e59da8865a8c5719b8ddaf5f68204729a8ebab.tar.bz2 serd-c2e59da8865a8c5719b8ddaf5f68204729a8ebab.zip |
Add SerdSink interface and hide implementations
Diffstat (limited to 'include')
-rw-r--r-- | include/serd/reader.h | 12 | ||||
-rw-r--r-- | include/serd/sink.h | 68 | ||||
-rw-r--r-- | include/serd/writer.h | 40 |
3 files changed, 73 insertions, 47 deletions
diff --git a/include/serd/reader.h b/include/serd/reader.h index 63c2c5ac..779505cf 100644 --- a/include/serd/reader.h +++ b/include/serd/reader.h @@ -29,13 +29,7 @@ typedef struct SerdReaderImpl SerdReader; /// Create a new RDF reader SERD_API SerdReader* SERD_ALLOCATED -serd_reader_new(SerdSyntax syntax, - void* SERD_NULLABLE handle, - void (*SERD_NULLABLE free_handle)(void* SERD_NULLABLE), - SerdBaseFunc SERD_NULLABLE base_func, - SerdPrefixFunc SERD_NULLABLE prefix_func, - SerdStatementFunc SERD_NULLABLE statement_func, - SerdEndFunc SERD_NULLABLE end_func); +serd_reader_new(SerdSyntax syntax, const SerdSink* SERD_NONNULL sink); /** Enable or disable strict parsing. @@ -58,10 +52,6 @@ serd_reader_set_error_sink(SerdReader* SERD_NONNULL reader, SerdErrorFunc SERD_NULLABLE error_func, void* SERD_NULLABLE error_handle); -/// Return the `handle` passed to serd_reader_new() -SERD_PURE_API void* SERD_NULLABLE -serd_reader_handle(const SerdReader* SERD_NONNULL reader); - /** Set a prefix to be added to all blank node identifiers. diff --git a/include/serd/sink.h b/include/serd/sink.h index 702197d5..f24db683 100644 --- a/include/serd/sink.h +++ b/include/serd/sink.h @@ -56,6 +56,74 @@ typedef SerdStatus (*SerdStatementFunc)(void* SERD_NULLABLE handle, typedef SerdStatus (*SerdEndFunc)(void* SERD_NULLABLE handle, const SerdNode* SERD_NONNULL node); +/// An interface that receives a stream of RDF data +typedef struct SerdSinkImpl SerdSink; + +/// Function to free an opaque handle +typedef void (*SerdFreeFunc)(void* SERD_NULLABLE ptr); + +/** + Create a new sink. + + Initially, the sink has no set functions and will do nothing. Use the + serd_sink_set_*_func functions to set handlers for various events. + + @param handle Opaque handle that will be passed to sink functions. + @param free_handle Free function to call on handle in serd_sink_free(). +*/ +SERD_API SerdSink* SERD_ALLOCATED +serd_sink_new(void* SERD_NULLABLE handle, + SerdFreeFunc SERD_NULLABLE free_handle); + +/// Free `sink` +SERD_API void +serd_sink_free(SerdSink* SERD_NULLABLE sink); + +/// Set a function to be called when the base URI changes +SERD_API SerdStatus +serd_sink_set_base_func(SerdSink* SERD_NONNULL sink, + SerdBaseFunc SERD_NULLABLE base_func); + +/// Set a function to be called when a namespace prefix is defined +SERD_API SerdStatus +serd_sink_set_prefix_func(SerdSink* SERD_NONNULL sink, + SerdPrefixFunc SERD_NULLABLE prefix_func); + +/// Set a function to be called when a statement is emitted +SERD_API SerdStatus +serd_sink_set_statement_func(SerdSink* SERD_NONNULL sink, + SerdStatementFunc SERD_NULLABLE statement_func); + +/// Set a function to be called when an anonymous node ends +SERD_API SerdStatus +serd_sink_set_end_func(SerdSink* SERD_NONNULL sink, + SerdEndFunc SERD_NULLABLE end_func); + +/// Set the base URI +SERD_API SerdStatus +serd_sink_write_base(const SerdSink* SERD_NONNULL sink, + const SerdNode* SERD_NONNULL uri); + +/// Set a namespace prefix +SERD_API SerdStatus +serd_sink_write_prefix(const SerdSink* SERD_NONNULL sink, + const SerdNode* SERD_NONNULL name, + const SerdNode* SERD_NONNULL uri); + +/// Write a statement from individual nodes +SERD_API SerdStatus +serd_sink_write(const SerdSink* SERD_NONNULL sink, + SerdStatementFlags flags, + const SerdNode* SERD_NONNULL subject, + const SerdNode* SERD_NONNULL predicate, + const SerdNode* SERD_NONNULL object, + const SerdNode* SERD_NULLABLE graph); + +/// Mark the end of an anonymous node +SERD_API SerdStatus +serd_sink_write_end(const SerdSink* SERD_NONNULL sink, + const SerdNode* SERD_NONNULL node); + /** @} */ diff --git a/include/serd/writer.h b/include/serd/writer.h index 94747309..5f1d0535 100644 --- a/include/serd/writer.h +++ b/include/serd/writer.h @@ -8,7 +8,7 @@ #include "serd/env.h" #include "serd/error.h" #include "serd/node.h" -#include "serd/statement.h" +#include "serd/sink.h" #include "serd/status.h" #include "serd/stream.h" #include "serd/syntax.h" @@ -57,9 +57,9 @@ serd_writer_new(SerdSyntax syntax, SERD_API void serd_writer_free(SerdWriter* SERD_NULLABLE writer); -/// Return the env used by `writer` -SERD_PURE_API SerdEnv* SERD_NONNULL -serd_writer_env(SerdWriter* SERD_NONNULL writer); +/// Return a sink interface that emits statements via `writer` +SERD_CONST_API const SerdSink* SERD_NONNULL +serd_writer_sink(SerdWriter* SERD_NONNULL writer); /** Set a function to be called when errors occur during writing. @@ -106,38 +106,6 @@ serd_writer_set_root_uri(SerdWriter* SERD_NONNULL writer, const SerdNode* SERD_NULLABLE uri); /** - Set a namespace prefix (and emit directive if applicable). - - Note this function can be safely casted to #SerdPrefixFunc. -*/ -SERD_API SerdStatus -serd_writer_set_prefix(SerdWriter* SERD_NONNULL writer, - const SerdNode* SERD_NONNULL name, - const SerdNode* SERD_NONNULL uri); - -/** - Write a statement. - - Note this function can be safely casted to #SerdStatementFunc. -*/ -SERD_API SerdStatus -serd_writer_write_statement(SerdWriter* SERD_NONNULL writer, - SerdStatementFlags flags, - const SerdNode* SERD_NULLABLE graph, - const SerdNode* SERD_NONNULL subject, - const SerdNode* SERD_NONNULL predicate, - const SerdNode* SERD_NONNULL object); - -/** - Mark the end of an anonymous node's description. - - Note this function can be safely casted to #SerdEndFunc. -*/ -SERD_API SerdStatus -serd_writer_end_anon(SerdWriter* SERD_NONNULL writer, - const SerdNode* SERD_NULLABLE node); - -/** Finish a write. This flushes any pending output, for example terminating punctuation, so |