aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-06-30 16:15:15 -0400
committerDavid Robillard <d@drobilla.net>2021-06-30 16:19:59 -0400
commitc1cae48eb3851239817c8cda5a8266815fb3173e (patch)
treec9ceda4eb0fa59b12a269b665c9822c719a1c80b
parent8113202c98888e092e1f4cdc2ee3ab34509d949c (diff)
downloadserd-c1cae48eb3851239817c8cda5a8266815fb3173e.tar.gz
serd-c1cae48eb3851239817c8cda5a8266815fb3173e.tar.bz2
serd-c1cae48eb3851239817c8cda5a8266815fb3173e.zip
Make node qualify and expand functions tolerate a null Env
This is convenient in places where you don't necessarily need an Env, since these methods will work the same as with an empty Env.
-rw-r--r--include/serd/serd.h6
-rw-r--r--src/env.c12
-rw-r--r--test/test_env.c5
3 files changed, 20 insertions, 3 deletions
diff --git a/include/serd/serd.h b/include/serd/serd.h
index 68443304..fcba2ddf 100644
--- a/include/serd/serd.h
+++ b/include/serd/serd.h
@@ -684,7 +684,7 @@ serd_env_set_prefix_from_strings(SerdEnv* SERD_NONNULL env,
/// Qualify `uri` into a CURIE if possible
SERD_API
bool
-serd_env_qualify(const SerdEnv* SERD_NONNULL env,
+serd_env_qualify(const SerdEnv* SERD_NULLABLE env,
const SerdNode* SERD_NONNULL uri,
SerdNode* SERD_NONNULL prefix,
SerdChunk* SERD_NONNULL suffix);
@@ -697,7 +697,7 @@ serd_env_qualify(const SerdEnv* SERD_NONNULL env,
*/
SERD_API
SerdStatus
-serd_env_expand(const SerdEnv* SERD_NONNULL env,
+serd_env_expand(const SerdEnv* SERD_NULLABLE env,
const SerdNode* SERD_NONNULL curie,
SerdChunk* SERD_NONNULL uri_prefix,
SerdChunk* SERD_NONNULL uri_suffix);
@@ -709,7 +709,7 @@ serd_env_expand(const SerdEnv* SERD_NONNULL env,
*/
SERD_API
SerdNode
-serd_env_expand_node(const SerdEnv* SERD_NONNULL env,
+serd_env_expand_node(const SerdEnv* SERD_NULLABLE env,
const SerdNode* SERD_NONNULL node);
/// Call `func` for each prefix defined in `env`
diff --git a/src/env.c b/src/env.c
index ad0252fb..385ab2f6 100644
--- a/src/env.c
+++ b/src/env.c
@@ -179,6 +179,10 @@ serd_env_qualify(const SerdEnv* const env,
SerdNode* const prefix,
SerdChunk* const suffix)
{
+ if (!env) {
+ return false;
+ }
+
for (size_t i = 0; i < env->n_prefixes; ++i) {
const SerdNode* const prefix_uri = &env->prefixes[i].uri;
if (uri->n_bytes >= prefix_uri->n_bytes) {
@@ -201,6 +205,10 @@ serd_env_expand(const SerdEnv* const env,
SerdChunk* const uri_prefix,
SerdChunk* const uri_suffix)
{
+ if (!env) {
+ return SERD_ERR_BAD_CURIE;
+ }
+
const uint8_t* const colon =
(const uint8_t*)memchr(curie->buf, ':', curie->n_bytes + 1);
if (curie->type != SERD_CURIE || !colon) {
@@ -222,6 +230,10 @@ serd_env_expand(const SerdEnv* const env,
SerdNode
serd_env_expand_node(const SerdEnv* const env, const SerdNode* const node)
{
+ if (!env) {
+ return SERD_NODE_NULL;
+ }
+
switch (node->type) {
case SERD_NOTHING:
case SERD_LITERAL:
diff --git a/test/test_env.c b/test/test_env.c
index b25bd9e2..48bc6c9b 100644
--- a/test/test_env.c
+++ b/test/test_env.c
@@ -50,8 +50,13 @@ test_env(void)
SerdChunk prefix;
SerdChunk suffix;
+ assert(!serd_env_qualify(NULL, &u, &u, &suffix));
+ assert(serd_env_expand(NULL, &c, &prefix, &suffix));
assert(serd_env_expand(env, &b, &prefix, &suffix));
+ SerdNode nxnode = serd_env_expand_node(NULL, &c);
+ assert(serd_node_equals(&nxnode, &SERD_NODE_NULL));
+
SerdNode xnode = serd_env_expand_node(env, &SERD_NODE_NULL);
assert(serd_node_equals(&xnode, &SERD_NODE_NULL));