This commit is contained in:
Michael Grant
2026-04-05 19:40:56 -04:00
35 changed files with 1256 additions and 1654 deletions

View File

@@ -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++;