The line number needs to be updated only after the \n is processed by

the parser, so store a flag and update it next time around. Also each
new line needs its own shared data.
This commit is contained in:
nicm 2019-05-29 19:34:42 +00:00 committed by Nicholas Marriott
parent a05c3a7aa6
commit 75d112c484
2 changed files with 26 additions and 9 deletions

View File

@ -58,6 +58,7 @@ struct cmd_parse_state {
size_t len; size_t len;
size_t off; size_t off;
int eol;
int eof; int eof;
struct cmd_parse_input *input; struct cmd_parse_input *input;
u_int escapes; u_int escapes;
@ -933,6 +934,10 @@ yylex(void)
char *token, *cp; char *token, *cp;
int ch, next; int ch, next;
if (ps->eol)
ps->input->line++;
ps->eol = 0;
for (;;) { for (;;) {
ch = yylex_getc(); ch = yylex_getc();
@ -959,7 +964,7 @@ yylex(void)
/* /*
* End of line. Update the line number. * End of line. Update the line number.
*/ */
ps->input->line++; ps->eol = 1;
return ('\n'); return ('\n');
} }

View File

@ -203,16 +203,20 @@ cmdq_get_command(struct cmd_list *cmdlist, struct cmd_find_state *current,
struct cmdq_item *item, *first = NULL, *last = NULL; struct cmdq_item *item, *first = NULL, *last = NULL;
struct cmd *cmd; struct cmd *cmd;
struct cmdq_shared *shared; struct cmdq_shared *shared;
u_int group = 0;
shared = xcalloc(1, sizeof *shared);
if (current != NULL)
cmd_find_copy_state(&shared->current, current);
else
cmd_find_clear_state(&shared->current, 0);
if (m != NULL)
memcpy(&shared->mouse, m, sizeof shared->mouse);
TAILQ_FOREACH(cmd, &cmdlist->list, qentry) { TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
if (cmd->group != group) {
shared = xcalloc(1, sizeof *shared);
if (current != NULL)
cmd_find_copy_state(&shared->current, current);
else
cmd_find_clear_state(&shared->current, 0);
if (m != NULL)
memcpy(&shared->mouse, m, sizeof shared->mouse);
group = cmd->group;
}
item = xcalloc(1, sizeof *item); item = xcalloc(1, sizeof *item);
xasprintf(&item->name, "[%s/%p]", cmd->entry->name, item); xasprintf(&item->name, "[%s/%p]", cmd->entry->name, item);
item->type = CMDQ_COMMAND; item->type = CMDQ_COMMAND;
@ -263,12 +267,20 @@ static enum cmd_retval
cmdq_fire_command(struct cmdq_item *item) cmdq_fire_command(struct cmdq_item *item)
{ {
struct client *c = item->client; struct client *c = item->client;
const char *name = cmdq_name(c);
struct cmdq_shared *shared = item->shared; struct cmdq_shared *shared = item->shared;
struct cmd *cmd = item->cmd; struct cmd *cmd = item->cmd;
const struct cmd_entry *entry = cmd->entry; const struct cmd_entry *entry = cmd->entry;
enum cmd_retval retval; enum cmd_retval retval;
struct cmd_find_state *fsp, fs; struct cmd_find_state *fsp, fs;
int flags; int flags;
char *tmp;
if (log_get_level() > 1) {
tmp = cmd_print(cmd);
log_debug("%s %s: (%u) %s", __func__, name, item->group, tmp);
free(tmp);
}
flags = !!(shared->flags & CMDQ_SHARED_CONTROL); flags = !!(shared->flags & CMDQ_SHARED_CONTROL);
cmdq_guard(item, "begin", flags); cmdq_guard(item, "begin", flags);