aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2023-09-09 08:55:20 +1000
committerSteve Bennett <steveb@workware.net.au>2024-03-21 10:44:34 +1000
commitde64d2d836fcbf13e71be29d73684374170da8aa (patch)
treef2e2522fcc1f914a8d087c1c550e854e981eb994
parente23aea23d3e5cf6ed84f62f0d68a827f1d2780b6 (diff)
downloadjimtcl-expr-glob-regexp-op.zip
jimtcl-expr-glob-regexp-op.tar.gz
jimtcl-expr-glob-regexp-op.tar.bz2
expr: add support for =* and =~expr-glob-regexp-op
glob match and regexp match operators Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim.c45
-rw-r--r--tests/regexp2.test16
-rw-r--r--tests/stringmatch.test12
3 files changed, 68 insertions, 5 deletions
diff --git a/jim.c b/jim.c
index 8588b7f..7053073 100644
--- a/jim.c
+++ b/jim.c
@@ -109,7 +109,8 @@
/* Maximum size of an integer */
#define JIM_INTEGER_SPACE 24
-#if defined(DEBUG_SHOW_SCRIPT) || defined(DEBUG_SHOW_SCRIPT_TOKENS) || defined(JIM_DEBUG_COMMAND) || defined(DEBUG_SHOW_SUBST)
+#if defined(DEBUG_SHOW_SCRIPT) || defined(DEBUG_SHOW_SCRIPT_TOKENS) || defined(JIM_DEBUG_COMMAND) || defined(DEBUG_SHOW_SUBST) || defined(DEBUG_SHOW_EXPR_TOKENS) || defined(DEBUG_SHOW_EXPR)
+#define JIM_TT_NAME
static const char *jim_tt_name(int type);
#endif
@@ -8247,6 +8248,9 @@ enum
/* Binary operators (strings) */
JIM_EXPROP_STREQ, /* 43 */
JIM_EXPROP_STRNE,
+ JIM_EXPROP_STRGLOB,
+ JIM_EXPROP_STRRE,
+
JIM_EXPROP_STRIN,
JIM_EXPROP_STRNI,
JIM_EXPROP_STRLT,
@@ -8255,13 +8259,13 @@ enum
JIM_EXPROP_STRGE,
/* Unary operators (numbers) */
- JIM_EXPROP_NOT, /* 51 */
+ JIM_EXPROP_NOT, /* 53 */
JIM_EXPROP_BITNOT,
JIM_EXPROP_UNARYMINUS,
JIM_EXPROP_UNARYPLUS,
/* Functions */
- JIM_EXPROP_FUNC_INT, /* 55 */
+ JIM_EXPROP_FUNC_INT, /* 57 */
JIM_EXPROP_FUNC_WIDE,
JIM_EXPROP_FUNC_ABS,
JIM_EXPROP_FUNC_DOUBLE,
@@ -8270,7 +8274,7 @@ enum
JIM_EXPROP_FUNC_SRAND,
/* math functions from libm */
- JIM_EXPROP_FUNC_SIN, /* 69 */
+ JIM_EXPROP_FUNC_SIN, /* 71 */
JIM_EXPROP_FUNC_COS,
JIM_EXPROP_FUNC_TAN,
JIM_EXPROP_FUNC_ASIN,
@@ -8836,7 +8840,25 @@ static int JimSearchList(Jim_Interp *interp, Jim_Obj *listObjPtr, Jim_Obj *valOb
return 0;
}
+static int JimRegexpMatch(Jim_Interp *interp, Jim_Obj *patternObj, Jim_Obj *objPtr)
+{
+ Jim_Obj *argv[3];
+ int argc = 0;
+ long eq;
+ int rc;
+ argv[argc++] = Jim_NewStringObj(interp, "regexp", -1);
+ argv[argc++] = patternObj;
+ argv[argc++] = objPtr;
+
+ rc = Jim_EvalObjVector(interp, argc, argv);
+
+ if (rc != JIM_OK || Jim_GetLong(interp, Jim_GetResult(interp), &eq) != JIM_OK) {
+ eq = -rc;
+ }
+
+ return eq;
+}
static int JimExprOpStrBin(Jim_Interp *interp, struct JimExprNode *node)
{
@@ -8881,11 +8903,22 @@ static int JimExprOpStrBin(Jim_Interp *interp, struct JimExprNode *node)
case JIM_EXPROP_STRNI:
wC = !JimSearchList(interp, B, A);
break;
+ case JIM_EXPROP_STRGLOB:
+ wC = Jim_StringMatchObj(interp, B, A, 0);
+ break;
+ case JIM_EXPROP_STRRE:
+ wC = JimRegexpMatch(interp, B, A);
+ if (wC < 0) {
+ rc = JIM_ERR;
+ goto error;
+ }
+ break;
default:
abort();
}
Jim_SetResultInt(interp, wC);
+error:
Jim_DecrRefCount(interp, A);
Jim_DecrRefCount(interp, B);
@@ -9016,6 +9049,8 @@ static const struct Jim_ExprOperator Jim_ExprOperators[] = {
OPRINIT("eq", 60, 2, JimExprOpStrBin),
OPRINIT("ne", 60, 2, JimExprOpStrBin),
+ OPRINIT("=*", 60, 2, JimExprOpStrBin),
+ OPRINIT("=~", 60, 2, JimExprOpStrBin),
OPRINIT("in", 55, 2, JimExprOpStrBin),
OPRINIT("ni", 55, 2, JimExprOpStrBin),
@@ -9284,7 +9319,7 @@ static int JimParseExprOperator(struct JimParserCtx *pc)
return JIM_OK;
}
-#if (defined(DEBUG_SHOW_SCRIPT) || defined(DEBUG_SHOW_SCRIPT_TOKENS) || defined(JIM_DEBUG_COMMAND) || defined(DEBUG_SHOW_SUBST)) && !defined(JIM_BOOTSTRAP)
+#if defined(JIM_TT_NAME) && !defined(JIM_BOOTSTRAP)
static const char *jim_tt_name(int type)
{
static const char * const tt_names[JIM_TT_EXPR_OP] =
diff --git a/tests/regexp2.test b/tests/regexp2.test
index 571c981..c3db17d 100644
--- a/tests/regexp2.test
+++ b/tests/regexp2.test
@@ -943,4 +943,20 @@ test regexp-25.3 {End of word} {
regexp {\mcd\M} cdef
} 0
+test regexp-26.1 {regexp operator =~} {
+ expr {"abc" =~ "^a"}
+} 1
+
+test regexp-26.2 {regexp operator =~} {
+ expr {"abc" =~ "^b"}
+} 0
+
+test regexp-26.2 {regexp operator =~} {
+ expr {"abc" =~ ".b."}
+} 1
+
+test regexp-26.3 {regexp operator =~ invalid regexp} -body {
+ expr {"abc" =~ {[}}
+} -returnCodes error -result {couldn't compile regular expression pattern: brackets [] not balanced}
+
testreport
diff --git a/tests/stringmatch.test b/tests/stringmatch.test
index f0eab2a..c15acd1 100644
--- a/tests/stringmatch.test
+++ b/tests/stringmatch.test
@@ -230,4 +230,16 @@ test stringmatch-7.4 {null in pattern} {
string match *b\[\0a\]r* foobar
} 1
+test stringmatch-8.1 {string match operator =*} {
+ expr {"abc" =* "a*"}
+} 1
+
+test stringmatch-8.2 {string match operator =*} {
+ expr {"abc" =* "b*"}
+} 0
+
+test stringmatch-8.3 {string match operator =*} {
+ expr {"abc" =* {*[bB]c}}
+} 1
+
testreport