aboutsummaryrefslogtreecommitdiffstats
path: root/src/reader.h
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2020-08-14 15:51:12 +0200
committerDavid Robillard <d@drobilla.net>2020-08-14 19:07:52 +0200
commit3f5ba5908117cf3351702c144a2509f4bf48d75b (patch)
tree3b0434d1ee5a6749ea1d4b5fecc7492b0272bbd0 /src/reader.h
parent45cdfed515dbbcb85c6d54076b6103788d097400 (diff)
downloadserd-3f5ba5908117cf3351702c144a2509f4bf48d75b.tar.gz
serd-3f5ba5908117cf3351702c144a2509f4bf48d75b.tar.bz2
serd-3f5ba5908117cf3351702c144a2509f4bf48d75b.zip
Clean up and separate internal headers
Diffstat (limited to 'src/reader.h')
-rw-r--r--src/reader.h94
1 files changed, 93 insertions, 1 deletions
diff --git a/src/reader.h b/src/reader.h
index adea6651..1b0a80c2 100644
--- a/src/reader.h
+++ b/src/reader.h
@@ -14,7 +14,11 @@
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "serd_internal.h"
+#ifndef SERD_READER_H
+#define SERD_READER_H
+
+#include "byte_source.h"
+#include "stack.h"
#include "serd/serd.h"
@@ -23,6 +27,92 @@
#include <stdint.h>
#include <stdio.h>
+#if defined(__GNUC__)
+# define SERD_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1)))
+#else
+# define SERD_LOG_FUNC(fmt, arg1)
+#endif
+
+SERD_LOG_FUNC(3, 4)
+int
+r_err(SerdReader* reader, SerdStatus st, const char* fmt, ...);
+
+#ifdef SERD_STACK_CHECK
+# define SERD_STACK_ASSERT_TOP(reader, ref) \
+ assert(ref == reader->allocs[reader->n_allocs - 1]);
+#else
+# define SERD_STACK_ASSERT_TOP(reader, ref)
+#endif
+
+/* Reference to a node in the stack (we can not use pointers since the
+ stack may be reallocated, invalidating any pointers to elements).
+*/
+typedef size_t Ref;
+
+typedef struct {
+ Ref graph;
+ Ref subject;
+ Ref predicate;
+ Ref object;
+ Ref datatype;
+ Ref lang;
+ SerdStatementFlags* flags;
+} ReadContext;
+
+struct SerdReaderImpl {
+ void* handle;
+ void (*free_handle)(void* ptr);
+ SerdBaseSink base_sink;
+ SerdPrefixSink prefix_sink;
+ SerdStatementSink statement_sink;
+ SerdEndSink end_sink;
+ SerdErrorSink error_sink;
+ void* error_handle;
+ Ref rdf_first;
+ Ref rdf_rest;
+ Ref rdf_nil;
+ SerdNode default_graph;
+ SerdByteSource source;
+ SerdStack stack;
+ SerdSyntax syntax;
+ unsigned next_id;
+ SerdStatus status;
+ uint8_t* buf;
+ uint8_t* bprefix;
+ size_t bprefix_len;
+ bool strict; ///< True iff strict parsing
+ bool seen_genid;
+#ifdef SERD_STACK_CHECK
+ Ref* allocs; ///< Stack of push offsets
+ size_t n_allocs; ///< Number of stack pushes
+#endif
+};
+
+Ref push_node_padded(SerdReader* reader,
+ size_t maxlen,
+ SerdType type,
+ const char* str,
+ size_t n_bytes);
+
+Ref push_node(SerdReader* reader,
+ SerdType type,
+ const char* str,
+ size_t n_bytes);
+
+size_t genid_size(SerdReader* reader);
+Ref blank_id(SerdReader* reader);
+void set_blank_id(SerdReader* reader, Ref ref, size_t buf_size);
+
+SerdNode* deref(SerdReader* reader, Ref ref);
+
+Ref pop_node(SerdReader* reader, Ref ref);
+
+bool emit_statement(SerdReader* reader, ReadContext ctx, Ref o, Ref d, Ref l);
+
+bool read_n3_statement(SerdReader* reader);
+bool read_nquadsDoc(SerdReader* reader);
+bool read_turtleTrigDoc(SerdReader* reader);
+
static inline int
peek_byte(SerdReader* reader)
{
@@ -97,3 +187,5 @@ push_bytes(SerdReader* reader, Ref ref, const uint8_t* bytes, unsigned len)
push_byte(reader, ref, bytes[i]);
}
}
+
+#endif // SERD_READER_H