diff options
author | David Robillard <d@drobilla.net> | 2020-08-12 15:51:07 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2021-03-08 23:23:06 -0500 |
commit | 0054cff3f5aa1e2c4b5e47fd9b2dfeeff6b17e53 (patch) | |
tree | b267a6fa76129ef10e91bf953ca63cf20abc6407 /src/env.c | |
parent | bf01cef66e561ea0cd2ad0babf08194b00f84b77 (diff) | |
download | serd-0054cff3f5aa1e2c4b5e47fd9b2dfeeff6b17e53.tar.gz serd-0054cff3f5aa1e2c4b5e47fd9b2dfeeff6b17e53.tar.bz2 serd-0054cff3f5aa1e2c4b5e47fd9b2dfeeff6b17e53.zip |
Remove double allocations in serd_env_expand()
Diffstat (limited to 'src/env.c')
-rw-r--r-- | src/env.c | 20 |
1 files changed, 14 insertions, 6 deletions
@@ -276,13 +276,21 @@ 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) { - SerdNode* ret = serd_new_typed_literal(serd_node_string_view(node), - serd_node_string_view(datatype)); + 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_view(node), serd_node_flags(node), prefix, suffix); + } - serd_node_free(datatype); - return ret; + } else if (datatype && serd_node_type(datatype) == SERD_URI) { + return serd_new_typed_literal_uri( + serd_node_string_view(node), + serd_node_flags(node), + serd_resolve_uri(serd_parse_uri(serd_node_string(datatype)), + env->base_uri)); } return NULL; |