diff options
author | David Robillard <d@drobilla.net> | 2021-02-25 11:16:13 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2022-01-14 19:37:51 -0500 |
commit | 4436f80225c441a878c4baf856d21dee0394c8dc (patch) | |
tree | 707757fd8544595a8c6fa423c72e7a5fe5c2d6be /src | |
parent | 17003e707a3368a029dd8c0e7bdf98979f691daf (diff) | |
download | serd-4436f80225c441a878c4baf856d21dee0394c8dc.tar.gz serd-4436f80225c441a878c4baf856d21dee0394c8dc.tar.bz2 serd-4436f80225c441a878c4baf856d21dee0394c8dc.zip |
Leave statement caret at the start of literals
This allows a precise location to be reported for errors within literals, by
adding the offset of the error in the literal to the caret. This will be used
to report nice errors for things like regular expressions and supported XSD
datatypes.
Diffstat (limited to 'src')
-rw-r--r-- | src/n3.c | 5 | ||||
-rw-r--r-- | src/reader.c | 17 | ||||
-rw-r--r-- | src/reader.h | 6 |
3 files changed, 23 insertions, 5 deletions
@@ -15,6 +15,7 @@ */ #include "byte_source.h" +#include "caret.h" #include "env.h" #include "namespaces.h" #include "node.h" @@ -732,6 +733,7 @@ read_object(SerdReader* const reader, bool* const ate_dot) { const size_t orig_stack_size = reader->stack.size; + SerdCaret orig_caret = reader->source->caret; assert(ctx->subject); @@ -782,6 +784,7 @@ read_object(SerdReader* const reader, break; case '\"': case '\'': + ++orig_caret.col; st = read_literal(reader, &o, ate_dot); break; default: @@ -790,7 +793,7 @@ read_object(SerdReader* const reader, } if (!st && simple && o) { - st = emit_statement(reader, *ctx, o); + st = emit_statement_at(reader, *ctx, o, &orig_caret); } serd_stack_pop_to(&reader->stack, orig_stack_size); diff --git a/src/reader.c b/src/reader.c index 6ce40452..5afc28ff 100644 --- a/src/reader.c +++ b/src/reader.c @@ -154,9 +154,10 @@ push_node(SerdReader* const reader, } SerdStatus -emit_statement(SerdReader* const reader, - const ReadContext ctx, - SerdNode* const o) +emit_statement_at(SerdReader* const reader, + const ReadContext ctx, + SerdNode* const o, + SerdCaret* const caret) { if (reader->stack.size + (2 * sizeof(SerdNode)) > reader->stack.buf_size) { return SERD_ERR_OVERFLOW; @@ -167,7 +168,7 @@ emit_statement(SerdReader* const reader, serd_node_zero_pad(o); const SerdStatement statement = {{ctx.subject, ctx.predicate, o, ctx.graph}, - &reader->source->caret}; + caret}; const SerdStatus st = serd_sink_write_statement(reader->sink, *ctx.flags, &statement); @@ -176,6 +177,14 @@ emit_statement(SerdReader* const reader, return st; } +SerdStatus +emit_statement(SerdReader* const reader, + const ReadContext ctx, + SerdNode* const o) +{ + return emit_statement_at(reader, ctx, o, &reader->source->caret); +} + static SerdStatus read_statement(SerdReader* const reader) { diff --git a/src/reader.h b/src/reader.h index 30fd69a9..23d38009 100644 --- a/src/reader.h +++ b/src/reader.h @@ -95,6 +95,12 @@ void set_blank_id(SerdReader* reader, SerdNode* node, size_t buf_size); SerdStatus +emit_statement_at(SerdReader* reader, + ReadContext ctx, + SerdNode* o, + SerdCaret* caret); + +SerdStatus emit_statement(SerdReader* reader, ReadContext ctx, SerdNode* o); SerdStatus |