add meson support
[protos/libecoli.git] / src / ecoli_node_helper.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2018, Olivier MATZ <zer0@droids-corp.org>
3  */
4
5 #include <sys/types.h>
6 #include <sys/queue.h>
7 #include <stdarg.h>
8 #include <stddef.h>
9 #include <errno.h>
10
11 #include <ecoli_malloc.h>
12 #include <ecoli_config.h>
13 #include <ecoli_node.h>
14 #include <ecoli_node_helper.h>
15
16 struct ec_node **
17 ec_node_config_node_list_to_table(const struct ec_config *config,
18                                 size_t *len)
19 {
20         struct ec_node **table = NULL;
21         struct ec_config *child;
22         ssize_t n, i;
23
24         *len = 0;
25
26         if (config == NULL) {
27                 errno = EINVAL;
28                 return NULL;
29         }
30
31         if (ec_config_get_type(config) != EC_CONFIG_TYPE_LIST) {
32                 errno = EINVAL;
33                 return NULL;
34         }
35
36         n = ec_config_count(config);
37         if (n < 0)
38                 return NULL;
39
40         table = ec_calloc(n, sizeof(*table));
41         if (table == NULL)
42                 goto fail;
43
44         n = 0;
45         TAILQ_FOREACH(child, &config->list, next) {
46                 if (ec_config_get_type(child) != EC_CONFIG_TYPE_NODE) {
47                         errno = EINVAL;
48                         goto fail;
49                 }
50                 table[n] = ec_node_clone(child->node);
51                 n++;
52         }
53
54         *len = n;
55
56         return table;
57
58 fail:
59         if (table != NULL) {
60                 for (i = 0; i < n; i++)
61                         ec_node_free(table[i]);
62         }
63         ec_free(table);
64
65         return NULL;
66 }
67
68 struct ec_config *
69 ec_node_config_node_list_from_vargs(va_list ap)
70 {
71         struct ec_config *list = NULL;
72         struct ec_node *node = va_arg(ap, struct ec_node *);
73
74         list = ec_config_list();
75         if (list == NULL)
76                 goto fail;
77
78         for (; node != EC_NODE_ENDLIST; node = va_arg(ap, struct ec_node *)) {
79                 if (node == NULL)
80                         goto fail;
81
82                 if (ec_config_list_add(list, ec_config_node(node)) < 0)
83                         goto fail;
84         }
85
86         return list;
87
88 fail:
89         for (; node != EC_NODE_ENDLIST; node = va_arg(ap, struct ec_node *))
90                 ec_node_free(node);
91         ec_config_free(list);
92
93         return NULL;
94 }