diff --git a/cmd-invoke.c b/cmd-invoke.c index dfb0f68be..c4bfad8c3 100644 --- a/cmd-invoke.c +++ b/cmd-invoke.c @@ -453,20 +453,26 @@ cmd_invoke_fire(struct cmdq_item *item, struct cmd_invoke_state *is) break; case CMD_PARSE_ASSIGN: case CMD_PARSE_HIDDEN_ASSIGN: - if (cmd_invoke_assignment(item, is, node) != 0) - return (CMD_RETURN_ERROR); + if (cmd_invoke_assignment(item, is, node) != 0) { + cmdq_error(item, "bad assignment"); + cmd_invoke_skip_sequence(is); + } break; case CMD_PARSE_IF: - if (cmd_invoke_if(item, is, node) != 0) - return (CMD_RETURN_ERROR); + if (cmd_invoke_if(item, is, node) != 0) { + cmdq_error(item, "bad condition"); + cmd_invoke_skip_sequence(is); + } break; case CMD_PARSE_ELIF: case CMD_PARSE_ELSE: break; case CMD_PARSE_COMMAND: cmd = cmd_invoke_build_command(item, is, node); - if (cmd == NULL) - return (CMD_RETURN_ERROR); + if (cmd == NULL) { + cmd_invoke_skip_sequence(is); + break; + } /* * Queue one command followed by this walker. WAIT and diff --git a/cmd-parse.y b/cmd-parse.y index bef2c509b..7f606fd26 100644 --- a/cmd-parse.y +++ b/cmd-parse.y @@ -660,18 +660,18 @@ cmd_parse_from_string(const char *s, struct cmd_parse_input *pi, char **cause) { struct cmd_parse_input input; - if (pi == NULL) { + if (pi != NULL) + memcpy(&input, pi, sizeof input); + else memset(&input, 0, sizeof input); - pi = &input; - } /* * When parsing a string, put commands in one group even if there are * multiple lines. This means { a \n b } is identical to "a ; b" when * given as an argument to another command. */ - pi->flags |= CMD_PARSE_ONEGROUP; - return (cmd_parse_from_buffer(s, strlen(s), pi, cause)); + input.flags |= CMD_PARSE_ONEGROUP; + return (cmd_parse_from_buffer(s, strlen(s), &input, cause)); } struct cmd_parse_tree * diff --git a/parser-test/tmux.h b/parser-test/tmux.h index 27d14862b..ba98efe9d 100644 --- a/parser-test/tmux.h +++ b/parser-test/tmux.h @@ -44,19 +44,4 @@ void log_debug(const char *, ...) printflike(1, 2); __dead void fatal(const char *, ...) printflike(1, 2); __dead void fatalx(const char *, ...) printflike(1, 2); -/* - * Parser input. The real struct has more fields, but the AST parser only - * touches flags, file and line. - */ -struct cmd_parse_input { - int flags; -#define CMD_PARSE_QUIET 0x1 -#define CMD_PARSE_PARSEONLY 0x2 -#define CMD_PARSE_NOALIAS 0x4 -#define CMD_PARSE_VERBOSE 0x8 -#define CMD_PARSE_ONEGROUP 0x10 - const char *file; - u_int line; -}; - #endif /* TMUX_TEST_STUB_H */ diff --git a/tmux-parser.h b/tmux-parser.h index 6de68e716..c6da35599 100644 --- a/tmux-parser.h +++ b/tmux-parser.h @@ -38,7 +38,29 @@ struct cmd_parse_tree; struct cmd_parse_node; -struct cmd_parse_input; + +enum cmd_parse_status { + CMD_PARSE_ERROR, + CMD_PARSE_SUCCESS +}; + +struct cmd_parse_result { + enum cmd_parse_status status; + struct cmd_list *cmdlist; + char *error; +}; + +struct cmd_parse_input { + int flags; +#define CMD_PARSE_QUIET 0x1 +#define CMD_PARSE_PARSEONLY 0x2 /* XXX */ +#define CMD_PARSE_NOALIAS 0x4 /* XXX */ +#define CMD_PARSE_VERBOSE 0x8 /* XXX */ +#define CMD_PARSE_ONEGROUP 0x10 + + const char *file; + u_int line; +}; enum cmd_parse_node_type { CMD_PARSE_ROOT, diff --git a/tmux.h b/tmux.h index 45eed2c80..9b1d6b8db 100644 --- a/tmux.h +++ b/tmux.h @@ -1939,32 +1939,6 @@ enum cmd_retval { CMD_RETURN_STOP }; -/* Command parse result. */ -enum cmd_parse_status { - CMD_PARSE_ERROR, - CMD_PARSE_SUCCESS -}; -struct cmd_parse_result { - enum cmd_parse_status status; - struct cmd_list *cmdlist; - char *error; -}; -struct cmd_parse_input { - int flags; -#define CMD_PARSE_QUIET 0x1 -#define CMD_PARSE_PARSEONLY 0x2 -#define CMD_PARSE_NOALIAS 0x4 -#define CMD_PARSE_VERBOSE 0x8 -#define CMD_PARSE_ONEGROUP 0x10 - - const char *file; - u_int line; - - struct cmdq_item *item; - struct client *c; - struct cmd_find_state fs; -}; - /* Command queue flags. */ #define CMDQ_STATE_REPEAT 0x1 #define CMDQ_STATE_CONTROL 0x2 @@ -3011,21 +2985,6 @@ char *cmd_template_replace(const char *, const char *, int); enum cmd_retval cmd_attach_session(struct cmdq_item *, const char *, int, int, int, const char *, int, const char *); -/* cmd-parse.c */ -struct cmd_parse_result *cmd_parse_from_file(FILE *, struct cmd_parse_input *); -struct cmd_parse_result *cmd_parse_from_string(const char *, - struct cmd_parse_input *); -enum cmd_parse_status cmd_parse_and_insert(const char *, - struct cmd_parse_input *, struct cmdq_item *, - struct cmdq_state *, char **); -enum cmd_parse_status cmd_parse_and_append(const char *, - struct cmd_parse_input *, struct client *, - struct cmdq_state *, char **); -struct cmd_parse_result *cmd_parse_from_buffer(const void *, size_t, - struct cmd_parse_input *); -struct cmd_parse_result *cmd_parse_from_arguments(struct args_value *, u_int, - struct cmd_parse_input *); - /* cmd-invoke.c */ struct cmdq_item *cmd_invoke_get(struct cmd_parse_tree *, struct cmdq_state *, int, char **);