Commit 1196de4f by Edward Thomson

util: introduce `git__strlcmp`

Introduce a utility function that compares a NUL terminated string to a
possibly not-NUL terminated string with length.  This is similar to
`strncmp` but with an added check to ensure that the lengths match (not
just the `size` portion of the two strings).
parent e5a32774
...@@ -168,6 +168,17 @@ extern int git__strncasecmp(const char *a, const char *b, size_t sz); ...@@ -168,6 +168,17 @@ extern int git__strncasecmp(const char *a, const char *b, size_t sz);
extern int git__strcasesort_cmp(const char *a, const char *b); extern int git__strcasesort_cmp(const char *a, const char *b);
/*
* Compare some NUL-terminated `a` to a possibly non-NUL terminated
* `b` of length `b_len`; like `strncmp` but ensuring that
* `strlen(a) == b_len` as well.
*/
GIT_INLINE(int) git__strlcmp(const char *a, const char *b, size_t b_len)
{
int cmp = strncmp(a, b, b_len);
return cmp ? cmp : (int)a[b_len];
}
typedef struct { typedef struct {
git_atomic32 refcount; git_atomic32 refcount;
void *owner; void *owner;
......
...@@ -123,3 +123,14 @@ void test_core_string__strcasecmp(void) ...@@ -123,3 +123,14 @@ void test_core_string__strcasecmp(void)
cl_assert(git__strcasecmp("et", "e\342\202\254ghi=") < 0); cl_assert(git__strcasecmp("et", "e\342\202\254ghi=") < 0);
cl_assert(git__strcasecmp("\303\215", "\303\255") < 0); cl_assert(git__strcasecmp("\303\215", "\303\255") < 0);
} }
void test_core_string__strlcmp(void)
{
const char foo[3] = { 'f', 'o', 'o' };
cl_assert(git__strlcmp("foo", "foo", 3) == 0);
cl_assert(git__strlcmp("foo", foo, 3) == 0);
cl_assert(git__strlcmp("foo", "foobar", 3) == 0);
cl_assert(git__strlcmp("foobar", "foo", 3) > 0);
cl_assert(git__strlcmp("foo", "foobar", 6) < 0);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment