aboutsummaryrefslogtreecommitdiffstats
path: root/src/env.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2020-08-12 15:51:07 +0200
committerDavid Robillard <d@drobilla.net>2020-10-27 13:13:59 +0100
commit8527574f88de6402954393bd6b2d6c8a93d7d7ef (patch)
tree4c9a063b56a3e94d8f66ab30623f3d75362cc2e2 /src/env.c
parentdc9d3e98500aed29aba54198fa3c2c254d296325 (diff)
downloadserd-8527574f88de6402954393bd6b2d6c8a93d7d7ef.tar.gz
serd-8527574f88de6402954393bd6b2d6c8a93d7d7ef.tar.bz2
serd-8527574f88de6402954393bd6b2d6c8a93d7d7ef.zip
Remove double allocations in serd_env_expand()
Diffstat (limited to 'src/env.c')
-rw-r--r--src/env.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/env.c b/src/env.c
index 8d3c3ec4..3dc89ac3 100644
--- a/src/env.c
+++ b/src/env.c
@@ -298,12 +298,28 @@ expand_literal(const SerdEnv* env, const SerdNode* node)
{
assert(serd_node_type(node) == SERD_LITERAL);
- SerdNode* datatype = serd_env_expand(env, serd_node_datatype(node));
- if (datatype) {
- const char* str = serd_node_string(node);
- SerdNode* ret = serd_new_typed_literal(str, datatype);
- serd_node_free(datatype);
- return ret;
+ const SerdNode* const datatype = serd_node_datatype(node);
+ if (datatype && serd_node_type(datatype) == SERD_CURIE) {
+ SerdStringView prefix;
+ SerdStringView suffix;
+ if (!serd_env_expand_in_place(env, datatype, &prefix, &suffix)) {
+ return serd_new_typed_literal_expanded(serd_node_string(node),
+ serd_node_length(node),
+ serd_node_flags(node),
+ prefix,
+ suffix);
+ }
+ } else if (datatype && serd_node_type(datatype) == SERD_URI) {
+ SerdURI datatype_uri;
+ serd_uri_parse(serd_node_string(datatype), &datatype_uri);
+
+ SerdURI abs_datatype_uri;
+ serd_uri_resolve(&datatype_uri, &env->base_uri, &abs_datatype_uri);
+
+ return serd_new_typed_literal_uri(serd_node_string(node),
+ serd_node_length(node),
+ serd_node_flags(node),
+ abs_datatype_uri);
}
return NULL;