diff options
author | David Robillard <d@drobilla.net> | 2020-08-14 16:05:10 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2022-01-13 22:59:16 -0500 |
commit | bfece96cead96fdcdb11567f1cf031edc3f53a8b (patch) | |
tree | 228f67721acb76714dc7bea7c6de741e9f70307e /src/n3.c | |
parent | 045c52b442a48c0ef9002539f63854eb198acadd (diff) | |
download | serd-bfece96cead96fdcdb11567f1cf031edc3f53a8b.tar.gz serd-bfece96cead96fdcdb11567f1cf031edc3f53a8b.tar.bz2 serd-bfece96cead96fdcdb11567f1cf031edc3f53a8b.zip |
Merge datatype/language into node
This moves closer to the sord API, and is more convenient in most cases.
Diffstat (limited to 'src/n3.c')
-rw-r--r-- | src/n3.c | 37 |
1 files changed, 19 insertions, 18 deletions
@@ -854,10 +854,11 @@ read_0_9(SerdReader* const reader, const Ref str, const bool at_least_one) } static SerdStatus -read_number(SerdReader* const reader, - Ref* const dest, - Ref* const datatype, - bool* const ate_dot) +read_number(SerdReader* const reader, + Ref* const dest, + Ref* const datatype, + SerdNodeFlags* const flags, + bool* const ate_dot) { #define XSD_DECIMAL NS_XSD "decimal" #define XSD_DOUBLE NS_XSD "double" @@ -916,6 +917,10 @@ read_number(SerdReader* const reader, push_node(reader, SERD_URI, XSD_INTEGER, sizeof(XSD_INTEGER) - 1); } + if (*datatype) { + *flags |= SERD_HAS_DATATYPE; + } + return SERD_SUCCESS; } @@ -950,6 +955,7 @@ read_literal(SerdReader* const reader, switch (peek_byte(reader)) { case '@': eat_byte_safe(reader, '@'); + *flags |= SERD_HAS_LANGUAGE; if ((st = read_LANGTAG(reader, lang))) { *datatype = pop_node(reader, *datatype); *lang = pop_node(reader, *lang); @@ -960,6 +966,7 @@ read_literal(SerdReader* const reader, case '^': eat_byte_safe(reader, '^'); eat_byte_check(reader, '^'); + *flags |= SERD_HAS_DATATYPE; if ((st = read_iri(reader, datatype, ate_dot))) { *datatype = pop_node(reader, *datatype); *lang = pop_node(reader, *lang); @@ -968,7 +975,6 @@ read_literal(SerdReader* const reader, } break; } - return SERD_SUCCESS; } @@ -1079,7 +1085,7 @@ read_anon(SerdReader* const reader, SerdStatus st = SERD_SUCCESS; if (ctx.subject) { - TRY(st, emit_statement(reader, ctx, *dest, 0, 0)); + TRY(st, emit_statement(reader, ctx, *dest)); } ctx.subject = *dest; @@ -1088,21 +1094,17 @@ read_anon(SerdReader* const reader, 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->end_func) { reader->end_func(reader->handle, deref(reader, *dest)); } - *ctx.flags = old_flags; } - return (eat_byte_check(reader, ']') == ']') ? SERD_SUCCESS : SERD_ERR_BAD_SYNTAX; } @@ -1175,7 +1177,7 @@ read_object(SerdReader* const reader, case '7': case '8': case '9': - ret = read_number(reader, &o, &datatype, ate_dot); + ret = read_number(reader, &o, &datatype, &flags, ate_dot); break; case '\"': case '\'': @@ -1191,6 +1193,7 @@ read_object(SerdReader* const reader, node = deref(reader, o); if ((node->length == 4 && !memcmp(serd_node_string(node), "true", 4)) || (node->length == 5 && !memcmp(serd_node_string(node), "false", 5))) { + flags = flags | SERD_HAS_DATATYPE; node->type = SERD_LITERAL; datatype = push_node(reader, SERD_URI, XSD_BOOLEAN, XSD_BOOLEAN_LEN); ret = SERD_SUCCESS; @@ -1210,7 +1213,7 @@ read_object(SerdReader* const reader, } if (!ret && emit && simple) { - ret = emit_statement(reader, *ctx, o, datatype, lang); + ret = emit_statement(reader, *ctx, o); } else if (!ret && !emit) { ctx->object = o; ctx->datatype = datatype; @@ -1306,14 +1309,12 @@ read_collection(SerdReader* const reader, ReadContext ctx, Ref* const dest) { SerdStatus st = SERD_SUCCESS; eat_byte_safe(reader, '('); - bool end = peek_delim(reader, ')'); - - *dest = end ? reader->rdf_nil : blank_id(reader); + *dest = end ? reader->rdf_nil : blank_id(reader); if (ctx.subject) { // subject predicate _:head *ctx.flags |= (end ? 0 : SERD_LIST_O_BEGIN); - TRY(st, emit_statement(reader, ctx, *dest, 0, 0)); + TRY(st, emit_statement(reader, ctx, *dest)); *ctx.flags |= SERD_LIST_CONT; } else { *ctx.flags |= (end ? 0 : SERD_LIST_S_BEGIN); @@ -1352,7 +1353,7 @@ read_collection(SerdReader* const reader, ReadContext ctx, Ref* const 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), 0, 0)); + TRY(st, emit_statement(reader, ctx, (end ? reader->rdf_nil : rest))); ctx.subject = rest; // _:node = _:rest rest = node; // _:rest = (old)_:node @@ -1733,7 +1734,7 @@ read_nquadsDoc(SerdReader* const reader) } } - TRY(st, emit_statement(reader, ctx, ctx.object, ctx.datatype, ctx.lang)); + TRY(st, emit_statement(reader, ctx, ctx.object)); pop_node(reader, ctx.graph); pop_node(reader, ctx.lang); |