Add a helper function for actually parsing the command.

This commit is contained in:
nicm 2021-08-20 06:30:57 +00:00
parent 5413a73ded
commit 3177d7b617

View File

@ -778,6 +778,23 @@ cmd_parse_flatten_command(struct cmd_parse_command *cmd)
} }
} }
static struct cmd *
cmd_parse_build_command(struct cmd_parse_command *cmd,
struct cmd_parse_input *pi, u_int line, struct cmd_parse_result *pr)
{
struct cmd *add;
char *cause;
add = cmd_parse(cmd->argc, cmd->argv, pi->file, line, &cause);
if (add == NULL) {
pr->status = CMD_PARSE_ERROR;
pr->error = cmd_parse_get_error(pi->file, line, cause);
free(cause);
return (NULL);
}
return (add);
}
static struct cmd_parse_result * static struct cmd_parse_result *
cmd_parse_build_commands(struct cmd_parse_commands *cmds, cmd_parse_build_commands(struct cmd_parse_commands *cmds,
struct cmd_parse_input *pi) struct cmd_parse_input *pi)
@ -787,7 +804,7 @@ cmd_parse_build_commands(struct cmd_parse_commands *cmds,
struct cmd_parse_command *cmd, *cmd2, *next, *next2, *after; struct cmd_parse_command *cmd, *cmd2, *next, *next2, *after;
u_int line = UINT_MAX; u_int line = UINT_MAX;
int i; int i;
struct cmd_list *cmdlist = NULL, *result; struct cmd_list *current = NULL, *result;
struct cmd *add; struct cmd *add;
char *name, *alias, *cause, *s; char *name, *alias, *cause, *s;
@ -859,36 +876,30 @@ cmd_parse_build_commands(struct cmd_parse_commands *cmds,
*/ */
result = cmd_list_new(); result = cmd_list_new();
TAILQ_FOREACH(cmd, cmds, entry) { TAILQ_FOREACH(cmd, cmds, entry) {
name = cmd->argv[0]; if (((~pi->flags & CMD_PARSE_ONEGROUP) && cmd->line != line)) {
log_debug("%s: %u %s", __func__, cmd->line, name); if (current != NULL) {
cmd_log_argv(cmd->argc, cmd->argv, __func__); cmd_parse_print_commands(pi, line, current);
cmd_list_move(result, current);
if (cmdlist == NULL || cmd_list_free(current);
((~pi->flags & CMD_PARSE_ONEGROUP) && cmd->line != line)) {
if (cmdlist != NULL) {
cmd_parse_print_commands(pi, line, cmdlist);
cmd_list_move(result, cmdlist);
cmd_list_free(cmdlist);
} }
cmdlist = cmd_list_new(); current = cmd_list_new();
} }
if (current == NULL)
current = cmd_list_new();
line = cmd->line; line = cmd->line;
add = cmd_parse(cmd->argc, cmd->argv, pi->file, line, &cause); add = cmd_parse_build_command(cmd, pi, line, &pr);
if (add == NULL) { if (add == NULL) {
cmd_list_free(result); cmd_list_free(result);
pr.status = CMD_PARSE_ERROR; cmd_list_free(current);
pr.error = cmd_parse_get_error(pi->file, line, cause);
free(cause);
cmd_list_free(cmdlist);
goto out; goto out;
} }
cmd_list_append(cmdlist, add); cmd_list_append(current, add);
} }
if (cmdlist != NULL) { if (current != NULL) {
cmd_parse_print_commands(pi, line, cmdlist); cmd_parse_print_commands(pi, line, current);
cmd_list_move(result, cmdlist); cmd_list_move(result, current);
cmd_list_free(cmdlist); cmd_list_free(current);
} }
s = cmd_list_print(result, 0); s = cmd_list_print(result, 0);