diff options
Diffstat (limited to 'src/world.c')
-rw-r--r-- | src/world.c | 70 |
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) { |