From c5d3e934b49666fa48f7d4c3186a7f56b4a25c52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 17 Nov 2018 17:13:45 +0100 Subject: [PATCH] particle/list: optionally destroy sub particles This was always done before. Now that it is optional, one can for example generate lists dynamically, using the same set of base particles over and over again. --- config.c | 3 ++- particles/list.c | 13 ++++++++++--- particles/list.h | 5 ++++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/config.c b/config.c index 3327ef9..fb77813 100644 --- a/config.c +++ b/config.c @@ -166,7 +166,8 @@ particle_list_from_config(const struct yml_node *node, } struct particle *list = particle_list_new( - parts, count, left_spacing, right_spacing, left_margin, right_margin); + parts, count, left_spacing, right_spacing, left_margin, right_margin, + true); free(parts); return list; diff --git a/particles/list.c b/particles/list.c index 45fb846..dfb6e9a 100644 --- a/particles/list.c +++ b/particles/list.c @@ -5,6 +5,7 @@ struct particle_private { struct particle **particles; size_t count; int left_spacing, right_spacing; + bool has_ownership; }; struct exposable_private { @@ -93,8 +94,12 @@ static void particle_destroy(struct particle *particle) { struct particle_private *p = particle->private; - for (size_t i = 0; i < p->count; i++) - p->particles[i]->destroy(p->particles[i]); + + if (p->has_ownership) { + for (size_t i = 0; i < p->count; i++) + p->particles[i]->destroy(p->particles[i]); + } + free(p->particles); free(p); free(particle); @@ -103,13 +108,15 @@ particle_destroy(struct particle *particle) struct particle * particle_list_new( struct particle *particles[], size_t count, - int left_spacing, int right_spacing, int left_margin, int right_margin) + int left_spacing, int right_spacing, int left_margin, int right_margin, + bool take_ownership) { struct particle_private *p = malloc(sizeof(*p)); p->particles = malloc(count * sizeof(p->particles[0])); p->count = count; p->left_spacing = left_spacing; p->right_spacing = right_spacing; + p->has_ownership = take_ownership; for (size_t i = 0; i < count; i++) p->particles[i] = particles[i]; diff --git a/particles/list.h b/particles/list.h index 5139ba3..49a89c0 100644 --- a/particles/list.h +++ b/particles/list.h @@ -1,6 +1,9 @@ #pragma once + +#include #include "../particle.h" struct particle *particle_list_new( struct particle *particles[], size_t count, - int left_spacing, int right_spacing, int left_margin, int right_margin); + int left_spacing, int right_spacing, int left_margin, int right_margin, + bool take_ownership);