From 530edb265fbbed20e6d3a6fd7a36461ff83d9b46 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Tue, 20 Dec 2022 09:47:26 -0500 Subject: Add serd_env_unset_prefix() --- src/env.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'src') diff --git a/src/env.c b/src/env.c index a63f2126..0a1d0d5b 100644 --- a/src/env.c +++ b/src/env.c @@ -314,6 +314,43 @@ serd_env_set_prefix(SerdEnv* const env, return serd_env_add(env, name, abs_uri); } +SerdStatus +serd_env_unset_prefix(SerdEnv* const env, const ZixStringView name) +{ + // Find matching prefix + SerdPrefix* const prefix = serd_env_find(env, name.data, name.length); + if (!prefix) { + return SERD_SUCCESS; + } + + // Drop prefix's URI node and clear if it's the only one + serd_nodes_deref(env->nodes, prefix->uri); + if (env->n_prefixes == 1U) { + zix_free(env->allocator, env->prefixes); + env->prefixes = NULL; + env->n_prefixes = 0U; + return SERD_SUCCESS; + } + + // Replace the prefix entry with the last one (if applicable) + const size_t index = (size_t)(prefix - env->prefixes); + const size_t new_n_prefixes = env->n_prefixes - 1U; + if (index < new_n_prefixes) { + env->prefixes[index] = env->prefixes[new_n_prefixes]; + } + + // Shrink prefixes array + SerdPrefix* const new_prefixes = (SerdPrefix*)zix_realloc( + env->allocator, env->prefixes, new_n_prefixes * sizeof(SerdPrefix)); + + if (new_prefixes) { + env->prefixes = new_prefixes; + env->n_prefixes = new_n_prefixes; + } + + return new_prefixes ? SERD_SUCCESS : SERD_BAD_ALLOC; +} + SerdStatus serd_env_qualify(const SerdEnv* const env, const ZixStringView uri, -- cgit v1.2.1