diff options
Diffstat (limited to 'src/n3.c')
-rw-r--r-- | src/n3.c | 48 |
1 files changed, 23 insertions, 25 deletions
@@ -224,6 +224,11 @@ read_utf8_character(SerdReader* const reader, uint32_t size = 0; uint8_t bytes[4] = {0, 0, 0, 0}; SerdStatus st = read_utf8_bytes(reader, bytes, &size, c); + + if (!tolerate_status(reader, st)) { + return st; + } + if (st) { const SerdStatus rst = push_bytes(reader, dest, replacement_char, 3); return rst ? rst : st; @@ -343,8 +348,7 @@ read_STRING_LITERAL_LONG(SerdReader* const reader, const uint8_t q) { SerdStatus st = SERD_SUCCESS; - - while (!(st && reader->strict)) { + while (tolerate_status(reader, st)) { const int c = peek_byte(reader); if (c == '\\') { eat_byte_safe(reader, c); @@ -353,6 +357,8 @@ read_STRING_LITERAL_LONG(SerdReader* const reader, (st = read_UCHAR(reader, ref, &code))) { return r_err(reader, st, "invalid escape `\\%c'\n", peek_byte(reader)); } + } else if (c == EOF) { + st = r_err(reader, SERD_ERR_NO_DATA, "unexpected end of file\n"); } else if (c == q) { eat_byte_safe(reader, q); const int q2 = eat_byte_safe(reader, peek_byte(reader)); @@ -365,14 +371,12 @@ read_STRING_LITERAL_LONG(SerdReader* const reader, if (!(st = push_byte(reader, ref, c))) { st = read_character(reader, ref, (uint8_t)q2); } - } else if (c == EOF) { - return r_err(reader, SERD_ERR_BAD_SYNTAX, "end of file in long string\n"); } else { st = read_character(reader, ref, (uint8_t)eat_byte_safe(reader, c)); } } - return (st && reader->strict) ? st : SERD_SUCCESS; + return tolerate_status(reader, st) ? SERD_SUCCESS : st; } // STRING_LITERAL_QUOTE and STRING_LITERAL_SINGLE_QUOTE @@ -384,7 +388,7 @@ read_STRING_LITERAL(SerdReader* const reader, { SerdStatus st = SERD_SUCCESS; - while (!(st && reader->strict)) { + while (tolerate_status(reader, st)) { const int c = peek_byte(reader); uint32_t code = 0; switch (c) { @@ -403,14 +407,15 @@ read_STRING_LITERAL(SerdReader* const reader, break; default: if (c == q) { - return eat_byte_check(reader, q); + eat_byte_safe(reader, q); + return SERD_SUCCESS; } else { st = read_character(reader, ref, (uint8_t)eat_byte_safe(reader, c)); } } } - return st ? st : eat_byte_check(reader, q); + return tolerate_status(reader, st) ? SERD_SUCCESS : st; } static SerdStatus @@ -794,15 +799,13 @@ read_IRIREF(SerdReader* const reader, SerdNode** const dest) } } else if (!(c & 0x80)) { st = push_byte(reader, *dest, c); - } else if (read_utf8_character(reader, *dest, (uint8_t)c)) { - if (reader->strict) { - return SERD_ERR_BAD_SYNTAX; - } + } else { + st = read_utf8_character(reader, *dest, (uint8_t)c); } } } - return st; + return tolerate_status(reader, st) ? SERD_SUCCESS : st; } static SerdStatus @@ -1057,7 +1060,7 @@ read_BLANK_NODE_LABEL(SerdReader* const reader, } } - return SERD_SUCCESS; + return tolerate_status(reader, st) ? SERD_SUCCESS : st; } static SerdStatus @@ -1093,10 +1096,7 @@ read_anon(SerdReader* const reader, ctx.subject = *dest; if (!empty) { bool ate_dot_in_list = false; - st = read_predicateObjectList(reader, ctx, &ate_dot_in_list); - if (st > SERD_FAILURE) { - return st; - } + TRY(st, read_predicateObjectList(reader, ctx, &ate_dot_in_list)); if (ate_dot_in_list) { return r_err(reader, SERD_ERR_BAD_SYNTAX, "`.' inside blank\n"); @@ -1238,7 +1238,7 @@ read_objectList(SerdReader* const reader, ReadContext ctx, bool* const ate_dot) reader, SERD_ERR_BAD_SYNTAX, "syntax does not support abbreviation\n"); } - while (!*ate_dot && eat_delim(reader, ',')) { + while (st <= SERD_FAILURE && !*ate_dot && eat_delim(reader, ',')) { st = read_object(reader, &ctx, true, ate_dot); } @@ -1681,7 +1681,7 @@ read_turtleTrigDoc(SerdReader* const reader) const size_t orig_stack_size = reader->stack.size; const SerdStatus st = read_n3_statement(reader); if (st > SERD_FAILURE) { - if (reader->strict) { + if (!tolerate_status(reader, st)) { serd_stack_pop_to(&reader->stack, orig_stack_size); return st; } @@ -1698,7 +1698,7 @@ SerdStatus read_nquadsDoc(SerdReader* const reader) { SerdStatus st = SERD_SUCCESS; - while (!reader->source.eof) { + while (!st && !reader->source.eof) { const size_t orig_stack_size = reader->stack.size; SerdStatementFlags flags = 0; @@ -1741,12 +1741,10 @@ read_nquadsDoc(SerdReader* const reader) TRY(st, eat_byte_check(reader, '.')); } - TRY(st, emit_statement(reader, ctx, ctx.object)); - + st = emit_statement(reader, ctx, ctx.object); serd_stack_pop_to(&reader->stack, orig_stack_size); } - - return SERD_SUCCESS; + return st; } #if defined(__clang__) && __clang_major__ >= 10 |