test-regex: expose full regcomp() to the command line

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nguyễn Thái Ngọc Duy 2016-06-25 07:22:29 +02:00 коммит произвёл Junio C Hamano
Родитель 949782d860
Коммит d8acfe1eaf
1 изменённых файлов: 49 добавлений и 2 удалений

Просмотреть файл

@ -1,4 +1,21 @@
#include "git-compat-util.h" #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) static int test_regex_bug(void)
{ {
@ -21,8 +38,38 @@ static int test_regex_bug(void)
int main(int argc, char **argv) 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")) if (argc == 2 && !strcmp(argv[1], "--bug"))
return test_regex_bug(); return test_regex_bug();
else else if (argc < 3)
usage("test-regex --bug"); 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;
} }