diff options
author | David Robillard <d@drobilla.net> | 2020-08-12 15:51:07 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-10-27 13:13:59 +0100 |
commit | 8527574f88de6402954393bd6b2d6c8a93d7d7ef (patch) | |
tree | 4c9a063b56a3e94d8f66ab30623f3d75362cc2e2 /src/env.c | |
parent | dc9d3e98500aed29aba54198fa3c2c254d296325 (diff) | |
download | serd-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.c | 28 |
1 files changed, 22 insertions, 6 deletions
@@ -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; |