aboutsummaryrefslogtreecommitdiffstats
path: root/src/writer.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-05-01 14:34:42 +0200
committerDavid Robillard <d@drobilla.net>2018-05-27 18:21:57 +0200
commitb5eeb621520d9c0c2647bfa1bfb53045a75a8b6e (patch)
tree7fdd27ad8b0e9552be7314039c544ed0ffdef735 /src/writer.c
parentaa41376304f135bfc54d2b5c16fa8ecd7302ad24 (diff)
downloadserd-b5eeb621520d9c0c2647bfa1bfb53045a75a8b6e.tar.gz
serd-b5eeb621520d9c0c2647bfa1bfb53045a75a8b6e.tar.bz2
serd-b5eeb621520d9c0c2647bfa1bfb53045a75a8b6e.zip
Remove syntax assumptions from SerdEnv implementation
Diffstat (limited to 'src/writer.c')
-rw-r--r--src/writer.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/writer.c b/src/writer.c
index e14814bb..f75c23a0 100644
--- a/src/writer.c
+++ b/src/writer.c
@@ -486,6 +486,19 @@ write_literal(SerdWriter* writer,
return true;
}
+// Return true iff `buf` is a valid prefixed name suffix
+static inline bool
+is_name(const char* buf, const size_t len)
+{
+ // TODO: This is more strict than it should be.
+ for (size_t i = 0; i < len; ++i) {
+ if (!(is_alpha(buf[i]) || is_digit(buf[i]))) {
+ return false;
+ }
+ }
+ return true;
+}
+
static bool
write_uri_node(SerdWriter* const writer,
const SerdNode* node,
@@ -509,7 +522,8 @@ write_uri_node(SerdWriter* const writer,
} else if (supports_abbrev(writer) && !strcmp(node_str, NS_RDF "nil")) {
return sink("()", 2, writer) == 2;
} else if (has_scheme && (writer->style & SERD_STYLE_CURIED) &&
- serd_env_qualify(writer->env, node, &prefix, &suffix)) {
+ serd_env_qualify(writer->env, node, &prefix, &suffix) &&
+ is_name(suffix.buf, suffix.len)) {
write_uri_from_node(writer, prefix);
sink(":", 1, writer);
write_uri(writer, suffix.buf, suffix.len);