mirror of
https://github.com/tmux/tmux.git
synced 2026-04-16 12:06:32 +00:00
Merge.
This commit is contained in:
96
format.c
96
format.c
@@ -84,6 +84,12 @@ format_job_cmp(struct format_job *fj1, struct format_job *fj2)
|
||||
return (strcmp(fj1->cmd, fj2->cmd));
|
||||
}
|
||||
|
||||
/* Maimum pad and trim width. */
|
||||
#define FORMAT_MAX_WIDTH 10000
|
||||
|
||||
/* Maimum repeat size. */
|
||||
#define FORMAT_MAX_REPEAT 10000
|
||||
|
||||
/* Format modifiers. */
|
||||
#define FORMAT_TIMESTRING 0x1
|
||||
#define FORMAT_BASENAME 0x2
|
||||
@@ -1009,7 +1015,7 @@ static void *
|
||||
format_cb_pane_flags(struct format_tree *ft)
|
||||
{
|
||||
if (ft->wp != NULL)
|
||||
return (xstrdup(window_pane_printable_flags(ft->wp, 1)));
|
||||
return (xstrdup(window_pane_printable_flags(ft->wp)));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1344,6 +1350,8 @@ format_cb_mouse_status_range(struct format_tree *ft)
|
||||
return (xstrdup("session"));
|
||||
case STYLE_RANGE_USER:
|
||||
return (xstrdup(sr->string));
|
||||
case STYLE_RANGE_CONTROL:
|
||||
return (xstrdup("control"));
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
@@ -1378,6 +1386,18 @@ format_cb_alternate_saved_y(struct format_tree *ft)
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* Callback for bracket_paste_flag. */
|
||||
static void *
|
||||
format_cb_bracket_paste_flag(struct format_tree *ft)
|
||||
{
|
||||
if (ft->wp != NULL && ft->wp->screen != NULL) {
|
||||
if (ft->wp->screen->mode & MODE_BRACKETPASTE)
|
||||
return (xstrdup("1"));
|
||||
return (xstrdup("0"));
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* Callback for buffer_name. */
|
||||
static void *
|
||||
format_cb_buffer_name(struct format_tree *ft)
|
||||
@@ -1616,9 +1636,13 @@ format_cb_client_user(struct format_tree *ft)
|
||||
struct passwd *pw;
|
||||
|
||||
if (ft->c != NULL) {
|
||||
if (ft->c->user != NULL)
|
||||
return (xstrdup(ft->c->user));
|
||||
uid = proc_get_peer_uid(ft->c->peer);
|
||||
if (uid != (uid_t)-1 && (pw = getpwuid(uid)) != NULL)
|
||||
return (xstrdup(pw->pw_name));
|
||||
if (uid != (uid_t)-1 && (pw = getpwuid(uid)) != NULL) {
|
||||
ft->c->user = xstrdup(pw->pw_name);
|
||||
return (xstrdup(ft->c->user));
|
||||
}
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
@@ -2288,6 +2312,38 @@ format_cb_pane_pipe_pid(struct format_tree *ft)
|
||||
return (value);
|
||||
}
|
||||
|
||||
/* Callback for pane_pb_progress. */
|
||||
static void *
|
||||
format_cb_pane_pb_progress(struct format_tree *ft)
|
||||
{
|
||||
char *value = NULL;
|
||||
|
||||
if (ft->wp != NULL)
|
||||
xasprintf(&value, "%d", ft->wp->base.progress_bar.progress);
|
||||
return (value);
|
||||
}
|
||||
|
||||
/* Callback for pane_pb_state. */
|
||||
static void *
|
||||
format_cb_pane_pb_state(struct format_tree *ft)
|
||||
{
|
||||
if (ft->wp != NULL) {
|
||||
switch (ft->wp->base.progress_bar.state) {
|
||||
case PROGRESS_BAR_HIDDEN:
|
||||
return xstrdup("hidden");
|
||||
case PROGRESS_BAR_NORMAL:
|
||||
return xstrdup("normal");
|
||||
case PROGRESS_BAR_ERROR:
|
||||
return xstrdup("error");
|
||||
case PROGRESS_BAR_INDETERMINATE:
|
||||
return xstrdup("indeterminate");
|
||||
case PROGRESS_BAR_PAUSED:
|
||||
return xstrdup("paused");
|
||||
}
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* Callback for pane_right. */
|
||||
static void *
|
||||
format_cb_pane_right(struct format_tree *ft)
|
||||
@@ -3063,10 +3119,13 @@ format_cb_uid(__unused struct format_tree *ft)
|
||||
static void *
|
||||
format_cb_user(__unused struct format_tree *ft)
|
||||
{
|
||||
static char *cached;
|
||||
struct passwd *pw;
|
||||
|
||||
if ((pw = getpwuid(getuid())) != NULL)
|
||||
return (xstrdup(pw->pw_name));
|
||||
if (cached == NULL && (pw = getpwuid(getuid())) != NULL)
|
||||
cached = xstrdup(pw->pw_name);
|
||||
if (cached != NULL)
|
||||
return (xstrdup(cached));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -3101,6 +3160,9 @@ static const struct format_table_entry format_table[] = {
|
||||
{ "alternate_saved_y", FORMAT_TABLE_STRING,
|
||||
format_cb_alternate_saved_y
|
||||
},
|
||||
{ "bracket_paste_flag", FORMAT_TABLE_STRING,
|
||||
format_cb_bracket_paste_flag
|
||||
},
|
||||
{ "buffer_created", FORMAT_TABLE_TIME,
|
||||
format_cb_buffer_created
|
||||
},
|
||||
@@ -3395,6 +3457,12 @@ static const struct format_table_entry format_table[] = {
|
||||
{ "pane_path", FORMAT_TABLE_STRING,
|
||||
format_cb_pane_path
|
||||
},
|
||||
{ "pane_pb_progress", FORMAT_TABLE_STRING,
|
||||
format_cb_pane_pb_progress
|
||||
},
|
||||
{ "pane_pb_state", FORMAT_TABLE_STRING,
|
||||
format_cb_pane_pb_state
|
||||
},
|
||||
{ "pane_pid", FORMAT_TABLE_STRING,
|
||||
format_cb_pane_pid
|
||||
},
|
||||
@@ -4256,6 +4324,8 @@ format_build_modifiers(struct format_expand_state *es, const char **s,
|
||||
/* Skip any separator character. */
|
||||
if (*cp == ';')
|
||||
cp++;
|
||||
if (*cp == '\0')
|
||||
break;
|
||||
|
||||
/* Check single character modifiers with no arguments. */
|
||||
if (strchr("labcdnwETSWPL!<>", cp[0]) != NULL &&
|
||||
@@ -4816,7 +4886,7 @@ format_replace_expression(struct format_modifier *mexp,
|
||||
|
||||
/* The third argument may be precision. */
|
||||
if (argc >= 3) {
|
||||
prec = strtonum(mexp->argv[2], INT_MIN, INT_MAX, &errstr);
|
||||
prec = strtonum(mexp->argv[2], INT_MIN + 1, INT_MAX, &errstr);
|
||||
if (errstr != NULL) {
|
||||
format_log(es, "expression precision %s: %s", errstr,
|
||||
mexp->argv[2]);
|
||||
@@ -4961,8 +5031,8 @@ format_replace(struct format_expand_state *es, const char *key, size_t keylen,
|
||||
case '=':
|
||||
if (fm->argc < 1)
|
||||
break;
|
||||
limit = strtonum(fm->argv[0], INT_MIN, INT_MAX,
|
||||
&errstr);
|
||||
limit = strtonum(fm->argv[0], -FORMAT_MAX_WIDTH,
|
||||
FORMAT_MAX_WIDTH, &errstr);
|
||||
if (errstr != NULL)
|
||||
limit = 0;
|
||||
if (fm->argc >= 2 && fm->argv[1] != NULL)
|
||||
@@ -4971,8 +5041,8 @@ format_replace(struct format_expand_state *es, const char *key, size_t keylen,
|
||||
case 'p':
|
||||
if (fm->argc < 1)
|
||||
break;
|
||||
width = strtonum(fm->argv[0], INT_MIN, INT_MAX,
|
||||
&errstr);
|
||||
width = strtonum(fm->argv[0], -FORMAT_MAX_WIDTH,
|
||||
FORMAT_MAX_WIDTH, &errstr);
|
||||
if (errstr != NULL)
|
||||
width = 0;
|
||||
break;
|
||||
@@ -5195,7 +5265,7 @@ format_replace(struct format_expand_state *es, const char *key, size_t keylen,
|
||||
format_log(es, "repeat syntax error: %s", copy);
|
||||
goto fail;
|
||||
}
|
||||
nrep = strtonum(right, 1, 10000, &errstr);
|
||||
nrep = strtonum(right, 1, FORMAT_MAX_REPEAT, &errstr);
|
||||
if (errstr != NULL)
|
||||
value = xstrdup("");
|
||||
else {
|
||||
@@ -5390,6 +5460,7 @@ done:
|
||||
if (marker != NULL && strcmp(new, value) != 0) {
|
||||
free(value);
|
||||
xasprintf(&value, "%s%s", new, marker);
|
||||
free(new);
|
||||
} else {
|
||||
free(value);
|
||||
value = new;
|
||||
@@ -5400,6 +5471,7 @@ done:
|
||||
if (marker != NULL && strcmp(new, value) != 0) {
|
||||
free(value);
|
||||
xasprintf(&value, "%s%s", marker, new);
|
||||
free(new);
|
||||
} else {
|
||||
free(value);
|
||||
value = new;
|
||||
@@ -5512,7 +5584,7 @@ format_expand1(struct format_expand_state *es, const char *fmt)
|
||||
buf[off++] = *fmt++;
|
||||
continue;
|
||||
}
|
||||
if (*fmt++ == '\0')
|
||||
if (*++fmt == '\0')
|
||||
break;
|
||||
|
||||
ch = (u_char)*fmt++;
|
||||
|
||||
Reference in New Issue
Block a user