diff options
author | Steve Bennett <steveb@workware.net.au> | 2023-09-09 08:55:20 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2025-07-16 09:34:08 +1000 |
commit | 83e247559a77a36b471bc9d89e69a246a6304500 (patch) | |
tree | 8254ff2fc74907cd6dcb035faf0a0333c15a830c | |
parent | 1b6949f361b0102990bb267139adf1b264de7893 (diff) | |
download | jimtcl-83e247559a77a36b471bc9d89e69a246a6304500.zip jimtcl-83e247559a77a36b471bc9d89e69a246a6304500.tar.gz jimtcl-83e247559a77a36b471bc9d89e69a246a6304500.tar.bz2 |
expr: add support for =* and =~
glob match and regexp match operators
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim.c | 45 | ||||
-rw-r--r-- | tests/regexp2.test | 16 | ||||
-rw-r--r-- | tests/stringmatch.test | 12 |
3 files changed, 68 insertions, 5 deletions
@@ -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_EXPR_TOKENS) || defined(DEBUG_SHOW_EXPR) +#define JIM_TT_NAME static const char *jim_tt_name(int type); #endif @@ -8337,6 +8338,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, @@ -8345,13 +8349,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, @@ -8360,7 +8364,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, @@ -8933,7 +8937,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) { @@ -8978,11 +9000,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); @@ -9113,6 +9146,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), @@ -9381,7 +9416,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..2a60631 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 regexp-8.1 {string match operator =*} { + expr {"abc" =* "a*"} +} 1 + +test regexp-26.2 {regexp operator =~} { + expr {"abc" =* "b*"} +} 0 + +test regexp-26.2 {regexp operator =~} { + expr {"abc" =* {*[bB]c}} +} 1 + testreport |