Add is_regex_special()
authorRené Scharfe <rene.scharfe@lsrfire.ath.cx>
Sat, 17 Jan 2009 15:50:37 +0000 (16:50 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sun, 18 Jan 2009 02:30:41 +0000 (18:30 -0800)
Add is_regex_special(), a character class macro for chars that have a
special meaning in regular expressions.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
ctype.c
git-compat-util.h
grep.c
test-ctype.c
diff --git a/ctype.c b/ctype.c
index 9de187c812ff39a5cd7bbe81d9808130c9c40bec..b90ec004f29c30c4b6a6ea5339599d7a8db0fb8c 100644 (file)
--- a/ctype.c
+++ b/ctype.c
@@ -10,16 +10,17 @@ enum {
        A = GIT_ALPHA,
        D = GIT_DIGIT,
        G = GIT_GLOB_SPECIAL,   /* *, ?, [, \\ */
+       R = GIT_REGEX_SPECIAL,  /* $, (, ), +, ., ^, {, | * */
 };
 
 unsigned char sane_ctype[256] = {
        0, 0, 0, 0, 0, 0, 0, 0, 0, S, S, 0, 0, S, 0, 0,         /*   0.. 15 */
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,         /*  16.. 31 */
-       S, 0, 0, 0, 0, 0, 0, 0, 0, 0, G, 0, 0, 0, 0, 0,         /*  32.. 47 */
+       S, 0, 0, 0, R, 0, 0, 0, R, R, G, R, 0, 0, R, 0,         /*  32.. 47 */
        D, D, D, D, D, D, D, D, D, D, 0, 0, 0, 0, 0, G,         /*  48.. 63 */
        0, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A,         /*  64.. 79 */
-       A, A, A, A, A, A, A, A, A, A, A, G, G, 0, 0, 0,         /*  80.. 95 */
+       A, A, A, A, A, A, A, A, A, A, A, G, G, 0, R, 0,         /*  80.. 95 */
        0, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A,         /*  96..111 */
-       A, A, A, A, A, A, A, A, A, A, A, 0, 0, 0, 0, 0,         /* 112..127 */
+       A, A, A, A, A, A, A, A, A, A, A, R, R, 0, 0, 0,         /* 112..127 */
        /* Nothing in the 128.. range */
 };
index 7c925881d97df5db2ee89aba4fa95579e04dcc30..079cbe9440dc73ba8703fe2efb70bd6677535a05 100644 (file)
@@ -328,12 +328,14 @@ extern unsigned char sane_ctype[256];
 #define GIT_DIGIT 0x02
 #define GIT_ALPHA 0x04
 #define GIT_GLOB_SPECIAL 0x08
+#define GIT_REGEX_SPECIAL 0x10
 #define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0)
 #define isspace(x) sane_istest(x,GIT_SPACE)
 #define isdigit(x) sane_istest(x,GIT_DIGIT)
 #define isalpha(x) sane_istest(x,GIT_ALPHA)
 #define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT)
 #define is_glob_special(x) sane_istest(x,GIT_GLOB_SPECIAL)
+#define is_regex_special(x) sane_istest(x,GIT_GLOB_SPECIAL | GIT_REGEX_SPECIAL)
 #define tolower(x) sane_case((unsigned char)(x), 0x20)
 #define toupper(x) sane_case((unsigned char)(x), 0)
 
diff --git a/grep.c b/grep.c
index f9a45258aa0485df6f6205aa8121bdad07a480b0..062b2b6f28f6332518240d2a474a7739735e1ecf 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -28,16 +28,9 @@ void append_grep_pattern(struct grep_opt *opt, const char *pat,
        p->next = NULL;
 }
 
-static int isregexspecial(int c)
-{
-       return c == '\0' || is_glob_special(c) ||
-               c == '$' || c == '(' || c == ')' || c == '+' ||
-               c == '.' || c == '^' || c == '{' || c == '|';
-}
-
 static int is_fixed(const char *s)
 {
-       while (!isregexspecial(*s))
+       while (*s && !is_regex_special(*s))
                s++;
        return !*s;
 }
index d6425d5b40b6849d63a4f6b924fb2eb3dbded9e7..033c74911ed035ed36b16b0e2bf7327d6cdc5823 100644 (file)
@@ -26,6 +26,11 @@ static int test_is_glob_special(int c)
        return is_glob_special(c);
 }
 
+static int test_is_regex_special(int c)
+{
+       return is_regex_special(c);
+}
+
 #define DIGIT "0123456789"
 #define LOWER "abcdefghijklmnopqrstuvwxyz"
 #define UPPER "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
@@ -40,6 +45,7 @@ static const struct ctype_class {
        { "isalpha", test_isalpha, LOWER UPPER },
        { "isalnum", test_isalnum, LOWER UPPER DIGIT },
        { "is_glob_special", test_is_glob_special, "*?[\\" },
+       { "is_regex_special", test_is_regex_special, "$()*+.?[\\^{|" },
        { NULL }
 };