diff options
author | Russell Belfer <rb@github.com> | 2013-01-09 16:02:42 -0800 |
---|---|---|
committer | Russell Belfer <rb@github.com> | 2013-01-15 09:51:35 -0800 |
commit | 23594c1dae08c9a53f571dbf9de7ff0b6a6a0d45 (patch) | |
tree | 15b1395fcabbdefba9fa24051d6a49a998685cc0 | |
parent | 851ad65081793bb5fd65052907bf1c3c4e7e5729 (diff) | |
download | libgit2-23594c1dae08c9a53f571dbf9de7ff0b6a6a0d45.tar.gz |
Add git_path_icmp to case-insensitive path cmp
This adds git_path_icmp to complement git_path_cmp.
-rw-r--r-- | src/path.c | 24 | ||||
-rw-r--r-- | src/path.h | 7 |
2 files changed, 30 insertions, 1 deletions
diff --git a/src/path.c b/src/path.c index 0fd367eaf..5de58cce7 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 de0a40b53..feefd65d1 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). |