test-regex: expose full regcomp() to the command line
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sat, 25 Jun 2016 05:22:29 +0000 (07:22 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 27 Jun 2016 14:31:35 +0000 (07:31 -0700)
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
test-regex.c
index 67a1a650672478d4453fcfe6272fad4be749fdd4..eff26f534fc21e3d77bc3d6cf76fce2b5a74e981 100644 (file)
@@ -1,4 +1,21 @@
 #include "git-compat-util.h"
+#include "gettext.h"
+
+struct reg_flag {
+       const char *name;
+       int flag;
+};
+
+static struct reg_flag reg_flags[] = {
+       { "EXTENDED",    REG_EXTENDED   },
+       { "NEWLINE",     REG_NEWLINE    },
+       { "ICASE",       REG_ICASE      },
+       { "NOTBOL",      REG_NOTBOL     },
+#ifdef REG_STARTEND
+       { "STARTEND",    REG_STARTEND   },
+#endif
+       { NULL, 0 }
+};
 
 static int test_regex_bug(void)
 {
@@ -21,8 +38,38 @@ static int test_regex_bug(void)
 
 int main(int argc, char **argv)
 {
+       const char *pat;
+       const char *str;
+       int flags = 0;
+       regex_t r;
+       regmatch_t m[1];
+
        if (argc == 2 && !strcmp(argv[1], "--bug"))
                return test_regex_bug();
-       else
-               usage("test-regex --bug");
+       else if (argc < 3)
+               usage("test-regex --bug\n"
+                     "test-regex <pattern> <string> [<options>]");
+
+       argv++;
+       pat = *argv++;
+       str = *argv++;
+       while (*argv) {
+               struct reg_flag *rf;
+               for (rf = reg_flags; rf->name; rf++)
+                       if (!strcmp(*argv, rf->name)) {
+                               flags |= rf->flag;
+                               break;
+                       }
+               if (!rf->name)
+                       die("do not recognize %s", *argv);
+               argv++;
+       }
+       git_setup_gettext();
+
+       if (regcomp(&r, pat, flags))
+               die("failed regcomp() for pattern '%s'", pat);
+       if (regexec(&r, str, 1, m, 0))
+               return 1;
+
+       return 0;
 }