aboutsummaryrefslogtreecommitdiffstats
path: root/src/env.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-10-27 14:15:31 -0400
committerDavid Robillard <d@drobilla.net>2022-01-28 21:57:24 -0500
commit30487c277ac5d4be5786733ca7b98adb4c810ae9 (patch)
treef1b00a7725d74a594fcd91de2aea924485356528 /src/env.c
parent56cceb103dc633d6af957472945e792187a5dd4e (diff)
downloadserd-30487c277ac5d4be5786733ca7b98adb4c810ae9.tar.gz
serd-30487c277ac5d4be5786733ca7b98adb4c810ae9.tar.bz2
serd-30487c277ac5d4be5786733ca7b98adb4c810ae9.zip
Add custom allocator support
Diffstat (limited to 'src/env.c')
-rw-r--r--src/env.c100
1 files changed, 72 insertions, 28 deletions
diff --git a/src/env.c b/src/env.c
index df82381c..67d77cab 100644
--- a/src/env.c
+++ b/src/env.c
@@ -16,14 +16,14 @@
#include "env.h"
+#include "memory.h"
#include "node.h"
+#include "world.h"
#include "serd/serd.h"
#include <assert.h>
#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
#include <string.h>
typedef struct {
@@ -46,32 +46,53 @@ serd_env_new(SerdWorld* const world, const SerdStringView base_uri)
assert(world);
(void)world;
- SerdEnv* env = (SerdEnv*)calloc(1, sizeof(struct SerdEnvImpl));
+ SerdEnv* env = (SerdEnv*)serd_wcalloc(world, 1, sizeof(struct SerdEnvImpl));
- env->world = world;
- env->nodes = serd_nodes_new();
+ if (env) {
+ env->world = world;
+ if (!(env->nodes = serd_nodes_new(world->allocator))) {
+ serd_wfree(world, env);
+ return NULL;
+ }
- if (env && base_uri.len) {
- serd_env_set_base_uri(env, base_uri);
+ if (base_uri.len) {
+ if (serd_env_set_base_uri(env, base_uri)) {
+ serd_nodes_free(env->nodes);
+ serd_wfree(world, env);
+ return NULL;
+ }
+ }
}
return env;
}
SerdEnv*
-serd_env_copy(const SerdEnv* const env)
+serd_env_copy(SerdAllocator* const allocator, const SerdEnv* const env)
{
if (!env) {
return NULL;
}
- SerdEnv* copy = (SerdEnv*)calloc(1, sizeof(struct SerdEnvImpl));
+ SerdEnv* copy =
+ (SerdEnv*)serd_acalloc(allocator, 1, sizeof(struct SerdEnvImpl));
+
if (copy) {
copy->world = env->world;
- copy->nodes = serd_nodes_new();
copy->n_prefixes = env->n_prefixes;
- copy->prefixes = (SerdPrefix*)malloc(copy->n_prefixes * sizeof(SerdPrefix));
+ if (!(copy->nodes = serd_nodes_new(allocator))) {
+ serd_wfree(env->world, copy);
+ return NULL;
+ }
+
+ if (!(copy->prefixes = (SerdPrefix*)serd_amalloc(
+ allocator, copy->n_prefixes * sizeof(SerdPrefix)))) {
+ serd_nodes_free(copy->nodes);
+ serd_wfree(env->world, copy);
+ return NULL;
+ }
+
for (size_t i = 0; i < copy->n_prefixes; ++i) {
copy->prefixes[i].name =
serd_nodes_intern(copy->nodes, env->prefixes[i].name);
@@ -93,9 +114,9 @@ void
serd_env_free(SerdEnv* const env)
{
if (env) {
- free(env->prefixes);
+ serd_wfree(env->world, env->prefixes);
serd_nodes_free(env->nodes);
- free(env);
+ serd_wfree(env->world, env);
}
}
@@ -158,8 +179,11 @@ serd_env_set_base_uri(SerdEnv* const env, const SerdStringView uri)
serd_resolve_uri(serd_parse_uri(uri.buf), env->base_uri);
// Replace the current base URI
- env->base_uri_node = serd_nodes_parsed_uri(env->nodes, new_base_uri);
- env->base_uri = serd_node_uri_view(env->base_uri_node);
+ if ((env->base_uri_node = serd_nodes_parsed_uri(env->nodes, new_base_uri))) {
+ env->base_uri = serd_node_uri_view(env->base_uri_node);
+ } else {
+ return SERD_BAD_ALLOC;
+ }
serd_nodes_deref(env->nodes, old_base_uri);
return SERD_SUCCESS;
@@ -182,7 +206,7 @@ serd_env_find(const SerdEnv* const env,
return NULL;
}
-static void
+static SerdStatus
serd_env_add(SerdEnv* const env,
const SerdStringView name,
const SerdNode* const uri)
@@ -194,14 +218,25 @@ serd_env_add(SerdEnv* const env,
prefix->uri = uri;
}
} else {
- env->prefixes = (SerdPrefix*)realloc(
- env->prefixes, (++env->n_prefixes) * sizeof(SerdPrefix));
+ const SerdNode* const name_node = serd_nodes_string(env->nodes, name);
+ if (!name_node) {
+ return SERD_BAD_ALLOC;
+ }
- env->prefixes[env->n_prefixes - 1].name =
- serd_nodes_string(env->nodes, name);
+ SerdPrefix* const new_prefixes = (SerdPrefix*)serd_wrealloc(
+ env->world, env->prefixes, (env->n_prefixes + 1) * sizeof(SerdPrefix));
- env->prefixes[env->n_prefixes - 1].uri = uri;
+ if (!new_prefixes) {
+ return SERD_BAD_ALLOC;
+ }
+
+ new_prefixes[env->n_prefixes].name = name_node;
+ new_prefixes[env->n_prefixes].uri = uri;
+ env->prefixes = new_prefixes;
+ ++env->n_prefixes;
}
+
+ return SERD_SUCCESS;
}
SerdStatus
@@ -213,8 +248,12 @@ serd_env_set_prefix(SerdEnv* const env,
if (serd_uri_string_has_scheme(uri.buf)) {
// Set prefix to absolute URI
- serd_env_add(env, name, serd_nodes_uri(env->nodes, uri));
- return SERD_SUCCESS;
+ const SerdNode* const abs_uri = serd_nodes_uri(env->nodes, uri);
+ if (!abs_uri) {
+ return SERD_BAD_ALLOC;
+ }
+
+ return serd_env_add(env, name, abs_uri);
}
if (!env->base_uri_node) {
@@ -230,11 +269,14 @@ serd_env_set_prefix(SerdEnv* const env,
const SerdNode* const abs_uri =
serd_nodes_parsed_uri(env->nodes, abs_uri_view);
+ if (!abs_uri) {
+ return SERD_BAD_ALLOC;
+ }
+
assert(serd_uri_string_has_scheme(serd_node_string(abs_uri)));
// Set prefix to resolved absolute URI
- serd_env_add(env, name, abs_uri);
- return SERD_SUCCESS;
+ return serd_env_add(env, name, abs_uri);
}
SerdStatus
@@ -303,7 +345,9 @@ serd_env_expand_curie(const SerdEnv* const env, const SerdStringView curie)
}
const size_t len = prefix.len + suffix.len;
- SerdNode* ret = serd_node_malloc(sizeof(SerdNode) + len + 1);
+ SerdNode* ret =
+ serd_node_malloc(env->world->allocator, sizeof(SerdNode) + len + 1);
+
if (ret) {
ret->length = len;
ret->flags = 0u;
@@ -331,8 +375,8 @@ serd_env_expand_node(const SerdEnv* const env, const SerdNode* const node)
return NULL;
}
- const SerdWriteResult r = serd_node_construct_uri(0u, NULL, abs_uri);
- SerdNode* const expanded = serd_node_try_malloc(r);
+ const SerdWriteResult r = serd_node_construct_uri(0u, NULL, abs_uri);
+ SerdNode* const expanded = serd_node_try_malloc(env->world->allocator, r);
if (expanded) {
serd_node_construct_uri(r.count, expanded, abs_uri);
}