about summary refs log tree commit diff
path: root/lr.c
diff options
context:
space:
mode:
authorChristian Neukirchen <chneukirchen@gmail.com>2015-10-23 12:48:05 +0200
committerChristian Neukirchen <chneukirchen@gmail.com>2015-10-23 12:48:05 +0200
commit3f1607927476aefce7adf9389ccd820626db2a02 (patch)
tree70d7e18fbd346544a253b95eacdd1d4c962d390b /lr.c
parent486fc4ce9d82ef435f8a74076f34a369f1903be1 (diff)
downloadlr-3f1607927476aefce7adf9389ccd820626db2a02.tar.gz
lr-3f1607927476aefce7adf9389ccd820626db2a02.tar.xz
lr-3f1607927476aefce7adf9389ccd820626db2a02.zip
add regex =~ =~~
Diffstat (limited to 'lr.c')
-rw-r--r--lr.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/lr.c b/lr.c
index 626ec43..547526b 100644
--- a/lr.c
+++ b/lr.c
@@ -23,6 +23,7 @@ TODO:
 #include <fnmatch.h>
 #include <grp.h>
 #include <pwd.h>
+#include <regex.h>
 #include <search.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -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;
 		}
 	}
 	}