diff options
author | Werner Koch <[email protected]> | 2016-09-05 07:49:06 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2016-09-05 07:52:04 +0000 |
commit | 959cd8903fd012e63dbb156db56708dd3934b5df (patch) | |
tree | fdb038b5db058b7213de7b3a419490cf64392f31 /common/recsel.c | |
parent | gpg: Use a common filter_getval for import and export. (diff) | |
download | gnupg-959cd8903fd012e63dbb156db56708dd3934b5df.tar.gz gnupg-959cd8903fd012e63dbb156db56708dd3934b5df.zip |
common: Add string operator gt,ge,le,lt to recsel.
* common/recsel.c (recsel_parse_expr): Add them.
(recsel_dump): Print them.
(recsel_select): Evaluate them.
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'common/recsel.c')
-rw-r--r-- | common/recsel.c | 57 |
1 files changed, 55 insertions, 2 deletions
diff --git a/common/recsel.c b/common/recsel.c index 5dc685fe9..866861b87 100644 --- a/common/recsel.c +++ b/common/recsel.c @@ -48,7 +48,11 @@ typedef enum SELECT_LE, SELECT_GE, SELECT_LT, - SELECT_GT + SELECT_GT, + SELECT_STRLE, /* String is less or equal. */ + SELECT_STRGE, + SELECT_STRLT, + SELECT_STRGT } select_op_t; @@ -347,6 +351,26 @@ recsel_parse_expr (recsel_expr_t *selector, const char *expression) se->op = SELECT_ISTRUE; s += 2; } + else if (!strncmp (s, "-le", 3)) + { + se->op = SELECT_STRLE; + s += 3; + } + else if (!strncmp (s, "-ge", 3)) + { + se->op = SELECT_STRGE; + s += 3; + } + else if (!strncmp (s, "-lt", 3)) + { + se->op = SELECT_STRLT; + s += 3; + } + else if (!strncmp (s, "-gt", 3)) + { + se->op = SELECT_STRGT; + s += 3; + } else { log_error ("invalid operator in expression\n"); @@ -467,7 +491,12 @@ recsel_dump (recsel_expr_t selector) se->op == SELECT_LT? "< ": se->op == SELECT_LE? "<=": se->op == SELECT_GT? "> ": - se->op == SELECT_GE? ">=":"[oops]", + se->op == SELECT_GE? ">=": + se->op == SELECT_STRLT? "-lt": + se->op == SELECT_STRLE? "-le": + se->op == SELECT_STRGT? "-gt": + se->op == SELECT_STRGE? "-ge": + /**/ "[oops]", se->value); } log_debug ("--- End selectors ---\n"); @@ -541,6 +570,30 @@ recsel_select (recsel_expr_t selector, case SELECT_LE: result = (numvalue <= se->numvalue); break; + case SELECT_STRGT: + if (se->xcase) + result = strcmp (value, se->value) > 0; + else + result = strcasecmp (value, se->value) > 0; + break; + case SELECT_STRGE: + if (se->xcase) + result = strcmp (value, se->value) >= 0; + else + result = strcasecmp (value, se->value) >= 0; + break; + case SELECT_STRLT: + if (se->xcase) + result = strcmp (value, se->value) < 0; + else + result = strcasecmp (value, se->value) < 0; + break; + case SELECT_STRLE: + if (se->xcase) + result = strcmp (value, se->value) <= 0; + else + result = strcasecmp (value, se->value) <= 0; + break; } } |