diff options
| author | Edward Thomson <ethomson@edwardthomson.com> | 2017-11-30 15:40:13 +0000 |
|---|---|---|
| committer | Edward Thomson <ethomson@edwardthomson.com> | 2017-12-20 16:08:01 +0000 |
| commit | 86219f40689c85ec4418575223f4376beffa45af (patch) | |
| tree | 3a76dc40fd06ce4f611dbaffd6fd48be911a1a12 /src/util.c | |
| parent | b7d36ef4a644c69c37e64c7c813546a68264b924 (diff) | |
| download | libgit2-86219f40689c85ec4418575223f4376beffa45af.tar.gz | |
util: introduce `git__prefixncmp` and consolidate implementations
Introduce `git_prefixncmp` that will search up to the first `n`
characters of a string to see if it is prefixed by another string.
This is useful for examining if a non-null terminated character
array is prefixed by a particular substring.
Consolidate the various implementations of `git__prefixcmp` around a
single core implementation and add some test cases to validate its
behavior.
Diffstat (limited to 'src/util.c')
| -rw-r--r-- | src/util.c | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/src/util.c b/src/util.c index 6ae5cdaec..1760a315e 100644 --- a/src/util.c +++ b/src/util.c @@ -252,35 +252,47 @@ void git__strtolower(char *str) git__strntolower(str, strlen(str)); } -int git__prefixcmp(const char *str, const char *prefix) +GIT_INLINE(int) prefixcmp(const char *str, size_t str_n, const char *prefix, bool icase) { - for (;;) { - unsigned char p = *(prefix++), s; + int s, p; + + while (str_n--) { + s = (unsigned char)*str++; + p = (unsigned char)*prefix++; + + if (icase) { + s = git__tolower(s); + p = git__tolower(p); + } + if (!p) return 0; - if ((s = *(str++)) != p) + + if (s != p) return s - p; } + + return (0 - *prefix); } -int git__prefixcmp_icase(const char *str, const char *prefix) +int git__prefixcmp(const char *str, const char *prefix) { - return strncasecmp(str, prefix, strlen(prefix)); + return prefixcmp(str, SIZE_MAX, prefix, false); } -int git__prefixncmp_icase(const char *str, size_t str_n, const char *prefix) +int git__prefixncmp(const char *str, size_t str_n, const char *prefix) { - int s, p; - - while(str_n--) { - s = (unsigned char)git__tolower(*str++); - p = (unsigned char)git__tolower(*prefix++); + return prefixcmp(str, str_n, prefix, false); +} - if (s != p) - return s - p; - } +int git__prefixcmp_icase(const char *str, const char *prefix) +{ + return prefixcmp(str, SIZE_MAX, prefix, true); +} - return (0 - *prefix); +int git__prefixncmp_icase(const char *str, size_t str_n, const char *prefix) +{ + return prefixcmp(str, str_n, prefix, true); } int git__suffixcmp(const char *str, const char *suffix) |
