2.8 Reader

typedef struct SerdReaderImpl SerdReader

Streaming parser that reads a text stream and writes to a statement sink.

SerdReader *serd_reader_new(SerdSyntax syntax, void *handle, void (*free_handle)(void*), SerdBaseSink base_sink, SerdPrefixSink prefix_sink, SerdStatementSink statement_sink, SerdEndSink end_sink)

Create a new RDF reader.

void serd_reader_set_strict(SerdReader *reader, bool strict)

Enable or disable strict parsing.

The reader is non-strict (lax) by default, which will tolerate URIs with invalid characters. Setting strict will fail when parsing such files. An error is printed for invalid input in either case.

void serd_reader_set_error_sink(SerdReader *reader, SerdErrorSink error_sink, void *error_handle)

Set a function to be called when errors occur during reading.

The error_sink will be called with handle as its first argument. If no error function is set, errors are printed to stderr in GCC style.

void *serd_reader_get_handle(const SerdReader *reader)

Return the handle passed to serd_reader_new()

void serd_reader_add_blank_prefix(SerdReader *reader, const uint8_t *prefix)

Set a prefix to be added to all blank node identifiers.

This is useful when multiple files are to be parsed into the same output (a model or a file). Since Serd preserves blank node IDs, this could cause conflicts where two non-equivalent blank nodes are merged, resulting in corrupt data. By setting a unique blank node prefix for each parsed file, this can be avoided, while preserving blank node names.

void serd_reader_set_default_graph(SerdReader *reader, const SerdNode *graph)

Set the URI of the default graph.

If this is set, the reader will emit quads with the graph set to the given node for any statements that are not in a named graph (which is currently all of them since Serd currently does not support any graph syntaxes).

SerdStatus serd_reader_read_file(SerdReader *reader, const uint8_t *uri)

Read a file at a given uri

SerdStatus serd_reader_start_stream(SerdReader *reader, FILE *file, const uint8_t *name, bool bulk)

Start an incremental read from a file handle.

Iff bulk is true, file will be read a page at a time. This is more efficient, but uses a page of memory and means that an entire page of input must be ready before any callbacks will fire. To react as soon as input arrives, set bulk to false.

SerdStatus serd_reader_start_source_stream(SerdReader *reader, SerdSource read_func, SerdStreamErrorFunc error_func, void *stream, const uint8_t *name, size_t page_size)

Start an incremental read from a user-specified source.

The read_func is guaranteed to only be called for page_size elements with size 1 (i.e. page_size bytes).

SerdStatus serd_reader_read_chunk(SerdReader *reader)

Read a single “chunk” of data during an incremental read.

This function will read a single top level description, and return. This may be a directive, statement, or several statements; essentially it reads until a ‘.’ is encountered. This is particularly useful for reading directly from a pipe or socket.

SerdStatus serd_reader_end_stream(SerdReader *reader)

Finish an incremental read from a file handle.

SerdStatus serd_reader_read_file_handle(SerdReader *reader, FILE *file, const uint8_t *name)

Read file

SerdStatus serd_reader_read_source(SerdReader *reader, SerdSource source, SerdStreamErrorFunc error, void *stream, const uint8_t *name, size_t page_size)

Read a user-specified byte source.

SerdStatus serd_reader_read_string(SerdReader *reader, const uint8_t *utf8)

Read utf8

SerdStatus serd_reader_skip_until_byte(SerdReader *reader, uint8_t byte)

Skip over bytes in the input until a specific byte is encountered.

Typically used for recording from errors in a line-based syntax by skipping ahead to the next newline.

Returns:

SerdStatus.SERD_SUCCESS if the given byte was reached, or SerdStatus.SERD_FAILURE if the end of input is reached.

void serd_reader_free(SerdReader *reader)

Free reader