diff options
author | David Robillard <d@drobilla.net> | 2021-07-17 13:19:27 -0400 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2022-01-14 19:37:51 -0500 |
commit | 21f17ad27b3e805003e50b0f5fcbe606bfef0f3b (patch) | |
tree | 7ccce960e8862e7cf5d2a62296c2d1f67221a01b /src | |
parent | 07b716c38625dd954be279e3476164b5bb1d6293 (diff) | |
download | serd-21f17ad27b3e805003e50b0f5fcbe606bfef0f3b.tar.gz serd-21f17ad27b3e805003e50b0f5fcbe606bfef0f3b.tar.bz2 serd-21f17ad27b3e805003e50b0f5fcbe606bfef0f3b.zip |
Factor out serd_write_file_uri()
Diffstat (limited to 'src')
-rw-r--r-- | src/node.c | 72 | ||||
-rw-r--r-- | src/uri.c | 74 |
2 files changed, 76 insertions, 70 deletions
@@ -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 = @@ -495,3 +495,77 @@ serd_write_uri(const SerdURIView uri, } return len; } + +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; + } +} + +size_t +serd_write_file_uri(const SerdStringView path, + const SerdStringView hostname, + const SerdWriteFunc sink, + void* const stream) +{ + const bool is_windows = is_windows_path(path.buf); + size_t len = 0u; + + if (path.buf[0] == '/' || is_windows) { + len += sink("file://", 1, strlen("file://"), stream); + if (hostname.len) { + len += sink(hostname.buf, 1, hostname.len, stream); + } + + if (is_windows) { + len += sink("/", 1, 1, stream); + } + } + + for (size_t i = 0; i < path.len; ++i) { + if (is_windows && path.buf[i] == '\\') { + len += sink("/", 1, 1, stream); + } else if (path.buf[i] == '%') { + len += sink("%%", 1, 2, stream); + } else if (is_uri_path_char(path.buf[i])) { + len += sink(path.buf + i, 1, 1, stream); + } 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]); + len += sink(escape_str, 1, 3, stream); + } + } + + return len; +} |