aboutsummaryrefslogtreecommitdiff
path: root/src/block.c
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2024-07-11 15:10:24 +0200
committerFederico Angelilli <code@fedang.net>2024-07-11 15:10:24 +0200
commit6942efee2d41a768501e23bd06f38dbb4fde197b (patch)
tree9f7723da2d5e21ffe1f47c2cf4e68363ec2f75b4 /src/block.c
parent226c6b5bf79912b657c7cb4c5a679891030fa453 (diff)
Copy blocks
Diffstat (limited to 'src/block.c')
-rw-r--r--src/block.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/block.c b/src/block.c
index e739ceb..2b31de8 100644
--- a/src/block.c
+++ b/src/block.c
@@ -1,3 +1,5 @@
+#include <string.h>
+
#include "block.h"
#include "util.h"
#include "any_log.h"
@@ -24,6 +26,23 @@ void block_update(block_t *block)
}
}
+void block_copy(block_t *copy, const block_t *block)
+{
+ memcpy(copy, block, sizeof(block_t));
+
+ // NOTE: Strings must be copied
+ copy->label = strcopy(block->label);
+
+ if (block->type == BLOCK_TEXT) {
+ copy->text.text = strcopy(block->text.text);
+ } else if (block->type == BLOCK_GROUP) {
+ copy->group.children = calloc(block->group.n_children, sizeof(block_t));
+
+ for (int i = 0; i < block->group.n_children; i++)
+ block_copy(&block->group.children[i], &copy->group.children[i]);
+ }
+}
+
void block_free(block_t *block)
{
free(block->label);