Skip to content
Extraits de code Groupes Projets
Vérifiée Valider 0f657e6d rédigé par Kubat's avatar Kubat
Parcourir les fichiers

CMD: Add the 'exec from trie' function, to use functions registered inside it

parent 44ea9ada
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!162Add a trie structure to get all the commands + various fixes
......@@ -43,6 +43,10 @@ struct cmd_trie_node {
struct cmd_trie_node *children[CHARS_MAX]; /* Childrens, a byte is 256 possible values */
};
/* The cmd_trie root for all the liblektor, it's OK because we have only one
* list of possible commands. */
static struct cmd_trie_node *cmd_trie_root = NULL;
PRIVATE_FUNCTION struct cmd_trie_node *
cmd_trie_new(void)
{
......@@ -92,6 +96,76 @@ cmd_trie_insert(struct cmd_trie_node *root, const char *signed_cmd_name,
}
}
PRIVATE_FUNCTION struct cmd_trie_node *
cmd_trie_find(struct cmd_trie_node *root, const char *signed_cmd_name)
{
FAIL_UNLESS(root, "Passing an empty trie root");
unsigned const char *cmd_name = (unsigned const char *)signed_cmd_name;
size_t cmd_name_index = 0;
size_t current_char = cmd_name[cmd_name_index];
while (current_char) {
/* No node for the command */
if (root->children[current_char] == NULL) {
LOG_WARN("CMD_TRIE", "Failed to find the command: %s", signed_cmd_name);
return NULL;
}
cmd_name_index += 1;
root = root->children[current_char];
current_char = cmd_name[cmd_name_index];
}
if (root->type == LKT_COMMAND_NULL) {
LOG_WARN("CMD_TRIE", "Failed to find the command: %s", signed_cmd_name);
return NULL;
}
LOG_INFO("CMD_TRIE", "Found command: %s", signed_cmd_name);
return root;
}
PRIVATE_FUNCTION bool
cmd_trie_exec(struct cmd_trie_node *root, const char *signed_cmd_name, va_list *args_list)
{
FAIL_UNLESS(root, "Passing an empty trie root");
struct cmd_trie_node *node = cmd_trie_find(root, signed_cmd_name);
if (node == NULL)
return false;
/* Possibly used variables */
struct lkt_state *srv;
size_t c;
char **args;
int arg_int;
union {
void (*base)(void);
bool (*type_simple)(struct lkt_state *, size_t, char *[LKT_MESSAGE_ARGS_MAX]);
bool (*type_int)(struct lkt_state *, size_t, char *[LKT_MESSAGE_ARGS_MAX], int);
} cmd;
cmd.base = node->cmd_ptr;
switch (node->type) {
case LKT_COMMAND_SIMPLE:
srv = (struct lkt_state *)va_arg(*args_list, struct lkt_state *);
c = (size_t)va_arg(*args_list, size_t);
args = (char **)va_arg(*args_list, char *[LKT_MESSAGE_MAX]);
return cmd.type_simple(srv, c, args);
case LKT_COMMAND_INTEGER:
srv = (struct lkt_state *)va_arg(*args_list, struct lkt_state *);
c = (size_t)va_arg(*args_list, size_t);
args = (char **)va_arg(*args_list, char *[LKT_MESSAGE_MAX]);
arg_int = (int)va_arg(*args_list, int);
return cmd.type_int(srv, c, args, arg_int);
case LKT_COMMAND_NULL:
return false;
}
}
PRIVATE_FUNCTION void
___cmd_trie_print(struct cmd_trie_node *root, char *old_prefix, const size_t length)
{
......@@ -127,8 +201,6 @@ cmd_trie_print(struct cmd_trie_node *root)
___cmd_trie_print(root, NULL, 0);
}
struct cmd_trie_node *cmd_trie_root = NULL;
CONSTRUCTOR_FUNCTION
___cmd_trie_init(void)
{
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter