Loading...
Searching...
No Matches
node.h
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright 2016, Olivier MATZ <zer0@droids-corp.org>
*/
#pragma once
#include <stdbool.h>
#include <stdio.h>
#include <sys/queue.h>
#include <sys/types.h>
#define EC_NO_ID ""
struct ec_node;
struct ec_node_iter;
struct ec_pnode;
struct ec_comp;
struct ec_strvec;
struct ec_dict;
struct ec_config;
struct ec_config_schema;
#define EC_NODE_TYPE_REGISTER(t) \
static void ec_node_init_##t(void); \
static void __attribute__((constructor, used)) ec_node_init_##t(void) \
{ \
if (ec_node_type_register(&t, 0) < 0) \
fprintf(stderr, "cannot register node type %s\n", t.name); \
}
#define EC_NODE_TYPE_REGISTER_OVERRIDE(t) \
static void ec_node_init_##t(void); \
static void __attribute__((constructor, used)) ec_node_init_##t(void) \
{ \
if (ec_node_type_register(&t, 1) < 0) \
fprintf(stderr, "cannot register node type %s\n", t.name); \
}
typedef int (*ec_node_set_config_t)(struct ec_node *node, const struct ec_config *config);
typedef int (*ec_parse_t)(
const struct ec_node *node,
struct ec_pnode *pstate,
const struct ec_strvec *strvec
);
typedef int (*ec_complete_t)(
const struct ec_node *node,
struct ec_comp *comp,
const struct ec_strvec *strvec
);
typedef char *(*ec_node_desc_t)(const struct ec_node *);
typedef int (*ec_node_init_priv_t)(struct ec_node *);
typedef void (*ec_node_free_priv_t)(struct ec_node *);
typedef size_t (*ec_node_get_children_count_t)(const struct ec_node *);
typedef int (*ec_node_get_child_t)(
const struct ec_node *,
size_t i,
struct ec_node **child,
unsigned int *refs
);
struct ec_node_type {
TAILQ_ENTRY(ec_node_type) next;
const char *name;
const struct ec_config_schema *schema;
size_t size;
ec_node_set_config_t set_config;
ec_parse_t parse;
ec_complete_t complete;
ec_node_desc_t desc;
ec_node_init_priv_t init_priv;
ec_node_free_priv_t free_priv;
ec_node_get_children_count_t get_children_count;
ec_node_get_child_t get_child;
};
TAILQ_HEAD(ec_node_type_list, ec_node_type);
extern struct ec_node_type_list node_type_list;
int ec_node_type_register(struct ec_node_type *type, bool override);
const struct ec_node_type *ec_node_type_lookup(const char *name);
void ec_node_type_dump(FILE *out);
const struct ec_config_schema *ec_node_type_schema(const struct ec_node_type *type);
const char *ec_node_type_name(const struct ec_node_type *type);
struct ec_node *ec_node_from_type(const struct ec_node_type *type, const char *id);
struct ec_node *ec_node(const char *typename, const char *id);
struct ec_node *ec_node_clone(struct ec_node *node);
void ec_node_free(struct ec_node *node);
int ec_node_set_config(struct ec_node *node, struct ec_config *config);
const struct ec_config *ec_node_get_config(const struct ec_node *node);
size_t ec_node_get_children_count(const struct ec_node *node);
int ec_node_get_child(const struct ec_node *node, size_t i, struct ec_node **child);
const struct ec_node_type *ec_node_type(const struct ec_node *node);
struct ec_dict *ec_node_attrs(const struct ec_node *node);
const char *ec_node_id(const struct ec_node *node);
char *ec_node_desc(const struct ec_node *node);
void ec_node_dump(FILE *out, const struct ec_node *node);
struct ec_node *ec_node_find(struct ec_node *node, const char *id);
struct ec_node_iter *ec_node_iter(struct ec_node *node);
struct ec_node_iter *
ec_node_iter_next(struct ec_node_iter *root, struct ec_node_iter *iter, bool iter_children);
void ec_node_iter_free(struct ec_node_iter *iter);
struct ec_node *ec_node_iter_get_node(struct ec_node_iter *iter);
struct ec_node_iter *ec_node_iter_get_parent(struct ec_node_iter *iter);
int ec_node_check_type(const struct ec_node *node, const struct ec_node_type *type);
const char *ec_node_get_type_name(const struct ec_node *node);
void *ec_node_priv(const struct ec_node *node);
void ec_node_schema_dump(FILE *out, const struct ec_node *node);
ec_comp
struct ec_comp * ec_comp(void)
Create an empty completion object (list of completion items).
ec_dict
struct ec_dict * ec_dict(void)
Create a hash table.
ec_node_clone
struct ec_node * ec_node_clone(struct ec_node *node)
Clone a grammar node.
ec_node_id
const char * ec_node_id(const struct ec_node *node)
Get node identifier.
ec_node_iter_get_node
struct ec_node * ec_node_iter_get_node(struct ec_node_iter *iter)
Get the grammar node referenced by the iterator node.
ec_node_get_child
int ec_node_get_child(const struct ec_node *node, size_t i, struct ec_node **child)
Get the n-th child of a node.
ec_node_iter_free
void ec_node_iter_free(struct ec_node_iter *iter)
Free a grammar graph iterator.
ec_node_get_type_name
const char * ec_node_get_type_name(const struct ec_node *node)
Get the type name of a grammar node.
ec_node_from_type
struct ec_node * ec_node_from_type(const struct ec_node_type *type, const char *id)
Create a new node when the type is known.
ec_node_dump
void ec_node_dump(FILE *out, const struct ec_node *node)
Dump a grammar tree.
ec_node_free_priv_t
void(* ec_node_free_priv_t)(struct ec_node *)
Free the node private area.
Definition node.h:268
ec_node
struct ec_node * ec_node(const char *typename, const char *id)
Create a new node from its type name.
ec_node_attrs
struct ec_dict * ec_node_attrs(const struct ec_node *node)
Get the attributes dict of the node.
ec_node_find
struct ec_node * ec_node_find(struct ec_node *node, const char *id)
Find a node from its identifier string.
ec_node_type_dump
void ec_node_type_dump(FILE *out)
Dump registered node types.
ec_node_check_type
int ec_node_check_type(const struct ec_node *node, const struct ec_node_type *type)
Check the type of a node.
ec_node_set_config
int ec_node_set_config(struct ec_node *node, struct ec_config *config)
Set node configuration.
ec_node_iter
struct ec_node_iter * ec_node_iter(struct ec_node *node)
Create an iterator on a grammar tree.
node_type_list
struct ec_node_type_list node_type_list
The list of registered node types.
ec_node_get_child_t
int(* ec_node_get_child_t)(const struct ec_node *, size_t i, struct ec_node **child, unsigned int *refs)
Get the i-th child node.
Definition node.h:298
ec_node_get_children_count
size_t ec_node_get_children_count(const struct ec_node *node)
Return the number of children for a node.
ec_node_iter_get_parent
struct ec_node_iter * ec_node_iter_get_parent(struct ec_node_iter *iter)
Get the parent of an iterator node.
ec_node_desc_t
char *(* ec_node_desc_t)(const struct ec_node *)
Get the short description of a grammar node.
Definition node.h:241
ec_node_iter_next
struct ec_node_iter * ec_node_iter_next(struct ec_node_iter *root, struct ec_node_iter *iter, bool iter_children)
Iterate to the next node.
ec_node_get_config
const struct ec_config * ec_node_get_config(const struct ec_node *node)
Get the current node configuration.
ec_node_set_config_t
int(* ec_node_set_config_t)(struct ec_node *node, const struct ec_config *config)
Function type used to configure a node.
Definition node.h:138
ec_node_type
const struct ec_node_type * ec_node_type(const struct ec_node *node)
Get the type of a node.
ec_node_type_register
int ec_node_type_register(struct ec_node_type *type, bool override)
Register a node type.
ec_node_init_priv_t
int(* ec_node_init_priv_t)(struct ec_node *)
Initialize the node private area.
Definition node.h:257
ec_complete_t
int(* ec_complete_t)(const struct ec_node *node, struct ec_comp *comp, const struct ec_strvec *strvec)
Get completion items using the given grammar graph.
Definition node.h:210
ec_node_get_children_count_t
size_t(* ec_node_get_children_count_t)(const struct ec_node *)
Count the number of node children.
Definition node.h:280
ec_node_type_schema
const struct ec_config_schema * ec_node_type_schema(const struct ec_node_type *type)
Get the config schema of a node type.
ec_node_desc
char * ec_node_desc(const struct ec_node *node)
Get node short description.
ec_parse_t
int(* ec_parse_t)(const struct ec_node *node, struct ec_pnode *pstate, const struct ec_strvec *strvec)
Parse a string vector using the given grammar graph.
Definition node.h:163
ec_node_schema_dump
void ec_node_schema_dump(FILE *out, const struct ec_node *node)
Dump the node configuration schema.
ec_node_type_lookup
const struct ec_node_type * ec_node_type_lookup(const char *name)
Lookup node type by name.
ec_node_type_name
const char * ec_node_type_name(const struct ec_node_type *type)
Get the name of a node type.
ec_node_priv
void * ec_node_priv(const struct ec_node *node)
Get the pointer to the node private area.
ec_node_free
void ec_node_free(struct ec_node *node)
Decrement node reference counter and free the node if it is the last reference.
ec_pnode
struct ec_pnode * ec_pnode(const struct ec_node *node)
Create an empty parsing tree.
ec_strvec
struct ec_strvec * ec_strvec(void)
Allocate a new empty string vector.
ec_config_schema
Structure describing the format of a configuration value.
Definition config.h:50
ec_config
Structure storing the configuration data.
Definition config.h:66
ec_node_type
A structure describing a grammar node type.
Definition node.h:312