git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 05/13] wildmatch: follow Git's coding convention

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Oct 15, 2012, 06:25 UTC
Message-ID
<1350282362-4505-5-git-send-email-pclouds@gmail.com>
In-Reply-To
<1350282362-4505-1-git-send-email-pclouds@gmail.com>

wildmatch's coding style is pretty close to Git's except the use of 4 space indentation instead of 8. This patch should produce empty diff with "git diff -b"

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 wildmatch.c | 292 ++++++++++++++++++++++++++++++------------------------------
 1 file changed, 146 insertions(+), 146 deletions(-)
diff --git a/wildmatch.c b/wildmatch.c
index fae7397..4653dd6 100644
--- a/wildmatch.c
+++ b/wildmatch.c
@@ -58,167 +58,167 @@ static int force_lower_case = 0;
 /* Match pattern "p" against "text" */
 static int dowild(const uchar *p, const uchar *text)
 {
-    uchar p_ch;
+	uchar p_ch;
 
-    for ( ; (p_ch = *p) != '\0'; text++, p++) {
-	int matched, special;
-	uchar t_ch, prev_ch;
-	if ((t_ch = *text) == '\0' && p_ch != '*')
-		return ABORT_ALL;
-	if (force_lower_case && ISUPPER(t_ch))
-	    t_ch = tolower(t_ch);
-	switch (p_ch) {
-	  case '\\':
-	    /* Literal match with following character.  Note that the test
-	     * in "default" handles the p[1] == '\0' failure case. */
-	    p_ch = *++p;
-	    /* FALLTHROUGH */
-	  default:
-	    if (t_ch != p_ch)
-		return FALSE;
-	    continue;
-	  case '?':
-	    /* Match anything but '/'. */
-	    if (t_ch == '/')
-		return FALSE;
-	    continue;
-	  case '*':
-	    if (*++p == '*') {
-		while (*++p == '*') {}
-		special = TRUE;
-	    } else
-		special = FALSE;
-	    if (*p == '\0') {
-		/* Trailing "**" matches everything.  Trailing "*" matches
-		 * only if there are no more slash characters. */
-		if (!special) {
-			if (strchr((char*)text, '/') != NULL)
-			    return FALSE;
-		}
-		return TRUE;
-	    }
-	    while (1) {
-		if (t_ch == '\0')
-		    break;
-		if ((matched = dowild(p, text)) != FALSE) {
-		    if (!special || matched != ABORT_TO_STARSTAR)
-			return matched;
-		} else if (!special && t_ch == '/')
-		    return ABORT_TO_STARSTAR;
-		t_ch = *++text;
-	    }
-	    return ABORT_ALL;
-	  case '[':
-	    p_ch = *++p;
-#ifdef NEGATE_CLASS2
-	    if (p_ch == NEGATE_CLASS2)
-		p_ch = NEGATE_CLASS;
-#endif
-	    /* Assign literal TRUE/FALSE because of "matched" comparison. */
-	    special = p_ch == NEGATE_CLASS? TRUE : FALSE;
-	    if (special) {
-		/* Inverted character class. */
-		p_ch = *++p;
-	    }
-	    prev_ch = 0;
-	    matched = FALSE;
-	    do {
-		if (!p_ch)
-		    return ABORT_ALL;
-		if (p_ch == '\\') {
-		    p_ch = *++p;
-		    if (!p_ch)
+	for ( ; (p_ch = *p) != '\0'; text++, p++) {
+		int matched, special;
+		uchar t_ch, prev_ch;
+		if ((t_ch = *text) == '\0' && p_ch != '*')
 			return ABORT_ALL;
-		    if (t_ch == p_ch)
-			matched = TRUE;
-		} else if (p_ch == '-' && prev_ch && p[1] && p[1] != ']') {
-		    p_ch = *++p;
-		    if (p_ch == '\\') {
+		if (force_lower_case && ISUPPER(t_ch))
+			t_ch = tolower(t_ch);
+		switch (p_ch) {
+		case '\\':
+			/* Literal match with following character.  Note that the test
+			 * in "default" handles the p[1] == '\0' failure case. */
 			p_ch = *++p;
-			if (!p_ch)
-			    return ABORT_ALL;
-		    }
-		    if (t_ch <= p_ch && t_ch >= prev_ch)
-			matched = TRUE;
-		    p_ch = 0; /* This makes "prev_ch" get set to 0. */
-		} else if (p_ch == '[' && p[1] == ':') {
-		    const uchar *s;
-		    int i;
-		    for (s = p += 2; (p_ch = *p) && p_ch != ']'; p++) {} /*SHARED ITERATOR*/
-		    if (!p_ch)
-			return ABORT_ALL;
-		    i = p - s - 1;
-		    if (i < 0 || p[-1] != ':') {
-			/* Didn't find ":]", so treat like a normal set. */
-			p = s - 2;
-			p_ch = '[';
-			if (t_ch == p_ch)
-			    matched = TRUE;
+			/* FALLTHROUGH */
+		default:
+			if (t_ch != p_ch)
+				return FALSE;
+			continue;
+		case '?':
+			/* Match anything but '/'. */
+			if (t_ch == '/')
+				return FALSE;
 			continue;
-		    }
-		    if (CC_EQ(s,i, "alnum")) {
-			if (ISALNUM(t_ch))
-			    matched = TRUE;
-		    } else if (CC_EQ(s,i, "alpha")) {
-			if (ISALPHA(t_ch))
-			    matched = TRUE;
-		    } else if (CC_EQ(s,i, "blank")) {
-			if (ISBLANK(t_ch))
-			    matched = TRUE;
-		    } else if (CC_EQ(s,i, "cntrl")) {
-			if (ISCNTRL(t_ch))
-			    matched = TRUE;
-		    } else if (CC_EQ(s,i, "digit")) {
-			if (ISDIGIT(t_ch))
-			    matched = TRUE;
-		    } else if (CC_EQ(s,i, "graph")) {
-			if (ISGRAPH(t_ch))
-			    matched = TRUE;
-		    } else if (CC_EQ(s,i, "lower")) {
-			if (ISLOWER(t_ch))
-			    matched = TRUE;
-		    } else if (CC_EQ(s,i, "print")) {
-			if (ISPRINT(t_ch))
-			    matched = TRUE;
-		    } else if (CC_EQ(s,i, "punct")) {
-			if (ISPUNCT(t_ch))
-			    matched = TRUE;
-		    } else if (CC_EQ(s,i, "space")) {
-			if (ISSPACE(t_ch))
-			    matched = TRUE;
-		    } else if (CC_EQ(s,i, "upper")) {
-			if (ISUPPER(t_ch))
-			    matched = TRUE;
-		    } else if (CC_EQ(s,i, "xdigit")) {
-			if (ISXDIGIT(t_ch))
-			    matched = TRUE;
-		    } else /* malformed [:class:] string */
+		case '*':
+			if (*++p == '*') {
+				while (*++p == '*') {}
+				special = TRUE;
+			} else
+				special = FALSE;
+			if (*p == '\0') {
+				/* Trailing "**" matches everything.  Trailing "*" matches
+				 * only if there are no more slash characters. */
+				if (!special) {
+					if (strchr((char*)text, '/') != NULL)
+						return FALSE;
+				}
+				return TRUE;
+			}
+			while (1) {
+				if (t_ch == '\0')
+					break;
+				if ((matched = dowild(p, text)) != FALSE) {
+					if (!special || matched != ABORT_TO_STARSTAR)
+						return matched;
+				} else if (!special && t_ch == '/')
+					return ABORT_TO_STARSTAR;
+				t_ch = *++text;
+			}
 			return ABORT_ALL;
-		    p_ch = 0; /* This makes "prev_ch" get set to 0. */
-		} else if (t_ch == p_ch)
-		    matched = TRUE;
-	    } while (prev_ch = p_ch, (p_ch = *++p) != ']');
-	    if (matched == special || t_ch == '/')
-		return FALSE;
-	    continue;
+		case '[':
+			p_ch = *++p;
+#ifdef NEGATE_CLASS2
+			if (p_ch == NEGATE_CLASS2)
+				p_ch = NEGATE_CLASS;
+#endif
+			/* Assign literal TRUE/FALSE because of "matched" comparison. */
+			special = p_ch == NEGATE_CLASS? TRUE : FALSE;
+			if (special) {
+				/* Inverted character class. */
+				p_ch = *++p;
+			}
+			prev_ch = 0;
+			matched = FALSE;
+			do {
+				if (!p_ch)
+					return ABORT_ALL;
+				if (p_ch == '\\') {
+					p_ch = *++p;
+					if (!p_ch)
+						return ABORT_ALL;
+					if (t_ch == p_ch)
+						matched = TRUE;
+				} else if (p_ch == '-' && prev_ch && p[1] && p[1] != ']') {
+					p_ch = *++p;
+					if (p_ch == '\\') {
+						p_ch = *++p;
+						if (!p_ch)
+							return ABORT_ALL;
+					}
+					if (t_ch <= p_ch && t_ch >= prev_ch)
+						matched = TRUE;
+					p_ch = 0; /* This makes "prev_ch" get set to 0. */
+				} else if (p_ch == '[' && p[1] == ':') {
+					const uchar *s;
+					int i;
+					for (s = p += 2; (p_ch = *p) && p_ch != ']'; p++) {} /*SHARED ITERATOR*/
+					if (!p_ch)
+						return ABORT_ALL;
+					i = p - s - 1;
+					if (i < 0 || p[-1] != ':') {
+						/* Didn't find ":]", so treat like a normal set. */
+						p = s - 2;
+						p_ch = '[';
+						if (t_ch == p_ch)
+							matched = TRUE;
+						continue;
+					}
+					if (CC_EQ(s,i, "alnum")) {
+						if (ISALNUM(t_ch))
+							matched = TRUE;
+					} else if (CC_EQ(s,i, "alpha")) {
+						if (ISALPHA(t_ch))
+							matched = TRUE;
+					} else if (CC_EQ(s,i, "blank")) {
+						if (ISBLANK(t_ch))
+							matched = TRUE;
+					} else if (CC_EQ(s,i, "cntrl")) {
+						if (ISCNTRL(t_ch))
+							matched = TRUE;
+					} else if (CC_EQ(s,i, "digit")) {
+						if (ISDIGIT(t_ch))
+							matched = TRUE;
+					} else if (CC_EQ(s,i, "graph")) {
+						if (ISGRAPH(t_ch))
+							matched = TRUE;
+					} else if (CC_EQ(s,i, "lower")) {
+						if (ISLOWER(t_ch))
+							matched = TRUE;
+					} else if (CC_EQ(s,i, "print")) {
+						if (ISPRINT(t_ch))
+							matched = TRUE;
+					} else if (CC_EQ(s,i, "punct")) {
+						if (ISPUNCT(t_ch))
+							matched = TRUE;
+					} else if (CC_EQ(s,i, "space")) {
+						if (ISSPACE(t_ch))
+							matched = TRUE;
+					} else if (CC_EQ(s,i, "upper")) {
+						if (ISUPPER(t_ch))
+							matched = TRUE;
+					} else if (CC_EQ(s,i, "xdigit")) {
+						if (ISXDIGIT(t_ch))
+							matched = TRUE;
+					} else /* malformed [:class:] string */
+						return ABORT_ALL;
+					p_ch = 0; /* This makes "prev_ch" get set to 0. */
+				} else if (t_ch == p_ch)
+					matched = TRUE;
+			} while (prev_ch = p_ch, (p_ch = *++p) != ']');
+			if (matched == special || t_ch == '/')
+				return FALSE;
+			continue;
+		}
 	}
-    }
 
-    return *text ? FALSE : TRUE;
+	return *text ? FALSE : TRUE;
 }
 
 /* Match the "pattern" against the "text" string. */
 int wildmatch(const char *pattern, const char *text)
 {
-    return dowild((const uchar*)pattern, (const uchar*)text) == TRUE;
+	return dowild((const uchar*)pattern, (const uchar*)text) == TRUE;
 }
 
 /* Match the "pattern" against the forced-to-lower-case "text" string. */
 int iwildmatch(const char *pattern, const char *text)
 {
-    int ret;
-    force_lower_case = 1;
-    ret = dowild((const uchar*)pattern, (const uchar*)text) == TRUE;
-    force_lower_case = 0;
-    return ret;
+	int ret;
+	force_lower_case = 1;
+	ret = dowild((const uchar*)pattern, (const uchar*)text) == TRUE;
+	force_lower_case = 0;
+	return ret;
 }
-- 
1.8.0.rc0.29.g1fdd78f
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 12 of 55 in “nd/attr-match-more-optim, nd/wildmatch and as/check-ignore”
  1. Nguyễn Thái Ngọc DuyOct 15, 2012
  2. 1/6 exclude: stricten a length check in EXC_FLAG_ENDSWITH caseNguyễn Thái Ngọc Duy, Oct 15, 2012
  3. 2/6 exclude: split basename matching code into a separate functionNguyễn Thái Ngọc Duy, Oct 15, 2012
  4. 3/6 exclude: fix a bug in prefix compare optimizationNguyễn Thái Ngọc Duy, Oct 15, 2012
  5. 4/6 exclude: split pathname matching code into a separate functionNguyễn Thái Ngọc Duy, Oct 15, 2012
  6. 5/6 gitignore: make pattern parsing code a separate functionNguyễn Thái Ngọc Duy, Oct 15, 2012
  7. 6/6 attr: more matching optimizations from .gitignoreNguyễn Thái Ngọc Duy, Oct 15, 2012
  8. 01/13 ctype: make sane_ctype[] const arrayNguyễn Thái Ngọc Duy, Oct 15, 2012
  9. 02/13 ctype: support iscntrl, ispunct, isxdigit and isprintNguyễn Thái Ngọc Duy, Oct 15, 2012
  10. 03/13 Import wildmatch from rsyncNguyễn Thái Ngọc Duy, Oct 15, 2012
  11. 04/13 wildmatch: remove unnecessary functionsNguyễn Thái Ngọc Duy, Oct 15, 2012
  12. 05/13 wildmatch: follow Git's coding conventionNguyễn Thái Ngọc Duy, Oct 15, 2012
  13. 06/13 Integrate wildmatch to gitNguyễn Thái Ngọc Duy, Oct 15, 2012
  14. 07/13 t3070: disable unreliable fnmatch testsNguyễn Thái Ngọc Duy, Oct 15, 2012
  15. 08/13 wildmatch: make wildmatch's return value compatible with fnmatchNguyễn Thái Ngọc Duy, Oct 15, 2012
  16. 09/13 wildmatch: remove static variable force_lower_caseNguyễn Thái Ngọc Duy, Oct 15, 2012
  17. 10/13 wildmatch: fix case-insensitive matchingNguyễn Thái Ngọc Duy, Oct 15, 2012
  18. 11/13 wildmatch: adjust "**" behaviorNguyễn Thái Ngọc Duy, Oct 15, 2012
  19. 12/13 wildmatch: make /**/ match zero or more directoriesNguyễn Thái Ngọc Duy, Oct 15, 2012
  20. 13/13 Support "**" wildcard in .gitignore and .gitattributesNguyễn Thái Ngọc Duy, Oct 15, 2012
  21. 14/13 wildmatch: fix tests that fail on Windows due to path manglingJohannes Sixt, Nov 4, 2012
  22. Nguyen Thai Ngoc DuyNov 6, 2012
  23. Johannes SixtNov 7, 2012
  24. 14/13 test-wildmatch: fix tests that fail on Windows due to path manglingNguyễn Thái Ngọc Duy, Nov 11, 2012
  25. 15/13 compat/fnmatch: fix off-by-one character class's length checkNguyễn Thái Ngọc Duy, Nov 11, 2012
  26. Johannes SixtNov 13, 2012
  27. Johannes SixtNov 20, 2012
  28. Junio C HamanoNov 11, 2012
  29. 14/13 test-wildmatch: avoid Windows path manglingNguyễn Thái Ngọc Duy, Nov 13, 2012
  30. Johannes SixtNov 13, 2012
  31. 14/13 test-wildmatch: avoid Windows path manglingJohannes Sixt, Nov 20, 2012
  32. Junio C HamanoNov 20, 2012
  33. 14/13 test-wildmatch: avoid Windows path manglingJohannes Sixt, Nov 21, 2012
  34. 01/12 dir.c: rename cryptic 'which' variable to more consistent nameNguyễn Thái Ngọc Duy, Oct 15, 2012
  35. 02/12 dir.c: rename path_excluded() to is_path_excluded()Nguyễn Thái Ngọc Duy, Oct 15, 2012
  36. 03/12 dir.c: rename excluded_from_list() to is_excluded_from_list()Nguyễn Thái Ngọc Duy, Oct 15, 2012
  37. 04/12 dir.c: rename excluded() to is_excluded()Nguyễn Thái Ngọc Duy, Oct 15, 2012
  38. 05/12 dir.c: refactor is_excluded_from_list()Nguyễn Thái Ngọc Duy, Oct 15, 2012
  39. 06/12 dir.c: refactor is_excluded()Nguyễn Thái Ngọc Duy, Oct 15, 2012
  40. 07/12 dir.c: refactor is_path_excluded()Nguyễn Thái Ngọc Duy, Oct 15, 2012
  41. 08/12 dir.c: keep track of where patterns came fromNguyễn Thái Ngọc Duy, Oct 15, 2012
  42. 09/12 dir.c: refactor treat_gitlinks()Nguyễn Thái Ngọc Duy, Oct 15, 2012
  43. 10/12 pathspec.c: move reusable code from builtin/add.cNguyễn Thái Ngọc Duy, Oct 15, 2012
  44. 11/12 dir.c: provide free_directory() for reclaiming dir_struct memoryNguyễn Thái Ngọc Duy, Oct 15, 2012
  45. 12/12 Add git-check-ignore sub-commandNguyễn Thái Ngọc Duy, Oct 15, 2012
  46. Junio C HamanoOct 15, 2012
  47. Nguyen Thai Ngoc DuyOct 16, 2012
  48. Adam SpiersOct 16, 2012
  49. Nguyen Thai Ngoc DuyOct 16, 2012
  50. Adam SpiersOct 16, 2012
  51. Junio C HamanoOct 16, 2012
  52. Adam SpiersDec 17, 2012
  53. t0007: fix tests on WindowsJohannes Sixt, Nov 4, 2012
  54. Jeff KingNov 8, 2012
  55. Junio C HamanoOct 15, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.