From 1329dfb57ad6759316dfa366ec38176dfa59a837 Mon Sep 17 00:00:00 2001 From: Simmo Saan Date: Sat, 29 Apr 2017 17:04:44 +0200 Subject: [PATCH] core: add wildcard matching operators to eval (closes #608) --- src/core/wee-command.c | 5 ++++- src/core/wee-eval.c | 10 +++++++++- src/core/wee-eval.h | 2 ++ tests/unit/core/test-eval.cpp | 8 ++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/core/wee-command.c b/src/core/wee-command.c index 6496a0732..fcfcd4726 100644 --- a/src/core/wee-command.c +++ b/src/core/wee-command.c @@ -7254,6 +7254,8 @@ command_init () " > greater\n" " =~ is matching POSIX extended regex\n" " !~ is NOT matching POSIX extended regex\n" + " =* is matching wildcard mask\n" + " !* is NOT matching wildcard mask\n" "\n" "An expression is considered as \"true\" if it is not NULL, not " "empty, and different from \"0\".\n" @@ -7326,7 +7328,8 @@ command_init () " /eval -n -c abcd =~ ^ABC ==> 1\n" " /eval -n -c abcd =~ (?-i)^ABC ==> 0\n" " /eval -n -c abcd =~ (?-i)^abc ==> 1\n" - " /eval -n -c abcd !~ abc ==> 0"), + " /eval -n -c abcd !~ abc ==> 0\n" + " /eval -n -c abcd =* a*d ==> 1"), "-n|-s|-c -n|-s|-c", &command_eval, NULL, NULL); hook_command ( diff --git a/src/core/wee-eval.c b/src/core/wee-eval.c index ebcaec5fe..6864a94d6 100644 --- a/src/core/wee-eval.c +++ b/src/core/wee-eval.c @@ -47,7 +47,7 @@ char *logical_ops[EVAL_NUM_LOGICAL_OPS] = { "||", "&&" }; char *comparisons[EVAL_NUM_COMPARISONS] = -{ "=~", "!~", "==", "!=", "<=", "<", ">=", ">" }; +{ "=~", "!~", "=*", "!*", "==", "!=", "<=", "<", ">=", ">" }; char *eval_replace_vars (const char *expr, struct t_hashtable *pointers, @@ -791,6 +791,14 @@ eval_compare (const char *expr1, int comparison, const char *expr2) rc ^= 1; goto end; } + else if ((comparison == EVAL_COMPARE_STRING_MATCHING) + || (comparison == EVAL_COMPARE_STRING_NOT_MATCHING)) + { + rc = string_match (expr1, expr2, 0); + if (comparison == EVAL_COMPARE_STRING_NOT_MATCHING) + rc ^= 1; + goto end; + } length1 = strlen (expr1); length2 = strlen (expr2); diff --git a/src/core/wee-eval.h b/src/core/wee-eval.h index 2eee0c0e6..4b4967bc3 100644 --- a/src/core/wee-eval.h +++ b/src/core/wee-eval.h @@ -42,6 +42,8 @@ enum t_eval_comparison { EVAL_COMPARE_REGEX_MATCHING = 0, EVAL_COMPARE_REGEX_NOT_MATCHING, + EVAL_COMPARE_STRING_MATCHING, + EVAL_COMPARE_STRING_NOT_MATCHING, EVAL_COMPARE_EQUAL, EVAL_COMPARE_NOT_EQUAL, EVAL_COMPARE_LESS_EQUAL, diff --git a/tests/unit/core/test-eval.cpp b/tests/unit/core/test-eval.cpp index 14f60f80b..f9e8a2fbb 100644 --- a/tests/unit/core/test-eval.cpp +++ b/tests/unit/core/test-eval.cpp @@ -121,6 +121,10 @@ TEST(Eval, EvalCondition) WEE_CHECK_EVAL("0", "abcd =~ (?-i)^ABC"); WEE_CHECK_EVAL("0", "abcd =~ \\(abcd\\)"); WEE_CHECK_EVAL("0", "(abcd) =~ \\(\\(abcd\\)\\)"); + WEE_CHECK_EVAL("0", "abcd =* abce"); + WEE_CHECK_EVAL("0", "abcd =* a*e"); + WEE_CHECK_EVAL("0", "abcd !* *bc*"); + WEE_CHECK_EVAL("0", "abcd !* *"); WEE_CHECK_EVAL("0", "${test} == test"); WEE_CHECK_EVAL("0", "${test2} == value2"); WEE_CHECK_EVAL("0", "${buffer.number} == 2"); @@ -157,6 +161,10 @@ TEST(Eval, EvalCondition) WEE_CHECK_EVAL("1", "(abcd) =~ (abcd)"); WEE_CHECK_EVAL("1", "(abcd) =~ \\(abcd\\)"); WEE_CHECK_EVAL("1", "((abcd)) =~ \\(\\(abcd\\)\\)"); + WEE_CHECK_EVAL("1", "abcd !* abce"); + WEE_CHECK_EVAL("1", "abcd !* a*e"); + WEE_CHECK_EVAL("1", "abcd =* *bc*"); + WEE_CHECK_EVAL("1", "abcd =* *"); WEE_CHECK_EVAL("1", "${test} == value"); WEE_CHECK_EVAL("1", "${test2} =="); WEE_CHECK_EVAL("1", "${buffer.number} == 1");