int cli_execute(int arg_count, char *arg_values[]) { struct cli_node *node; struct cli_node *nodes[CLI_MAX_KEYWORDS]; int num_nodes = CLI_MAX_KEYWORDS; int result = 0; int argc = arg_count; char *argv[CLI_MAX_ARGC]; int arg; if (argc > 0) { if (argc == 1) { argc = cli_rl_buffer_to_argv(arg_values[0], arg_values[0] + strlen(arg_values[0]), &argv[0], CLI_MAX_ARGC); } else { for (arg = 0; arg < argc; arg++) { argv[arg] = arg_values[arg]; } argv[argc] = NULL; } node = cli_find_command(argc, &argv[0], &nodes[0], &num_nodes); if (node != NULL) { int arg_num = 0; switch (node->type) { case CLI_NODE_TYPE_COMMAND: result = (*node->action)(node, 0, NULL, &arg_num); if (result < 0) { printf("Error at or near '%s'\n", argv[node->level + arg_num]); } break; case CLI_NODE_TYPE_KEYWORD: printf("Ambiguous command\n"); break; case CLI_NODE_TYPE_ARG: result = (*node->parent->action)(node->parent, argc - node->parent->level - 1, &argv[node->parent->level + 1], &arg_num); if (result < 0) { printf("Error at or near '%s'\n", argv[node->parent->level + arg_num]); } break; case CLI_NODE_TYPE_END: break; } } else { printf("Error at or near '%s'\n", argv[num_nodes]); } } else if (argc < 0) { printf("Incomplete command\n"); } return result; }
int main(int argc, char *argv[]) { int result; struct cli_node *node; struct cli_node *matches[30]; int num_matches = 30; int match; cli_init("test"); result = cli_add_commands(&cmds[0]); cli_dump_commands(); printf("dump: result = %d\n", result); if (argc > 1) { node = cli_find_command(argc - 1, &argv[1], &matches[0], &num_matches); if (node != NULL) { for (match = 0; match < num_matches; match++) { node = matches[match]; printf("node[%d] = %p (%s:%s)\n", match, node, node->type == CLI_NODE_TYPE_KEYWORD ? "KEYWORD" : "COMMAND", node->keyword); } } else { printf("find: invalid command sequence\n"); } } else { char *argv[10]; banner("test"); argv[0] = "test"; argv[1] = NULL; node = cli_find_command(1, &argv[0], &matches[0], &num_matches); if (node != NULL) { dump_buddies(node, 0); dump_kids(node); } else { printf("UNMATCHED\n"); } banner("tunnel"); argv[0] = "tunnel"; argv[1] = NULL; node = cli_find_command(1, &argv[0], &matches[0], &num_matches); if (node != NULL) { dump_buddies(node, 0); dump_kids(node); } else { printf("UNMATCHED\n"); } banner("system"); argv[0] = "system"; argv[1] = NULL; node = cli_find_command(1, &argv[0], &matches[0], &num_matches); if (node != NULL) { dump_buddies(node, 0); dump_kids(node); } else { printf("UNMATCHED\n"); } banner("system modify"); argv[0] = "system"; argv[1] = "modify"; argv[2] = NULL; node = cli_find_command(2, &argv[0], &matches[0], &num_matches); if (node != NULL) { dump_buddies(node, 0); dump_kids(node); } else { printf("UNMATCHED\n"); } banner("test one"); argv[0] = "test"; argv[1] = "one"; argv[2] = NULL; node = cli_find_command(2, &argv[0], &matches[0], &num_matches); if (node != NULL) { printf("matches node '%s', level %d\n", node->keyword, node->level); } else { printf("UNMATCHED\n"); } banner("test one two run"); argv[0] = "test"; argv[1] = "one"; argv[2] = "two"; argv[3] = "run"; argv[4] = NULL; node = cli_find_command(4, &argv[0], &matches[0], &num_matches); printf("test one two run"); if (node != NULL) { printf("matches node '%s', level %d\n", node->keyword, node->level); } else { printf("UNMATCHED\n"); } banner("tunnel profile create"); argv[0] = "tunnel"; argv[1] = "profile"; argv[2] = "create"; argv[3] = NULL; node = cli_find_command(3, &argv[0], &matches[0], &num_matches); printf("tunnel profile create "); if (node != NULL) { printf("matches node '%s', level %d\n", node->keyword, node->level); } else { printf("UNMATCHED\n"); } banner("system modify trace_flags=1 more_flags=2 debug"); argv[0] = "system"; argv[1] = "modify"; argv[2] = "trace_flags"; argv[3] = "1"; argv[4] = "more_flags"; argv[5] = "2"; argv[6] = "debug"; argv[7] = NULL; node = cli_find_command(7, &argv[0], &matches[0], &num_matches); if (node != NULL) { printf("matches node '%s', level %d\n", node->keyword, node->level); } else { printf("UNMATCHED\n"); } // exit(0); cli_run(); } return 0; }