Commit 9eb7976448bf684dfb41993ef6c76098978ff933

Shawn O. Pearce 2008-12-31T14:35:39

Add string utility functions for prefix and suffix compares Signed-off-by: Shawn O. Pearce <spearce@spearce.org>

diff --git a/src/util.c b/src/util.c
index 64b5d4f..feb1bd8 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 f269af4..8e8169c 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 0000000..9e4700a
--- /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