diff options
Diffstat (limited to 'src/filter.c')
-rw-r--r-- | src/filter.c | 56 |
1 files changed, 43 insertions, 13 deletions
diff --git a/src/filter.c b/src/filter.c index 8efe1e91..8e0f5731 100644 --- a/src/filter.c +++ b/src/filter.c @@ -16,6 +16,9 @@ #include "serd/serd.h" +#include "memory.h" +#include "sink.h" + #include <assert.h> #include <stdbool.h> #include <stdlib.h> @@ -33,13 +36,15 @@ static void free_data(void* const handle) { if (handle) { - SerdFilterData* data = (SerdFilterData*)handle; - - serd_node_free(data->subject); - serd_node_free(data->predicate); - serd_node_free(data->object); - serd_node_free(data->graph); - free(data); + SerdFilterData* const data = (SerdFilterData*)handle; + const SerdWorld* const world = data->target->world; + SerdAllocator* const allocator = serd_world_allocator(world); + + serd_node_free(allocator, data->subject); + serd_node_free(allocator, data->predicate); + serd_node_free(allocator, data->object); + serd_node_free(allocator, data->graph); + serd_wfree(data->target->world, data); } } @@ -80,28 +85,53 @@ serd_filter_new(const SerdWorld* const world, { assert(world); assert(target); + assert(target->world == world); + SerdAllocator* const allocator = serd_world_allocator(world); SerdFilterData* const data = - (SerdFilterData*)calloc(1, sizeof(SerdFilterData)); + (SerdFilterData*)serd_wcalloc(world, 1, sizeof(SerdFilterData)); + + if (!data) { + return NULL; + } data->target = target; data->inclusive = inclusive; if (subject && serd_node_type(subject) != SERD_VARIABLE) { - data->subject = serd_node_copy(subject); + if (!(data->subject = serd_node_copy(allocator, subject))) { + free_data(data); + return NULL; + } } if (predicate && serd_node_type(predicate) != SERD_VARIABLE) { - data->predicate = serd_node_copy(predicate); + if (!(data->predicate = serd_node_copy(allocator, predicate))) { + free_data(data); + return NULL; + } } if (object && serd_node_type(object) != SERD_VARIABLE) { - data->object = serd_node_copy(object); + if (!(data->object = serd_node_copy(allocator, object))) { + free_data(data); + return NULL; + } } if (graph && serd_node_type(graph) != SERD_VARIABLE) { - data->graph = serd_node_copy(graph); + if (!(data->graph = serd_node_copy(allocator, graph))) { + free_data(data); + return NULL; + } + } + + SerdSink* const sink = + serd_sink_new(world, data, serd_filter_on_event, free_data); + + if (!sink) { + free_data(data); } - return serd_sink_new(world, data, serd_filter_on_event, free_data); + return sink; } |