From 3f1607927476aefce7adf9389ccd820626db2a02 Mon Sep 17 00:00:00 2001 From: Christian Neukirchen Date: Fri, 23 Oct 2015 12:48:05 +0200 Subject: add regex =~ =~~ --- lr.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'lr.c') diff --git a/lr.c b/lr.c index 626ec43..547526b 100644 --- a/lr.c +++ b/lr.c @@ -23,6 +23,7 @@ TODO: #include #include #include +#include #include #include #include @@ -87,6 +88,8 @@ enum op { EXPR_STREQI, EXPR_GLOB, EXPR_GLOBI, + EXPR_REGEX, + EXPR_REGEXI, EXPR_PRUNE, EXPR_TYPE, }; @@ -126,6 +129,7 @@ struct expr { struct expr *expr; char *string; long num; + regex_t *regex; } a, b; }; @@ -283,16 +287,27 @@ parse_strcmp() op = EXPR_GLOBI; else if (token("~~")) op = EXPR_GLOB; + else if (token("=~~")) + op = EXPR_REGEXI; + else if (token("=~")) + op = EXPR_REGEX; else return 0; // TODO ERROR - // TODO =~ =~~ regex char *s; if (parse_string(&s)) { struct expr *e = malloc(sizeof (struct expr)); e->op = op; e->a.prop = prop; - e->b.string = s; + if (op == EXPR_REGEX) { + e->b.regex = malloc (sizeof (regex_t)); + regcomp(e->b.regex, s, REG_EXTENDED | REG_NOSUB); + } else if (op == EXPR_REGEXI) { + e->b.regex = malloc (sizeof (regex_t)); + regcomp(e->b.regex, s, REG_EXTENDED | REG_NOSUB | REG_ICASE); + } else { + e->b.string = s; + } return e; } @@ -481,6 +496,8 @@ eval(struct expr *e, struct fileinfo *fi) case EXPR_STREQI: case EXPR_GLOB: case EXPR_GLOBI: + case EXPR_REGEX: + case EXPR_REGEXI: { const char *s = ""; switch(e->a.prop) { @@ -498,6 +515,9 @@ eval(struct expr *e, struct fileinfo *fi) case EXPR_GLOBI: return fnmatch(e->b.string, s, FNM_PATHNAME | FNM_CASEFOLD) == 0; + case EXPR_REGEX: + case EXPR_REGEXI: + return regexec(e->b.regex, s, 0, 0, 0) == 0; } } } -- cgit 1.4.1