#include #include #include "block.h" #include "util.h" #include "any_log.h" void block_update(block_t *block) { if (block->update_fn != NULL) { struct timespec now, diff; timespec_get(&now, TIME_UTC); diff = timespec_diff(now, block->update_last); if (timespec_greater(diff, block->update_interval)) { log_value_trace("Updating block", "s:label", block->label, "g:ts", ANY_LOG_FORMATTER(timespec_print), &now); block->update_fn(block); block->update_last = now; } } // NOTE: Block spec should handle its children by itself... // if (block->type == BLOCK_GROUP) { block_group_t *group = (block_group_t *)block; for (size_t i = 0; i < group->n_children; i++) block_update(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); // } // assert(block->clean_fn != NULL); block->clean_fn(block); }