Browse Source

Set SERD_HAS_NEWLINE and SERD_HAS_QUOTE flags when unescaped newlines or quotes are read.

Don't escape legal ASCII characters when writing long literals.


git-svn-id: http://svn.drobilla.net/serd/trunk@439 490d8e77-9747-427b-9fa3-0b8f29cee8a0
zrythm_meson
David Robillard 10 years ago
parent
commit
0c9f5eb2ee
  1. 16
      src/reader.c
  2. 18
      src/writer.c
  3. 1
      tests/good/test-backspace.nt
  4. 5
      tests/good/test-backspace.ttl

16
src/reader.c

@ -436,9 +436,17 @@ read_utf8_character(SerdReader* reader, Ref dest, uint8_t c) @@ -436,9 +436,17 @@ read_utf8_character(SerdReader* reader, Ref dest, uint8_t c)
// Read one character (possibly multi-byte)
// The first byte, c, has already been eaten by caller
static inline SerdStatus
read_character(SerdReader* reader, Ref dest, uint8_t c)
read_character(SerdReader* reader, Ref dest, SerdNodeFlags* flags, uint8_t c)
{
if (!(c & 0x80)) {
switch (c) {
case 0xA: case 0xD:
*flags |= SERD_HAS_NEWLINE;
break;
case '"': case '\'':
*flags |= SERD_HAS_QUOTE;
break;
}
push_byte(reader, dest, c);
return SERD_SUCCESS;
} else {
@ -533,10 +541,10 @@ read_STRING_LITERAL_LONG(SerdReader* reader, SerdNodeFlags* flags, uint8_t q) @@ -533,10 +541,10 @@ read_STRING_LITERAL_LONG(SerdReader* reader, SerdNodeFlags* flags, uint8_t q)
} else {
*flags |= SERD_HAS_QUOTE;
push_byte(reader, ref, c);
read_character(reader, ref, q2);
read_character(reader, ref, flags, q2);
}
} else {
read_character(reader, ref, eat_byte_safe(reader, c));
read_character(reader, ref, flags, eat_byte_safe(reader, c));
}
}
}
@ -568,7 +576,7 @@ read_STRING_LITERAL(SerdReader* reader, SerdNodeFlags* flags, uint8_t q) @@ -568,7 +576,7 @@ read_STRING_LITERAL(SerdReader* reader, SerdNodeFlags* flags, uint8_t q)
eat_byte_check(reader, q);
return ref;
} else {
read_character(reader, ref, eat_byte_safe(reader, c));
read_character(reader, ref, flags, eat_byte_safe(reader, c));
}
}
}

18
src/writer.c

@ -284,10 +284,20 @@ write_text(SerdWriter* writer, TextContext ctx, @@ -284,10 +284,20 @@ write_text(SerdWriter* writer, TextContext ctx,
uint8_t in = utf8[i++];
if (ctx == WRITE_LONG_STRING) {
if (in == '\\') {
len += sink("\\\\", 2, writer); continue;
} else if (in == '\"' && i == n_bytes) {
len += sink("\\\"", 2, writer); continue; // '"' at string end
switch (in) {
case '\\': len += sink("\\\\", 2, writer); continue;
case '\b': len += sink("\\b", 2, writer); continue;
case '\n': case '\r': case '\t': case '\f':
len += sink(&in, 1, writer); // Write character as-is
continue;
case '\"':
if (i == n_bytes) { // '"' at string end
len += sink("\\\"", 2, writer);
} else {
len += sink(&in, 1, writer);
}
continue;
default: break;
}
} else if (ctx == WRITE_STRING) {
switch (in) {

1
tests/good/test-backspace.nt

@ -1,2 +1,3 @@ @@ -1,2 +1,3 @@
<http://example.org/thing> <http://example.org/label> "\b" .
<http://example.org/thing> <http://example.org/label> "\b" .
<http://example.org/thing> <http://example.org/label> "\n\b\n" .

5
tests/good/test-backspace.ttl

@ -1,2 +1,5 @@ @@ -1,2 +1,5 @@
<http://example.org/thing> <http://example.org/label> "\u0008" .
<http://example.org/thing> <http://example.org/label> "" .
<http://example.org/thing> <http://example.org/label> "" .
<http://example.org/thing> <http://example.org/label> """

""" .
Loading…
Cancel
Save