aboutsummaryrefslogtreecommitdiffstats
path: root/src/n3.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/n3.c')
-rw-r--r--src/n3.c25
1 files changed, 10 insertions, 15 deletions
diff --git a/src/n3.c b/src/n3.c
index 61c6c9e6..b5195087 100644
--- a/src/n3.c
+++ b/src/n3.c
@@ -944,7 +944,7 @@ read_anon(SerdReader* reader, ReadContext ctx, bool subject, SerdNode** dest)
bool empty;
eat_byte_safe(reader, '[');
if ((empty = peek_delim(reader, ']'))) {
- *ctx.flags |= (subject) ? SERD_EMPTY_S : SERD_EMPTY_O;
+ *ctx.flags |= (subject) ? SERD_EMPTY_S : SERD_ANON_O_BEGIN;
} else {
*ctx.flags |= (subject) ? SERD_ANON_S_BEGIN : SERD_ANON_O_BEGIN;
if (peek_delim(reader, '=')) {
@@ -966,21 +966,19 @@ read_anon(SerdReader* reader, ReadContext ctx, bool subject, SerdNode** dest)
ctx.subject = *dest;
if (!empty) {
- *ctx.flags &= ~(unsigned)SERD_LIST_CONT;
- if (!subject) {
- *ctx.flags |= SERD_ANON_CONT;
- }
bool ate_dot_in_list = false;
read_predicateObjectList(reader, ctx, &ate_dot_in_list);
if (ate_dot_in_list) {
return r_err(reader, SERD_ERR_BAD_SYNTAX, "`.' inside blank\n");
}
read_ws_star(reader);
- if (reader->sink->end) {
- reader->sink->end(reader->sink->handle, *dest);
- }
*ctx.flags = old_flags;
}
+
+ if (reader->sink->end && (!subject || !empty)) {
+ reader->sink->end(reader->sink->handle, *dest);
+ }
+
return (eat_byte_check(reader, ']') == ']') ? SERD_SUCCESS
: SERD_ERR_BAD_SYNTAX;
}
@@ -1131,9 +1129,8 @@ read_predicateObjectList(SerdReader* reader, ReadContext ctx, bool* ate_dot)
}
static SerdStatus
-end_collection(SerdReader* reader, ReadContext ctx, SerdStatus st)
+end_collection(SerdReader* reader, SerdStatus st)
{
- *ctx.flags &= ~(unsigned)SERD_LIST_CONT;
if (!st) {
eat_byte_safe(reader, ')');
}
@@ -1151,13 +1148,12 @@ read_collection(SerdReader* reader, ReadContext ctx, SerdNode** dest)
// subject predicate _:head
*ctx.flags |= (end ? 0 : SERD_LIST_O_BEGIN);
TRY(st, emit_statement(reader, ctx, *dest));
- *ctx.flags |= SERD_LIST_CONT;
} else {
*ctx.flags |= (end ? 0 : SERD_LIST_S_BEGIN);
}
if (end) {
- return end_collection(reader, ctx, st);
+ return end_collection(reader, st);
}
/* The order of node allocation here is necessarily not in stack order,
@@ -1177,7 +1173,7 @@ read_collection(SerdReader* reader, ReadContext ctx, SerdNode** dest)
ctx.predicate = reader->rdf_first;
bool ate_dot = false;
if ((st = read_object(reader, &ctx, true, &ate_dot)) || ate_dot) {
- return end_collection(reader, ctx, SERD_FAILURE);
+ return end_collection(reader, SERD_FAILURE);
}
if (!(end = peek_delim(reader, ')'))) {
@@ -1191,7 +1187,6 @@ read_collection(SerdReader* reader, ReadContext ctx, SerdNode** dest)
}
// _:node rdf:rest _:rest
- *ctx.flags |= SERD_LIST_CONT;
ctx.predicate = reader->rdf_rest;
TRY(st, emit_statement(reader, ctx, (end ? reader->rdf_nil : rest)));
@@ -1200,7 +1195,7 @@ read_collection(SerdReader* reader, ReadContext ctx, SerdNode** dest)
node = ctx.subject; // invariant
}
- return end_collection(reader, ctx, st);
+ return end_collection(reader, st);
}
static SerdStatus