aboutsummaryrefslogtreecommitdiffstats
path: root/src/env.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-02-20 16:47:55 -0500
committerDavid Robillard <d@drobilla.net>2021-03-07 15:32:24 -0500
commit941b14a0ab8f7c80f94e04762e65a48f9ed02f6e (patch)
treea7e89d7d2bb0150728c5eec3d4d9e6730f9af016 /src/env.c
parentd243368f8e2f79a125a5858223f71fb40fe84525 (diff)
downloadserd-941b14a0ab8f7c80f94e04762e65a48f9ed02f6e.tar.gz
serd-941b14a0ab8f7c80f94e04762e65a48f9ed02f6e.tar.bz2
serd-941b14a0ab8f7c80f94e04762e65a48f9ed02f6e.zip
Simplify URI API and implementation
Diffstat (limited to 'src/env.c')
-rw-r--r--src/env.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/src/env.c b/src/env.c
index f88b8ab1..eedb85fa 100644
--- a/src/env.c
+++ b/src/env.c
@@ -85,15 +85,16 @@ serd_env_set_base_uri(SerdEnv* env, const SerdNode* uri)
return SERD_SUCCESS;
}
- // Resolve base URI and create a new node and URI for it
- SerdURIView base_uri;
- SerdNode* base_uri_node =
- serd_new_uri_from_node(uri, &env->base_uri, &base_uri);
+ // Resolve the new base against the current base in case it is relative
+ const SerdURIView new_base_uri =
+ serd_resolve_uri(serd_parse_uri(serd_node_string(uri)), env->base_uri);
+
+ SerdNode* const new_base_node = serd_new_parsed_uri(new_base_uri);
// Replace the current base URI
serd_node_free(env->base_uri_node);
- env->base_uri_node = base_uri_node;
- env->base_uri = base_uri;
+ env->base_uri_node = new_base_node;
+ env->base_uri = serd_node_uri_view(env->base_uri_node);
return SERD_SUCCESS;
}
@@ -142,15 +143,17 @@ serd_env_set_prefix(SerdEnv* env, const SerdNode* name, const SerdNode* uri)
if (serd_uri_string_has_scheme(serd_node_string(uri))) {
// Set prefix to absolute URI
serd_env_add(env, name, uri);
+ } else if (!env->base_uri_node) {
+ return SERD_ERR_BAD_ARG;
} else {
// Resolve relative URI and create a new node and URI for it
- SerdURIView abs_uri;
- SerdNode* abs_uri_node =
- serd_new_uri_from_node(uri, &env->base_uri, &abs_uri);
+ SerdNode* const abs_uri =
+ serd_new_resolved_uri(serd_node_string_view(uri), env->base_uri);
// Set prefix to resolved (absolute) URI
- serd_env_add(env, name, abs_uri_node);
- serd_node_free(abs_uri_node);
+ serd_env_add(env, name, abs_uri);
+
+ serd_node_free(abs_uri);
}
return SERD_SUCCESS;
@@ -224,16 +227,15 @@ serd_env_expand_node(const SerdEnv* env, const SerdNode* node)
switch (node->type) {
case SERD_LITERAL:
break;
- case SERD_URI: {
- SerdURIView ignored;
- return serd_new_uri_from_node(node, &env->base_uri, &ignored);
- }
+ case SERD_URI:
+ return serd_new_resolved_uri(serd_node_string_view(node), env->base_uri);
case SERD_CURIE: {
SerdStringView prefix;
SerdStringView suffix;
if (serd_env_expand(env, node, &prefix, &suffix)) {
return NULL;
}
+
const size_t len = prefix.len + suffix.len;
SerdNode* ret = serd_node_malloc(len, 0, SERD_URI);
char* buf = serd_node_buffer(ret);