X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=src%2Fecoli_node_helper.c;fp=src%2Fecoli_node_helper.c;h=94811f23ca9041b94e7133a51f64d87643b74cc9;hb=18d03456d96f7a086a2ccc82ce97fcf056848d90;hp=0000000000000000000000000000000000000000;hpb=a1571d413d2acac5d4a4fbdf2e50b2d1a6da3aa6;p=protos%2Flibecoli.git diff --git a/src/ecoli_node_helper.c b/src/ecoli_node_helper.c new file mode 100644 index 0000000..94811f2 --- /dev/null +++ b/src/ecoli_node_helper.c @@ -0,0 +1,94 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2018, Olivier MATZ + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +struct ec_node ** +ec_node_config_node_list_to_table(const struct ec_config *config, + size_t *len) +{ + struct ec_node **table = NULL; + struct ec_config *child; + ssize_t n, i; + + *len = 0; + + if (config == NULL) { + errno = EINVAL; + return NULL; + } + + if (ec_config_get_type(config) != EC_CONFIG_TYPE_LIST) { + errno = EINVAL; + return NULL; + } + + n = ec_config_count(config); + if (n < 0) + return NULL; + + table = ec_calloc(n, sizeof(*table)); + if (table == NULL) + goto fail; + + n = 0; + TAILQ_FOREACH(child, &config->list, next) { + if (ec_config_get_type(child) != EC_CONFIG_TYPE_NODE) { + errno = EINVAL; + goto fail; + } + table[n] = ec_node_clone(child->node); + n++; + } + + *len = n; + + return table; + +fail: + if (table != NULL) { + for (i = 0; i < n; i++) + ec_node_free(table[i]); + } + ec_free(table); + + return NULL; +} + +struct ec_config * +ec_node_config_node_list_from_vargs(va_list ap) +{ + struct ec_config *list = NULL; + struct ec_node *node = va_arg(ap, struct ec_node *); + + list = ec_config_list(); + if (list == NULL) + goto fail; + + for (; node != EC_NODE_ENDLIST; node = va_arg(ap, struct ec_node *)) { + if (node == NULL) + goto fail; + + if (ec_config_list_add(list, ec_config_node(node)) < 0) + goto fail; + } + + return list; + +fail: + for (; node != EC_NODE_ENDLIST; node = va_arg(ap, struct ec_node *)) + ec_node_free(node); + ec_config_free(list); + + return NULL; +}