Commit 23594c1dae08c9a53f571dbf9de7ff0b6a6a0d45

Russell Belfer 2013-01-09T16:02:42

Add git_path_icmp to case-insensitive path cmp This adds git_path_icmp to complement git_path_cmp.

diff --git a/src/path.c b/src/path.c
index 0fd367e..5de58cc 100644
--- a/src/path.c
+++ b/src/path.c
@@ -701,6 +701,30 @@ int git_path_cmp(
 	return (c1 < c2) ? -1 : (c1 > c2) ? 1 : 0;
 }
 
+int git_path_icmp(
+	const char *name1, size_t len1, int isdir1,
+	const char *name2, size_t len2, int isdir2)
+{
+	unsigned char c1, c2;
+	size_t len = len1 < len2 ? len1 : len2;
+	int cmp;
+
+	cmp = strncasecmp(name1, name2, len);
+	if (cmp)
+		return cmp;
+
+	c1 = name1[len];
+	c2 = name2[len];
+
+	if (c1 == '\0' && isdir1)
+		c1 = '/';
+
+	if (c2 == '\0' && isdir2)
+		c2 = '/';
+
+	return (c1 < c2) ? -1 : (c1 > c2) ? 1 : 0;
+}
+
 int git_path_direach(
 	git_buf *path,
 	int (*fn)(void *, git_buf *),
diff --git a/src/path.h b/src/path.h
index de0a40b..feefd65 100644
--- a/src/path.h
+++ b/src/path.h
@@ -261,12 +261,17 @@ extern int git_path_direach(
 	void *state);
 
 /**
- * Sort function to order two paths.
+ * Sort function to order two paths
  */
 extern int git_path_cmp(
 	const char *name1, size_t len1, int isdir1,
 	const char *name2, size_t len2, int isdir2);
 
+/** Path sort function that is case insensitive */
+extern int git_path_icmp(
+	const char *name1, size_t len1, int isdir1,
+	const char *name2, size_t len2, int isdir2);
+
 /**
  * Invoke callback up path directory by directory until the ceiling is
  * reached (inclusive of a final call at the root_path).