summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2019-05-25 16:51:11 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2019-05-25 16:51:11 +0000
commitbebbfbcf65120b91c8551bbe1c2bc8d91f7d0882 (patch)
tree2f3e826e50ee0608b488b68de86c87e61eb3d70d
parenta468e06f0203fe5991fa869c27eb5782394fa80f (diff)
Add <, >, <=, >= for formats, GitHub issue 1747.
-rw-r--r--usr.bin/tmux/format.c41
-rw-r--r--usr.bin/tmux/tmux.112
2 files changed, 41 insertions, 12 deletions
diff --git a/usr.bin/tmux/format.c b/usr.bin/tmux/format.c
index 9cf76987eef..7060a911077 100644
--- a/usr.bin/tmux/format.c
+++ b/usr.bin/tmux/format.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: format.c,v 1.194 2019/05/13 20:07:02 nicm Exp $ */
+/* $OpenBSD: format.c,v 1.195 2019/05/25 16:51:10 nicm Exp $ */
/*
* Copyright (c) 2011 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1136,13 +1136,13 @@ format_build_modifiers(struct format_tree *ft, const char **s, u_int *count)
/*
* Modifiers are a ; separated list of the forms:
- * l,m,C,b,d,t,q,E,T,S,W,P
+ * l,m,C,b,d,t,q,E,T,S,W,P,<,>
* =a
* =/a
* =/a/
* s/a/b/
* s/a/b
- * ||,&&,!=,==
+ * ||,&&,!=,==,<=,>=
*/
*count = 0;
@@ -1153,7 +1153,7 @@ format_build_modifiers(struct format_tree *ft, const char **s, u_int *count)
cp++;
/* Check single character modifiers with no arguments. */
- if (strchr("lmCbdtqETSWP", cp[0]) != NULL &&
+ if (strchr("lmCbdtqETSWP<>", cp[0]) != NULL &&
format_is_end(cp[1])) {
format_add_modifier(&list, count, cp, 1, NULL, 0);
cp++;
@@ -1164,7 +1164,9 @@ format_build_modifiers(struct format_tree *ft, const char **s, u_int *count)
if ((memcmp("||", cp, 2) == 0 ||
memcmp("&&", cp, 2) == 0 ||
memcmp("!=", cp, 2) == 0 ||
- memcmp("==", cp, 2) == 0) &&
+ memcmp("==", cp, 2) == 0 ||
+ memcmp("<=", cp, 2) == 0 ||
+ memcmp(">=", cp, 2) == 0) &&
format_is_end(cp[2])) {
format_add_modifier(&list, count, cp, 2, NULL, 0);
cp += 2;
@@ -1433,6 +1435,8 @@ format_replace(struct format_tree *ft, const char *key, size_t keylen,
if (fm->size == 1) {
switch (fm->modifier[0]) {
case 'm':
+ case '<':
+ case '>':
cmp = fm;
break;
case 'C':
@@ -1486,7 +1490,9 @@ format_replace(struct format_tree *ft, const char *key, size_t keylen,
if (strcmp(fm->modifier, "||") == 0 ||
strcmp(fm->modifier, "&&") == 0 ||
strcmp(fm->modifier, "==") == 0 ||
- strcmp(fm->modifier, "!=") == 0)
+ strcmp(fm->modifier, "!=") == 0 ||
+ strcmp(fm->modifier, ">=") == 0 ||
+ strcmp(fm->modifier, "<=") == 0)
cmp = fm;
}
}
@@ -1549,8 +1555,27 @@ format_replace(struct format_tree *ft, const char *key, size_t keylen,
value = xstrdup("1");
else
value = xstrdup("0");
- }
- else if (strcmp(cmp->modifier, "m") == 0) {
+ } else if (strcmp(cmp->modifier, "<") == 0) {
+ if (strcmp(left, right) < 0)
+ value = xstrdup("1");
+ else
+ value = xstrdup("0");
+ } else if (strcmp(cmp->modifier, ">") == 0) {
+ if (strcmp(left, right) > 0)
+ value = xstrdup("1");
+ else
+ value = xstrdup("0");
+ } else if (strcmp(cmp->modifier, "<=") == 0) {
+ if (strcmp(left, right) <= 0)
+ value = xstrdup("1");
+ else
+ value = xstrdup("0");
+ } else if (strcmp(cmp->modifier, ">=") == 0) {
+ if (strcmp(left, right) >= 0)
+ value = xstrdup("1");
+ else
+ value = xstrdup("0");
+ } else if (strcmp(cmp->modifier, "m") == 0) {
if (fnmatch(left, right, 0) == 0)
value = xstrdup("1");
else
diff --git a/usr.bin/tmux/tmux.1 b/usr.bin/tmux/tmux.1
index d51a84bb201..8896ea9ad4a 100644
--- a/usr.bin/tmux/tmux.1
+++ b/usr.bin/tmux/tmux.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: tmux.1,v 1.651 2019/05/23 11:13:30 nicm Exp $
+.\" $OpenBSD: tmux.1,v 1.652 2019/05/25 16:51:10 nicm Exp $
.\"
.\" Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
.\"
@@ -14,7 +14,7 @@
.\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
.\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: May 23 2019 $
+.Dd $Mdocdate: May 25 2019 $
.Dt TMUX 1
.Os
.Sh NAME
@@ -3946,9 +3946,13 @@ For example:
.Pp
Comparisons may be expressed by prefixing two comma-separated
alternatives by
-.Ql ==
+.Ql == ,
+.Ql != ,
+.Ql < ,
+.Ql > ,
+.Ql <=
or
-.Ql !=
+.Ql >=
and a colon.
For example
.Ql #{==:#{host},myhost}