diff options
Diffstat (limited to 'src/blocks/group.c')
| -rw-r--r-- | src/blocks/group.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/blocks/group.c b/src/blocks/group.c index eeac132..da9e6d6 100644 --- a/src/blocks/group.c +++ b/src/blocks/group.c @@ -1,3 +1,5 @@ +#include <assert.h> + #include "../block.h" #include "../any_log.h" @@ -12,6 +14,60 @@ static void block_group_clean(block_t *block) free(group->children); } +static bool block_group_resolve(block_t *block, config_t *config) +{ + block_group_t *group = (block_group_t *)block; + assert(block->type == BLOCK_GROUP); + + char **children = (char **)group->children; + group->children = NULL; + group->n_children = 0; + + if (children == NULL) + return true; + + while (children[group->n_children] != NULL) + group->n_children++; + + group->children = malloc(group->n_children * sizeof(block_t *)); + bool result = true; + + for (size_t i = 0; i < group->n_children; i++) { + for (size_t j = 0; j < config->n_blocks; j++) { + if (config->blocks[j] == block) + continue; + + if (!strcmp(children[i], config->blocks[j]->label)) { + if (config->blocks[j]->grouped) { + log_error("Block '%s' can only be in one group", children[i]); + result = false; + goto end; + } + + log_debug("Block '%s' is parent of '%s'", block->label, children[i]); + group->children[i] = config->blocks[j]; + group->children[i]->grouped = true; + + if (!block_resolve(group->children[i], config)) { + result = false; + goto end; + } + + goto next; + } + } + + log_error("Block '%s' not found (referenced by '%s')", children[i], block->label); + result = false; + goto end; +next: + } + +end: + strfreelist(children); + return result; +} + static config_status_t block_group_change(block_t *block, config_t *config, const char *key, const char *value) { if (!strcmp(key, "blocks")) { @@ -30,5 +86,6 @@ const block_scheme_t block_group_scheme = { .init_fn = block_group_init, .clean_fn = block_group_clean, .validate_fn = NULL, + .resolve_fn = block_group_resolve, .change_fn = block_group_change, }; |
