aboutsummaryrefslogtreecommitdiffstats
path: root/src/node.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-07-17 13:19:27 -0400
committerDavid Robillard <d@drobilla.net>2022-01-14 19:37:51 -0500
commit21f17ad27b3e805003e50b0f5fcbe606bfef0f3b (patch)
tree7ccce960e8862e7cf5d2a62296c2d1f67221a01b /src/node.c
parent07b716c38625dd954be279e3476164b5bb1d6293 (diff)
downloadserd-21f17ad27b3e805003e50b0f5fcbe606bfef0f3b.tar.gz
serd-21f17ad27b3e805003e50b0f5fcbe606bfef0f3b.tar.bz2
serd-21f17ad27b3e805003e50b0f5fcbe606bfef0f3b.zip
Factor out serd_write_file_uri()
Diffstat (limited to 'src/node.c')
-rw-r--r--src/node.c72
1 files changed, 2 insertions, 70 deletions
diff --git a/src/node.c b/src/node.c
index fc9869a8..d9cfbe93 100644
--- a/src/node.c
+++ b/src/node.c
@@ -28,7 +28,6 @@
#include <math.h>
#include <stdbool.h>
#include <stdint.h>
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -511,79 +510,12 @@ serd_new_resolved_uri(const SerdStringView string, const SerdURIView base)
return result;
}
-static bool
-is_uri_path_char(const char c)
-{
- if (is_alpha(c) || is_digit(c)) {
- return true;
- }
-
- switch (c) {
- // unreserved:
- case '-':
- case '.':
- case '_':
- case '~':
- case ':':
-
- case '@': // pchar
- case '/': // separator
-
- // sub-delimiters:
- case '!':
- case '$':
- case '&':
- case '\'':
- case '(':
- case ')':
- case '*':
- case '+':
- case ',':
- case ';':
- case '=':
- return true;
- default:
- return false;
- }
-}
-
SerdNode*
serd_new_file_uri(const SerdStringView path, const SerdStringView hostname)
{
- const bool is_windows = is_windows_path(path.buf);
- size_t uri_len = 0;
- char* uri = NULL;
+ SerdBuffer buffer = {NULL, 0u};
- if (path.buf[0] == '/' || is_windows) {
- uri_len = strlen("file://") + hostname.len + is_windows;
- uri = (char*)calloc(uri_len + 1, 1);
-
- memcpy(uri, "file://", 7);
-
- if (hostname.len) {
- memcpy(uri + 7, hostname.buf, hostname.len + 1);
- }
-
- if (is_windows) {
- uri[7 + hostname.len] = '/';
- }
- }
-
- SerdBuffer buffer = {uri, uri_len};
- for (size_t i = 0; i < path.len; ++i) {
- if (is_windows && path.buf[i] == '\\') {
- serd_buffer_sink("/", 1, 1, &buffer);
- } else if (path.buf[i] == '%') {
- serd_buffer_sink("%%", 1, 2, &buffer);
- } else if (is_uri_path_char(path.buf[i])) {
- serd_buffer_sink(path.buf + i, 1, 1, &buffer);
- } else {
- char escape_str[10] = {'%', 0, 0, 0, 0, 0, 0, 0, 0, 0};
- snprintf(
- escape_str + 1, sizeof(escape_str) - 1, "%X", (unsigned)path.buf[i]);
- serd_buffer_sink(escape_str, 1, 3, &buffer);
- }
- }
+ serd_write_file_uri(path, hostname, serd_buffer_sink, &buffer);
serd_buffer_sink_finish(&buffer);
SerdNode* node =