aboutsummaryrefslogtreecommitdiff
path: root/jim.c
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 /jim.c
parente23aea23d3e5cf6ed84f62f0d68a827f1d2780b6 (diff)
downloadjimtcl-de64d2d836fcbf13e71be29d73684374170da8aa.zip
jimtcl-de64d2d836fcbf13e71be29d73684374170da8aa.tar.gz
jimtcl-de64d2d836fcbf13e71be29d73684374170da8aa.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>
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c45
1 files changed, 40 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] =