Libecoli 0.5.0
Extensible COmmand LIne library
Loading...
Searching...
No Matches
ecoli_parse.h
1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright 2016, Olivier MATZ <zer0@droids-corp.org>
3 */
4
20
21#ifndef ECOLI_PNODE_
22#define ECOLI_PNODE_
23
24#include <sys/queue.h>
25#include <sys/types.h>
26#include <limits.h>
27#include <stdio.h>
28#include <stdbool.h>
29
30struct ec_node;
31
33struct ec_pnode;
34
46struct ec_pnode *ec_pnode(const struct ec_node *node);
47
55void ec_pnode_free(struct ec_pnode *pnode);
56
63void ec_pnode_free_children(struct ec_pnode *pnode);
64
74struct ec_pnode *ec_pnode_dup(const struct ec_pnode *pnode);
75
99const struct ec_strvec *ec_pnode_get_strvec(const struct ec_pnode *pnode);
100
114struct ec_pnode *ec_parse(const struct ec_node *node, const char *str);
115
141struct ec_pnode *ec_parse_strvec(const struct ec_node *node,
142 const struct ec_strvec *strvec);
143
147#define EC_PARSE_NOMATCH INT_MAX
148
173int ec_parse_child(const struct ec_node *node, struct ec_pnode *pstate,
174 const struct ec_strvec *strvec);
175
187void ec_pnode_link_child(struct ec_pnode *pnode, struct ec_pnode *child);
188
198void ec_pnode_unlink_child(struct ec_pnode *child);
199
211#define EC_PNODE_GET_ROOT(parse) ({ \
212 const struct ec_pnode *p_ = parse; /* check type */ \
213 struct ec_pnode *pnode_ = (struct ec_pnode *)parse; \
214 __typeof__(parse) res_; \
215 (void)p_; \
216 res_ = ec_pnode_get_root(pnode_); \
217 res_; \
218})
219
231struct ec_pnode *ec_pnode_get_root(struct ec_pnode *pnode);
232
241struct ec_pnode *ec_pnode_get_parent(const struct ec_pnode *pnode);
242
251struct ec_pnode *ec_pnode_get_first_child(const struct ec_pnode *pnode);
252
261struct ec_pnode *ec_pnode_get_last_child(const struct ec_pnode *pnode);
262
274struct ec_pnode *ec_pnode_next(const struct ec_pnode *pnode);
275
284#define EC_PNODE_FOREACH_CHILD(child, pnode) \
285 for (child = ec_pnode_get_first_child(pnode); \
286 child != NULL; \
287 child = ec_pnode_next(child)) \
288
289
297const struct ec_node *ec_pnode_get_node(const struct ec_pnode *pnode);
298
311
324struct ec_dict *ec_pnode_get_attrs(struct ec_pnode *pnode);
325
334void ec_pnode_dump(FILE *out, const struct ec_pnode *pnode);
335
349const struct ec_pnode *ec_pnode_find(const struct ec_pnode *root, const char *id);
350
372const struct ec_pnode *ec_pnode_find_next(const struct ec_pnode *root,
373 const struct ec_pnode *prev,
374 const char *id, bool iter_children);
375
382struct ec_pnode *__ec_pnode_iter_next(const struct ec_pnode *root,
383 struct ec_pnode *pnode, bool iter_children);
384
385/* keep the const if any */
386#define EC_PNODE_ITER_NEXT(root, parse, iter_children) ({ \
387 const struct ec_pnode *p_ = parse; /* check type */ \
388 struct ec_pnode *pnode_ = (struct ec_pnode *)parse; \
389 __typeof__(parse) res_; \
390 (void)p_; \
391 res_ = __ec_pnode_iter_next(root, pnode_, iter_children); \
392 res_; \
393})
394
398size_t ec_pnode_len(const struct ec_pnode *pnode);
399
403size_t ec_pnode_matches(const struct ec_pnode *pnode);
404
405#endif
406
struct ec_dict * ec_dict(void)
struct ec_node * ec_node(const char *typename, const char *id)
int ec_parse_child(const struct ec_node *node, struct ec_pnode *pstate, const struct ec_strvec *strvec)
struct ec_pnode * ec_pnode_next(const struct ec_pnode *pnode)
struct ec_pnode * ec_pnode_get_parent(const struct ec_pnode *pnode)
struct ec_pnode * ec_parse(const struct ec_node *node, const char *str)
void ec_pnode_del_last_child(struct ec_pnode *pnode)
void ec_pnode_link_child(struct ec_pnode *pnode, struct ec_pnode *child)
struct ec_pnode * ec_pnode_get_last_child(const struct ec_pnode *pnode)
struct ec_pnode * ec_parse_strvec(const struct ec_node *node, const struct ec_strvec *strvec)
void ec_pnode_dump(FILE *out, const struct ec_pnode *pnode)
size_t ec_pnode_matches(const struct ec_pnode *pnode)
void ec_pnode_free(struct ec_pnode *pnode)
const struct ec_strvec * ec_pnode_get_strvec(const struct ec_pnode *pnode)
const struct ec_pnode * ec_pnode_find(const struct ec_pnode *root, const char *id)
struct ec_pnode * ec_pnode_get_root(struct ec_pnode *pnode)
void ec_pnode_free_children(struct ec_pnode *pnode)
struct ec_dict * ec_pnode_get_attrs(struct ec_pnode *pnode)
void ec_pnode_unlink_child(struct ec_pnode *child)
struct ec_pnode * ec_pnode_get_first_child(const struct ec_pnode *pnode)
const struct ec_pnode * ec_pnode_find_next(const struct ec_pnode *root, const struct ec_pnode *prev, const char *id, bool iter_children)
size_t ec_pnode_len(const struct ec_pnode *pnode)
struct ec_pnode * ec_pnode_dup(const struct ec_pnode *pnode)
const struct ec_node * ec_pnode_get_node(const struct ec_pnode *pnode)
struct ec_pnode * ec_pnode(const struct ec_node *node)
struct ec_strvec * ec_strvec(void)