From de64d2d836fcbf13e71be29d73684374170da8aa Mon Sep 17 00:00:00 2001 From: Steve Bennett Date: Sat, 9 Sep 2023 08:55:20 +1000 Subject: expr: add support for =* and =~ glob match and regexp match operators Signed-off-by: Steve Bennett --- jim.c | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) (limited to 'jim.c') 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] = -- cgit v1.1