diff options
Diffstat (limited to 'src/reader.c')
-rw-r--r-- | src/reader.c | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/src/reader.c b/src/reader.c index aa24a9ca..98500fcd 100644 --- a/src/reader.c +++ b/src/reader.c @@ -4,10 +4,11 @@ #include "reader.h" #include "byte_source.h" +#include "serd_internal.h" #include "stack.h" #include "system.h" -#include "serd_internal.h" +#include <serd/serd.h> #include <assert.h> #include <errno.h> @@ -29,6 +30,17 @@ r_err(SerdReader* const reader, const SerdStatus st, const char* const fmt, ...) return st; } +SerdStatus +r_err_char(SerdReader* const reader, const char* const kind, const int c) +{ + const SerdStatus st = SERD_ERR_BAD_SYNTAX; + + return (c < 0x20 || c == 0x7F) ? r_err(reader, st, "bad %s character\n", kind) + : (c == '\'' || c >= 0x80) + ? r_err(reader, st, "bad %s character U+%04X\n", kind, (uint32_t)c) + : r_err(reader, st, "bad %s character '%c'\n", kind, c); +} + void set_blank_id(SerdReader* const reader, const Ref ref, const size_t buf_size) { @@ -90,12 +102,16 @@ push_node_padded(SerdReader* const reader, uint8_t* buf = (uint8_t*)(node + 1); memcpy(buf, str, n_bytes + 1); + const Ref ref = (Ref)((uint8_t*)node - reader->stack.buf); + #ifdef SERD_STACK_CHECK - reader->allocs = (Ref*)realloc(reader->allocs, + reader->allocs = (Ref*)realloc(reader->allocs, sizeof(reader->allocs) * (++reader->n_allocs)); - reader->allocs[reader->n_allocs - 1] = ((uint8_t*)mem - reader->stack.buf); + + reader->allocs[reader->n_allocs - 1] = ref; #endif - return (Ref)((uint8_t*)node - reader->stack.buf); + + return ref; } Ref @@ -118,6 +134,14 @@ deref(SerdReader* const reader, const Ref ref) return NULL; } +bool +pop_last_node_char(SerdReader* const reader, SerdNode* const node) +{ + --node->n_bytes; + serd_stack_pop(&reader->stack, 1); + return true; +} + Ref pop_node(SerdReader* const reader, const Ref ref) { @@ -127,8 +151,9 @@ pop_node(SerdReader* const reader, const Ref ref) SERD_STACK_ASSERT_TOP(reader, ref); --reader->n_allocs; #endif - SerdNode* const node = deref(reader, ref); - uint8_t* const top = reader->stack.buf + reader->stack.size; + SerdNode* const node = deref(reader, ref); + const uint8_t* const top = reader->stack.buf + reader->stack.size; + assert(top > (uint8_t*)node); serd_stack_pop_aligned(&reader->stack, (size_t)(top - (uint8_t*)node)); } return 0; |