aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2016-07-09 11:29:44 -0400
committerDavid Robillard <d@drobilla.net>2016-07-09 11:29:44 -0400
commit443f470383dc3acba0fde7b705e8ff81a7c49595 (patch)
tree1b6a094465f3ec7844695aaf54722cfd65791e87 /src
parentc7715b8b5ee48297c9a4fc0831556921d5f78fb0 (diff)
downloadserd-443f470383dc3acba0fde7b705e8ff81a7c49595.tar.gz
serd-443f470383dc3acba0fde7b705e8ff81a7c49595.tar.bz2
serd-443f470383dc3acba0fde7b705e8ff81a7c49595.zip
Fix construction of URIs with UTF-8 characters
Diffstat (limited to 'src')
-rw-r--r--src/env.c6
-rw-r--r--src/node.c12
-rw-r--r--src/string.c15
3 files changed, 17 insertions, 16 deletions
diff --git a/src/env.c b/src/env.c
index 514e487d..a753c140 100644
--- a/src/env.c
+++ b/src/env.c
@@ -1,5 +1,5 @@
/*
- Copyright 2011-2014 David Robillard <http://drobilla.net>
+ Copyright 2011-2016 David Robillard <http://drobilla.net>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
@@ -243,9 +243,9 @@ serd_env_expand_node(const SerdEnv* env,
if (serd_env_expand(env, node, &prefix, &suffix)) {
return SERD_NODE_NULL;
}
- const size_t len = prefix.len + suffix.len; // FIXME: UTF-8?
+ const size_t len = prefix.len + suffix.len;
uint8_t* buf = (uint8_t*)malloc(len + 1);
- SerdNode ret = { buf, len, len, 0, SERD_URI };
+ SerdNode ret = { buf, len, serd_strlen(buf, NULL, NULL), 0, SERD_URI };
snprintf((char*)buf, ret.n_bytes + 1, "%s%s", prefix.buf, suffix.buf);
return ret;
}
diff --git a/src/node.c b/src/node.c
index db99e89e..dc50cd7a 100644
--- a/src/node.c
+++ b/src/node.c
@@ -1,5 +1,5 @@
/*
- Copyright 2011-2015 David Robillard <http://drobilla.net>
+ Copyright 2011-2016 David Robillard <http://drobilla.net>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
@@ -197,17 +197,15 @@ serd_node_new_uri(const SerdURI* uri, const SerdURI* base, SerdURI* out)
serd_uri_resolve(uri, base, &abs_uri);
}
- const size_t len = serd_uri_string_length(&abs_uri);
- uint8_t* buf = (uint8_t*)malloc(len + 1);
-
- SerdNode node = { buf, len, len, 0, SERD_URI }; // FIXME: UTF-8
-
+ const size_t len = serd_uri_string_length(&abs_uri);
+ uint8_t* buf = (uint8_t*)malloc(len + 1);
+ SerdNode node = { buf, 0, 0, 0, SERD_URI };
uint8_t* ptr = buf;
const size_t actual_len = serd_uri_serialise(&abs_uri, string_sink, &ptr);
buf[actual_len] = '\0';
node.n_bytes = actual_len;
- node.n_chars = actual_len;
+ node.n_chars = serd_strlen(buf, NULL, NULL);
if (out) {
serd_uri_parse(buf, out); // TODO: cleverly avoid double parse
diff --git a/src/string.c b/src/string.c
index a1a1dff1..1e653795 100644
--- a/src/string.c
+++ b/src/string.c
@@ -1,5 +1,5 @@
/*
- Copyright 2011-2012 David Robillard <http://drobilla.net>
+ Copyright 2011-2016 David Robillard <http://drobilla.net>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
@@ -40,25 +40,28 @@ SERD_API
size_t
serd_strlen(const uint8_t* str, size_t* n_bytes, SerdNodeFlags* flags)
{
- size_t n_chars = 0;
- size_t i = 0;
- *flags = 0;
+ size_t n_chars = 0;
+ size_t i = 0;
+ SerdNodeFlags f = 0;
for (; str[i]; ++i) {
if ((str[i] & 0xC0) != 0x80) {
// Does not start with `10', start of a new character
++n_chars;
switch (str[i]) {
case '\r': case '\n':
- *flags |= SERD_HAS_NEWLINE;
+ f |= SERD_HAS_NEWLINE;
break;
case '"':
- *flags |= SERD_HAS_QUOTE;
+ f |= SERD_HAS_QUOTE;
}
}
}
if (n_bytes) {
*n_bytes = i;
}
+ if (flags) {
+ *flags = f;
+ }
return n_chars;
}