Add string utility functions for prefix and suffix compares Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
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