Currently, the only way to make use of regex matching in the shell is
by using "setexpr [g]sub" command. That's rather awkward for asking
whether a string matches a regex. At the very least, it requires
providing setexpr with a dummy target variable, but also, the return
value of setexpr doesn't say whether any substitutions were done, so
one would have to do some roundabout thing like

  env set dummy "${string_to_test}"
  setexpr sub dummy '<some regex>' ''
  if test "${dummy}" != "${string_to_test}" ; then ...

When CONFIG_REGEX is set, teach the test command a new operator, =~,
which will allow one to more naturally write

  if test "${string_to_test}" =~ '<some regex>' ; then ...

The =~ operator with similar functionality is also supported in bash
when using its "extended" test operator [[ ]].

Reviewed-by: Simon Glass <s...@chromium.org>
Reviewed-by: Tom Rini <tr...@konsulko.com>
Signed-off-by: Rasmus Villemoes <r...@prevas.dk>
---
 cmd/test.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/cmd/test.c b/cmd/test.c
index b4c3eabf9f6..a42a523d33d 100644
--- a/cmd/test.c
+++ b/cmd/test.c
@@ -7,6 +7,7 @@
 #include <command.h>
 #include <fs.h>
 #include <log.h>
+#include <slre.h>
 #include <vsprintf.h>
 
 #define OP_INVALID     0
@@ -26,6 +27,7 @@
 #define OP_INT_GT      14
 #define OP_INT_GE      15
 #define OP_FILE_EXISTS 16
+#define OP_REGEX       17
 
 const struct {
        int arg;
@@ -49,6 +51,9 @@ const struct {
        {0, "-z", OP_STR_EMPTY, 2},
        {0, "-n", OP_STR_NEMPTY, 2},
        {0, "-e", OP_FILE_EXISTS, 4},
+#ifdef CONFIG_REGEX
+       {1, "=~", OP_REGEX, 3},
+#endif
 };
 
 static int do_test(struct cmd_tbl *cmdtp, int flag, int argc,
@@ -141,6 +146,20 @@ static int do_test(struct cmd_tbl *cmdtp, int flag, int 
argc,
                case OP_FILE_EXISTS:
                        expr = file_exists(ap[1], ap[2], ap[3], FS_TYPE_ANY);
                        break;
+#ifdef CONFIG_REGEX
+               case OP_REGEX: {
+                       struct slre slre;
+
+                       if (slre_compile(&slre, ap[2]) == 0) {
+                               printf("Error compiling regex: %s\n", 
slre.err_str);
+                               expr = 0;
+                               break;
+                       }
+
+                       expr = slre_match(&slre, ap[0], strlen(ap[0]), NULL);
+                       break;
+               }
+#endif
                }
 
                switch (op) {
-- 
2.49.0

Reply via email to