summaryrefslogtreecommitdiffstats
path: root/format.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2020-11-02 10:01:20 +0000
committerThomas Adam <thomas@xteddy.org>2020-11-02 10:01:20 +0000
commitff53eed402abb146096673963da39b5036a5c861 (patch)
treea13a66498befbd75237a3a7a3869ccd2c52b8452 /format.c
parentffe39edf2fdd8f0489c05022ca8f6e9994396881 (diff)
parentac5045a00f1fee2ca94aef063e6a5a3d2efce3f1 (diff)
Merge branch 'obsd-master'
Diffstat (limited to 'format.c')
-rw-r--r--format.c42
1 files changed, 41 insertions, 1 deletions
diff --git a/format.c b/format.c
index 03fcce5c..dd3af400 100644
--- a/format.c
+++ b/format.c
@@ -1984,7 +1984,17 @@ format_replace_expression(struct format_modifier *mexp,
int use_fp = 0;
u_int prec = 0;
double mleft, mright, result;
- enum { ADD, SUBTRACT, MULTIPLY, DIVIDE, MODULUS } operator;
+ enum { ADD,
+ SUBTRACT,
+ MULTIPLY,
+ DIVIDE,
+ MODULUS,
+ EQUAL,
+ NOT_EQUAL,
+ GREATER_THAN,
+ GREATER_THAN_EQUAL,
+ LESS_THAN,
+ LESS_THAN_EQUAL } operator;
if (strcmp(mexp->argv[0], "+") == 0)
operator = ADD;
@@ -1997,6 +2007,18 @@ format_replace_expression(struct format_modifier *mexp,
else if (strcmp(mexp->argv[0], "%") == 0 ||
strcmp(mexp->argv[0], "m") == 0)
operator = MODULUS;
+ else if (strcmp(mexp->argv[0], "==") == 0)
+ operator = EQUAL;
+ else if (strcmp(mexp->argv[0], "!=") == 0)
+ operator = NOT_EQUAL;
+ else if (strcmp(mexp->argv[0], ">") == 0)
+ operator = GREATER_THAN;
+ else if (strcmp(mexp->argv[0], "<") == 0)
+ operator = LESS_THAN;
+ else if (strcmp(mexp->argv[0], ">=") == 0)
+ operator = GREATER_THAN_EQUAL;
+ else if (strcmp(mexp->argv[0], "<=") == 0)
+ operator = LESS_THAN_EQUAL;
else {
format_log(es, "expression has no valid operator: '%s'",
mexp->argv[0]);
@@ -2059,6 +2081,24 @@ format_replace_expression(struct format_modifier *mexp,
case MODULUS:
result = fmod(mleft, mright);
break;
+ case EQUAL:
+ result = fabs(mleft - mright) < 1e-9;
+ break;
+ case NOT_EQUAL:
+ result = fabs(mleft - mright) > 1e-9;
+ break;
+ case GREATER_THAN:
+ result = (mleft > mright);
+ break;
+ case GREATER_THAN_EQUAL:
+ result = (mleft >= mright);
+ break;
+ case LESS_THAN:
+ result = (mleft < mright);
+ break;
+ case LESS_THAN_EQUAL:
+ result = (mleft > mright);
+ break;
}
if (use_fp)
xasprintf(&value, "%.*f", prec, result);