Libecoli  0.11.3
Extensible COmmand LIne library
parse.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2016, Olivier MATZ <zer0@droids-corp.org>
3  */
4 
21 #pragma once
22 
23 #include <limits.h>
24 #include <stdbool.h>
25 #include <stdio.h>
26 #include <sys/queue.h>
27 #include <sys/types.h>
28 
29 struct ec_node;
30 
32 struct ec_pnode;
33 
45 struct ec_pnode *ec_pnode(const struct ec_node *node);
46 
54 void ec_pnode_free(struct ec_pnode *pnode);
55 
62 void ec_pnode_free_children(struct ec_pnode *pnode);
63 
73 struct ec_pnode *ec_pnode_dup(const struct ec_pnode *pnode);
74 
98 const struct ec_strvec *ec_pnode_get_strvec(const struct ec_pnode *pnode);
99 
113 struct ec_pnode *ec_parse(const struct ec_node *node, const char *str);
114 
140 struct ec_pnode *ec_parse_strvec(const struct ec_node *node, const struct ec_strvec *strvec);
141 
145 #define EC_PARSE_NOMATCH INT_MAX
146 
172  const struct ec_node *node,
173  struct ec_pnode *pstate,
174  const struct ec_strvec *strvec
175 );
176 
188 void ec_pnode_link_child(struct ec_pnode *pnode, struct ec_pnode *child);
189 
199 void ec_pnode_unlink_child(struct ec_pnode *child);
200 
212 #define EC_PNODE_GET_ROOT(parse) \
213  ({ \
214  const struct ec_pnode *p_ = parse; /* check type */ \
215  struct ec_pnode *pnode_ = (struct ec_pnode *)parse; \
216  __typeof__(parse) res_; \
217  (void)p_; \
218  res_ = ec_pnode_get_root(pnode_); \
219  res_; \
220  })
221 
233 struct ec_pnode *ec_pnode_get_root(struct ec_pnode *pnode);
234 
243 struct ec_pnode *ec_pnode_get_parent(const struct ec_pnode *pnode);
244 
253 struct ec_pnode *ec_pnode_get_first_child(const struct ec_pnode *pnode);
254 
263 struct ec_pnode *ec_pnode_get_last_child(const struct ec_pnode *pnode);
264 
276 struct ec_pnode *ec_pnode_next(const struct ec_pnode *pnode);
277 
286 #define EC_PNODE_FOREACH_CHILD(child, pnode) \
287  for (child = ec_pnode_get_first_child(pnode); child != NULL; child = ec_pnode_next(child))
288 
297 const struct ec_node *ec_pnode_get_node(const struct ec_pnode *pnode);
298 
310 void ec_pnode_del_last_child(struct ec_pnode *pnode);
311 
324 struct ec_dict *ec_pnode_get_attrs(const struct ec_pnode *pnode);
325 
334 void ec_pnode_dump(FILE *out, const struct ec_pnode *pnode);
335 
349 const struct ec_pnode *ec_pnode_find(const struct ec_pnode *root, const char *id);
350 
373  const struct ec_pnode *root,
374  const struct ec_pnode *prev,
375  const char *id,
376  bool iter_children
377 );
378 
389 unsigned int ec_pnode_count(const struct ec_pnode *root, const char *id);
390 
400 struct ec_pnode *
401 __ec_pnode_iter_next(const struct ec_pnode *root, struct ec_pnode *pnode, bool iter_children);
402 
415 #define EC_PNODE_ITER_NEXT(root, parse, iter_children) \
416  ({ \
417  const struct ec_pnode *p_ = parse; /* check type */ \
418  struct ec_pnode *pnode_ = (struct ec_pnode *)parse; \
419  __typeof__(parse) res_; \
420  (void)p_; \
421  res_ = __ec_pnode_iter_next(root, pnode_, iter_children); \
422  res_; \
423  })
424 
433 #define EC_PNODE_FOREACH(iter, root) \
434  for ((iter) = (root); (iter) != NULL; (iter) = EC_PNODE_ITER_NEXT((root), (iter), true))
435 
445 size_t ec_pnode_len(const struct ec_pnode *pnode);
446 
455 bool ec_pnode_matches(const struct ec_pnode *pnode);
456 
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)
bool ec_pnode_matches(const struct ec_pnode *pnode)
struct ec_dict * ec_pnode_get_attrs(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)
void ec_pnode_del_last_child(struct ec_pnode *pnode)
void ec_pnode_link_child(struct ec_pnode *pnode, struct ec_pnode *child)
void ec_pnode_dump(FILE *out, const struct ec_pnode *pnode)
struct ec_pnode * ec_pnode_get_root(struct ec_pnode *pnode)
struct ec_pnode * ec_pnode_get_parent(const struct ec_pnode *pnode)
void ec_pnode_free(struct ec_pnode *pnode)
struct ec_pnode * ec_pnode_get_last_child(const struct ec_pnode *pnode)
struct ec_pnode * ec_pnode_next(const struct ec_pnode *pnode)
void ec_pnode_free_children(struct ec_pnode *pnode)
struct ec_pnode * ec_parse_strvec(const struct ec_node *node, const struct ec_strvec *strvec)
void ec_pnode_unlink_child(struct ec_pnode *child)
const struct ec_pnode * ec_pnode_find(const struct ec_pnode *root, const char *id)
struct ec_pnode * ec_parse(const struct ec_node *node, const char *str)
size_t ec_pnode_len(const struct ec_pnode *pnode)
struct ec_pnode * ec_pnode_get_first_child(const struct ec_pnode *pnode)
struct ec_pnode * ec_pnode(const struct ec_node *node)
const struct ec_node * ec_pnode_get_node(const struct ec_pnode *pnode)
const struct ec_strvec * ec_pnode_get_strvec(const struct ec_pnode *pnode)
unsigned int ec_pnode_count(const struct ec_pnode *root, const char *id)
struct ec_pnode * ec_pnode_dup(const struct ec_pnode *pnode)
struct ec_strvec * ec_strvec(void)