summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/util.c20
-rw-r--r--src/util.h3
-rw-r--r--tests/t0003-strutil.c67
3 files changed, 90 insertions, 0 deletions
diff --git a/src/util.c b/src/util.c
index 64b5d4fbe..feb1bd8ab 100644
--- a/src/util.c
+++ b/src/util.c
@@ -24,3 +24,23 @@ char *git__strdup(const char *s)
return git_ptr_error(GIT_ENOMEM);
return r;
}
+
+int git__prefixcmp(const char *str, const char *prefix)
+{
+ for (;;) {
+ char p = *(prefix++), s;
+ if (!p)
+ return 0;
+ if ((s = *(str++)) != p)
+ return s - p;
+ }
+}
+
+int git__suffixcmp(const char *str, const char *suffix)
+{
+ size_t a = strlen(str);
+ size_t b = strlen(suffix);
+ if (a < b)
+ return -1;
+ return strcmp(str + (a - b), suffix);
+}
diff --git a/src/util.h b/src/util.h
index f269af47f..8e8169ce5 100644
--- a/src/util.h
+++ b/src/util.h
@@ -26,6 +26,9 @@ extern char *git__strdup(const char *);
# define strdup(a) GIT__FORBID_MALLOC
#endif
+extern int git__prefixcmp(const char *str, const char *prefix);
+extern int git__suffixcmp(const char *str, const char *suffix);
+
/*
* Realloc the buffer pointed at by variable 'x' so that it can hold
* at least 'nr' entries; the number of entries currently allocated
diff --git a/tests/t0003-strutil.c b/tests/t0003-strutil.c
new file mode 100644
index 000000000..9e4700a60
--- /dev/null
+++ b/tests/t0003-strutil.c
@@ -0,0 +1,67 @@
+#include "test_lib.h"
+#include "common.h"
+
+BEGIN_TEST(prefixcmp_empty_empty)
+ must_be_true(git__prefixcmp("", "") == 0);
+END_TEST
+
+BEGIN_TEST(prefixcmp_a_empty)
+ must_be_true(git__prefixcmp("a", "") == 0);
+END_TEST
+
+BEGIN_TEST(prefixcmp_empty_a)
+ must_be_true(git__prefixcmp("", "a") < 0);
+END_TEST
+
+BEGIN_TEST(prefixcmp_a_b)
+ must_be_true(git__prefixcmp("a", "b") < 0);
+END_TEST
+
+BEGIN_TEST(prefixcmp_b_a)
+ must_be_true(git__prefixcmp("b", "a") > 0);
+END_TEST
+
+BEGIN_TEST(prefixcmp_ab_a)
+ must_be_true(git__prefixcmp("ab", "a") == 0);
+END_TEST
+
+BEGIN_TEST(prefixcmp_ab_ac)
+ must_be_true(git__prefixcmp("ab", "ac") < 0);
+END_TEST
+
+BEGIN_TEST(prefixcmp_ab_aa)
+ must_be_true(git__prefixcmp("ab", "aa") > 0);
+END_TEST
+
+
+BEGIN_TEST(suffixcmp_empty_empty)
+ must_be_true(git__suffixcmp("", "") == 0);
+END_TEST
+
+BEGIN_TEST(suffixcmp_a_empty)
+ must_be_true(git__suffixcmp("a", "") == 0);
+END_TEST
+
+BEGIN_TEST(suffixcmp_empty_a)
+ must_be_true(git__suffixcmp("", "a") < 0);
+END_TEST
+
+BEGIN_TEST(suffixcmp_a_b)
+ must_be_true(git__suffixcmp("a", "b") < 0);
+END_TEST
+
+BEGIN_TEST(suffixcmp_b_a)
+ must_be_true(git__suffixcmp("b", "a") > 0);
+END_TEST
+
+BEGIN_TEST(suffixcmp_ba_a)
+ must_be_true(git__suffixcmp("ba", "a") == 0);
+END_TEST
+
+BEGIN_TEST(suffixcmp_zaa_ac)
+ must_be_true(git__suffixcmp("zaa", "ac") < 0);
+END_TEST
+
+BEGIN_TEST(suffixcmp_zaz_ac)
+ must_be_true(git__suffixcmp("zaz", "ac") > 0);
+END_TEST