From 4b9592f93a68f88152b390898004e5e54b540cae Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sun, 18 Dec 2016 12:38:19 -0500 Subject: Implement -regex, -iregex, and -regextype/-E --- eval.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'eval.c') diff --git a/eval.c b/eval.c index ebead3b..123c37a 100644 --- a/eval.c +++ b/eval.c @@ -742,6 +742,39 @@ bool eval_quit(const struct expr *expr, struct eval_state *state) { return true; } +/** + * -i?regex test. + */ +bool eval_regex(const struct expr *expr, struct eval_state *state) { + const char *path = state->ftwbuf->path; + size_t len = strlen(path); + regmatch_t match = { + .rm_so = 0, + .rm_eo = len, + }; + + int flags = 0; +#ifdef REG_STARTEND + flags |= REG_STARTEND; +#endif + int err = regexec(expr->regex, path, 1, &match, flags); + if (err == 0) { + return match.rm_so == 0 && match.rm_eo == len; + } else { + if (err != REG_NOMATCH) { + char *str = xregerror(err, expr->regex); + if (str) { + pretty_error(state->cmdline->stderr_colors, + "'%s': %s\n", path, str); + free(str); + } else { + perror("xregerror()"); + } + } + return false; + } +} + /** * -samefile test. */ -- cgit v1.2.3