aboutsummaryrefslogtreecommitdiffstats
path: root/src/world.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/world.c
parent56cceb103dc633d6af957472945e792187a5dd4e (diff)
downloadserd-30487c277ac5d4be5786733ca7b98adb4c810ae9.tar.gz
serd-30487c277ac5d4be5786733ca7b98adb4c810ae9.tar.bz2
serd-30487c277ac5d4be5786733ca7b98adb4c810ae9.zip
Add custom allocator support
Diffstat (limited to 'src/world.c')
-rw-r--r--src/world.c70
1 files changed, 49 insertions, 21 deletions
diff --git a/src/world.c b/src/world.c
index 39eeaec3..5b5cb900 100644
--- a/src/world.c
+++ b/src/world.c
@@ -16,6 +16,7 @@
#include "world.h"
+#include "memory.h"
#include "namespaces.h"
#include "node.h"
#include "serd_config.h"
@@ -67,27 +68,46 @@ terminal_supports_color(FILE* const stream)
}
SerdWorld*
-serd_world_new(void)
+serd_world_new(SerdAllocator* const allocator)
{
- SerdWorld* world = (SerdWorld*)calloc(1, sizeof(SerdWorld));
- SerdNodes* nodes = serd_nodes_new();
-
- const SerdStringView rdf_first = SERD_STRING(NS_RDF "first");
- const SerdStringView rdf_nil = SERD_STRING(NS_RDF "nil");
- const SerdStringView rdf_rest = SERD_STRING(NS_RDF "rest");
- const SerdStringView rdf_type = SERD_STRING(NS_RDF "type");
- const SerdStringView xsd_boolean = SERD_STRING(NS_XSD "boolean");
- const SerdStringView xsd_decimal = SERD_STRING(NS_XSD "decimal");
- const SerdStringView xsd_integer = SERD_STRING(NS_XSD "integer");
-
- world->nodes = nodes;
- world->rdf_first = serd_nodes_uri(nodes, rdf_first);
- world->rdf_nil = serd_nodes_uri(nodes, rdf_nil);
- world->rdf_rest = serd_nodes_uri(nodes, rdf_rest);
- world->rdf_type = serd_nodes_uri(nodes, rdf_type);
- world->xsd_boolean = serd_nodes_uri(nodes, xsd_boolean);
- world->xsd_decimal = serd_nodes_uri(nodes, xsd_decimal);
- world->xsd_integer = serd_nodes_uri(nodes, xsd_integer);
+ SerdAllocator* const actual =
+ allocator ? allocator : serd_default_allocator();
+
+ SerdWorld* const world =
+ (SerdWorld*)serd_acalloc(actual, 1, sizeof(SerdWorld));
+
+ if (!world) {
+ return NULL;
+ }
+
+ SerdNodes* const nodes = serd_nodes_new(actual);
+ if (!nodes) {
+ serd_afree(actual, world);
+ return NULL;
+ }
+
+ static const SerdStringView rdf_first = SERD_STRING(NS_RDF "first");
+ static const SerdStringView rdf_nil = SERD_STRING(NS_RDF "nil");
+ static const SerdStringView rdf_rest = SERD_STRING(NS_RDF "rest");
+ static const SerdStringView rdf_type = SERD_STRING(NS_RDF "type");
+ static const SerdStringView xsd_boolean = SERD_STRING(NS_XSD "boolean");
+ static const SerdStringView xsd_decimal = SERD_STRING(NS_XSD "decimal");
+ static const SerdStringView xsd_integer = SERD_STRING(NS_XSD "integer");
+
+ world->allocator = actual;
+ world->nodes = nodes;
+
+ if (!(world->rdf_first = serd_nodes_uri(nodes, rdf_first)) ||
+ !(world->rdf_nil = serd_nodes_uri(nodes, rdf_nil)) ||
+ !(world->rdf_rest = serd_nodes_uri(nodes, rdf_rest)) ||
+ !(world->rdf_type = serd_nodes_uri(nodes, rdf_type)) ||
+ !(world->xsd_boolean = serd_nodes_uri(nodes, xsd_boolean)) ||
+ !(world->xsd_decimal = serd_nodes_uri(nodes, xsd_decimal)) ||
+ !(world->xsd_integer = serd_nodes_uri(nodes, xsd_integer))) {
+ serd_nodes_free(nodes);
+ serd_afree(actual, world);
+ return NULL;
+ }
serd_node_construct_token(sizeof(world->blank),
&world->blank,
@@ -104,10 +124,18 @@ serd_world_free(SerdWorld* const world)
{
if (world) {
serd_nodes_free(world->nodes);
- free(world);
+ serd_afree(world->allocator, world);
}
}
+SerdAllocator*
+serd_world_allocator(const SerdWorld* const world)
+{
+ assert(world);
+ assert(world->allocator);
+ return world->allocator;
+}
+
SerdNodes*
serd_world_nodes(SerdWorld* const world)
{