mirror of
https://github.com/tmux/tmux.git
synced 2025-01-06 07:48:48 +00:00
Merge branch 'obsd-master'
This commit is contained in:
commit
ee9bc355f5
2
cfg.c
2
cfg.c
@ -52,7 +52,7 @@ cfg_done(__unused struct cmdq_item *item, __unused void *data)
|
||||
cfg_show_causes(RB_MIN(sessions, &sessions));
|
||||
|
||||
if (cfg_item != NULL)
|
||||
cfg_item->flags &= ~CMDQ_WAITING;
|
||||
cmdq_continue(cfg_item);
|
||||
|
||||
status_prompt_load_history();
|
||||
|
||||
|
@ -188,7 +188,7 @@ cmd_display_panes_free(struct client *c)
|
||||
struct cmd_display_panes_data *cdata = c->overlay_data;
|
||||
|
||||
if (cdata->item != NULL)
|
||||
cdata->item->flags &= ~CMDQ_WAITING;
|
||||
cmdq_continue(cdata->item);
|
||||
free(cdata->command);
|
||||
free(cdata);
|
||||
}
|
||||
|
@ -196,7 +196,7 @@ cmd_if_shell_callback(struct job *job)
|
||||
|
||||
out:
|
||||
if (cdata->item != NULL)
|
||||
cdata->item->flags &= ~CMDQ_WAITING;
|
||||
cmdq_continue(cdata->item);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -176,7 +176,7 @@ cmd_load_buffer_callback(struct client *c, int closed, void *data)
|
||||
free(cause);
|
||||
}
|
||||
out:
|
||||
cdata->item->flags &= ~CMDQ_WAITING;
|
||||
cmdq_continue(cdata->item);
|
||||
|
||||
free(cdata->bufname);
|
||||
free(cdata);
|
||||
|
36
cmd-parse.y
36
cmd-parse.y
@ -1338,8 +1338,8 @@ static int
|
||||
yylex_token_brace(char **buf, size_t *len)
|
||||
{
|
||||
struct cmd_parse_state *ps = &parse_state;
|
||||
int ch, nesting = 1, escape = 0, quote = '\0';
|
||||
int lines = 0;
|
||||
int ch, lines = 0, nesting = 1, escape = 0;
|
||||
int quote = '\0', token = 0;
|
||||
|
||||
/*
|
||||
* Extract a string up to the matching unquoted '}', including newlines
|
||||
@ -1349,6 +1349,10 @@ yylex_token_brace(char **buf, size_t *len)
|
||||
* depth, we scan the input as if it was a tmux config file, and ignore
|
||||
* braces which would be considered quoted, escaped, or in a comment.
|
||||
*
|
||||
* We update the token state after every character because '#' begins a
|
||||
* comment only when it begins a token. For simplicity, we treat an
|
||||
* unquoted directive format as comment.
|
||||
*
|
||||
* The result is verbatim copy of the input excluding the final brace.
|
||||
*/
|
||||
|
||||
@ -1368,6 +1372,8 @@ yylex_token_brace(char **buf, size_t *len)
|
||||
ch == '\n' ||
|
||||
ch == '\\')) {
|
||||
escape = 0;
|
||||
if (ch != '\n')
|
||||
token = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1383,7 +1389,7 @@ yylex_token_brace(char **buf, size_t *len)
|
||||
|
||||
/* A newline always resets to unquoted. */
|
||||
if (ch == '\n') {
|
||||
quote = 0;
|
||||
quote = token = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1394,33 +1400,47 @@ yylex_token_brace(char **buf, size_t *len)
|
||||
*/
|
||||
if (ch == quote && quote != '#')
|
||||
quote = 0;
|
||||
} else {
|
||||
token = 1; /* token continues regardless */
|
||||
} else {
|
||||
/* Not inside quotes or comment. */
|
||||
switch (ch) {
|
||||
case '"':
|
||||
case '\'':
|
||||
case '#':
|
||||
/* Beginning of quote or comment. */
|
||||
quote = ch;
|
||||
/* Beginning of quote or maybe comment. */
|
||||
if (ch != '#' || !token)
|
||||
quote = ch;
|
||||
token = 1;
|
||||
break;
|
||||
case ' ':
|
||||
case '\t':
|
||||
case ';':
|
||||
/* Delimiter - token resets. */
|
||||
token = 0;
|
||||
break;
|
||||
case '{':
|
||||
nesting++;
|
||||
token = 0; /* new commands set - token resets */
|
||||
break;
|
||||
case '}':
|
||||
nesting--;
|
||||
token = 1; /* same as after quotes */
|
||||
if (nesting == 0) {
|
||||
(*len)--; /* remove closing } */
|
||||
ps->input->line += lines;
|
||||
return (1);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
token = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Update line count after error as reporting the opening line
|
||||
* is more useful than EOF.
|
||||
* Update line count after error as reporting the opening line is more
|
||||
* useful than EOF.
|
||||
*/
|
||||
yyerror("unterminated brace string");
|
||||
ps->input->line += lines;
|
||||
|
@ -156,6 +156,13 @@ cmdq_insert_hook(struct session *s, struct cmdq_item *item,
|
||||
free(name);
|
||||
}
|
||||
|
||||
/* Continue processing command queue. */
|
||||
void
|
||||
cmdq_continue(struct cmdq_item *item)
|
||||
{
|
||||
item->flags &= ~CMDQ_WAITING;
|
||||
}
|
||||
|
||||
/* Remove an item. */
|
||||
static void
|
||||
cmdq_remove(struct cmdq_item *item)
|
||||
|
@ -155,7 +155,7 @@ cmd_run_shell_callback(struct job *job)
|
||||
free(msg);
|
||||
|
||||
if (cdata->item != NULL)
|
||||
cdata->item->flags &= ~CMDQ_WAITING;
|
||||
cmdq_continue(cdata->item);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -153,7 +153,7 @@ cmd_wait_for_signal(__unused struct cmdq_item *item, const char *name,
|
||||
log_debug("signal wait channel %s, with waiters", wc->name);
|
||||
|
||||
TAILQ_FOREACH_SAFE(wi, &wc->waiters, entry, wi1) {
|
||||
wi->item->flags &= ~CMDQ_WAITING;
|
||||
cmdq_continue(wi->item);
|
||||
|
||||
TAILQ_REMOVE(&wc->waiters, wi, entry);
|
||||
free(wi);
|
||||
@ -229,7 +229,7 @@ cmd_wait_for_unlock(struct cmdq_item *item, const char *name,
|
||||
}
|
||||
|
||||
if ((wi = TAILQ_FIRST(&wc->lockers)) != NULL) {
|
||||
wi->item->flags &= ~CMDQ_WAITING;
|
||||
cmdq_continue(wi->item);
|
||||
TAILQ_REMOVE(&wc->lockers, wi, entry);
|
||||
free(wi);
|
||||
} else {
|
||||
@ -248,13 +248,13 @@ cmd_wait_for_flush(void)
|
||||
|
||||
RB_FOREACH_SAFE(wc, wait_channels, &wait_channels, wc1) {
|
||||
TAILQ_FOREACH_SAFE(wi, &wc->waiters, entry, wi1) {
|
||||
wi->item->flags &= ~CMDQ_WAITING;
|
||||
cmdq_continue(wi->item);
|
||||
TAILQ_REMOVE(&wc->waiters, wi, entry);
|
||||
free(wi);
|
||||
}
|
||||
wc->woken = 1;
|
||||
TAILQ_FOREACH_SAFE(wi, &wc->lockers, entry, wi1) {
|
||||
wi->item->flags &= ~CMDQ_WAITING;
|
||||
cmdq_continue(wi->item);
|
||||
TAILQ_REMOVE(&wc->lockers, wi, entry);
|
||||
free(wi);
|
||||
}
|
||||
|
2
menu.c
2
menu.c
@ -161,7 +161,7 @@ menu_free_cb(struct client *c)
|
||||
struct menu_data *md = c->overlay_data;
|
||||
|
||||
if (md->item != NULL)
|
||||
md->item->flags &= ~CMDQ_WAITING;
|
||||
cmdq_continue(md->item);
|
||||
|
||||
if (md->cb != NULL)
|
||||
md->cb(md->menu, UINT_MAX, KEYC_NONE, md->data);
|
||||
|
1
tmux.h
1
tmux.h
@ -2039,6 +2039,7 @@ void cmdq_insert_after(struct cmdq_item *, struct cmdq_item *);
|
||||
void cmdq_append(struct client *, struct cmdq_item *);
|
||||
void cmdq_insert_hook(struct session *, struct cmdq_item *,
|
||||
struct cmd_find_state *, const char *, ...);
|
||||
void cmdq_continue(struct cmdq_item *);
|
||||
void printflike(3, 4) cmdq_format(struct cmdq_item *, const char *,
|
||||
const char *, ...);
|
||||
u_int cmdq_next(struct client *);
|
||||
|
Loading…
Reference in New Issue
Block a user