#include #include "block.h" #include "util.h" #include "any_log.h" void block_update(block_t *block) { if (block->update_cb != NULL) { struct timespec now, diff; timespec_get(&now, TIME_UTC); diff = timespec_diff(block->update_last, now); if (timespec_greater(diff, block->update_interval)) { log_value_debug("Updating block", "s:label", block->label); block->update_cb(block); block->update_last = now; } } if (block->type == BLOCK_GROUP) { for (int i = 0; i < block->group.n_children; i++) block_update(block->group.children[i]); } } 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->group.children[i] = malloc(sizeof(block_t)); block_copy(block->group.children[i], copy->group.children[i]); } } } // NOTE: This does not recursively free groups! void block_free(block_t *block) { free(block->label); if (block->type == BLOCK_TEXT) { free(block->text.text); } else if (block->type == BLOCK_GROUP) { free(block->group.children); } if (block->finalize_cb != NULL) block->finalize_cb(block); }