summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/core/utils.h2
-rw-r--r--src/utils.c14
-rw-r--r--src/vty/tdef_vty.c12
-rw-r--r--tests/utils/utils_test.c28
-rw-r--r--tests/utils/utils_test.ok15
5 files changed, 60 insertions, 11 deletions
diff --git a/include/osmocom/core/utils.h b/include/osmocom/core/utils.h
index 51e43ee5..474e36c4 100644
--- a/include/osmocom/core/utils.h
+++ b/include/osmocom/core/utils.h
@@ -237,4 +237,6 @@ struct osmo_strbuf {
#define OSMO_STRBUF_PRINTF(STRBUF, fmt, args...) \
OSMO_STRBUF_APPEND(STRBUF, snprintf, fmt, ##args)
+bool osmo_str_startswith(const char *str, const char *startswith_str);
+
/*! @} */
diff --git a/src/utils.c b/src/utils.c
index b8b4ef56..9ab990ab 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -928,4 +928,18 @@ const char osmo_luhn(const char* in, int in_len)
return (sum * 9) % 10 + '0';
}
+/*! Compare start of a string.
+ * This is an optimisation of 'strstr(str, startswith_str) == str' because it doesn't search through the entire string.
+ * \param str (Longer) string to compare.
+ * \param startswith_str (Shorter) string to compare with the start of str.
+ * \return true iff the first characters of str fully match startswith_str or startswith_str is empty. */
+bool osmo_str_startswith(const char *str, const char *startswith_str)
+{
+ if (!startswith_str || !*startswith_str)
+ return true;
+ if (!str)
+ return false;
+ return strncmp(str, startswith_str, strlen(startswith_str)) == 0;
+}
+
/*! @} */
diff --git a/src/vty/tdef_vty.c b/src/vty/tdef_vty.c
index 28de21a7..0dac2bf5 100644
--- a/src/vty/tdef_vty.c
+++ b/src/vty/tdef_vty.c
@@ -247,16 +247,6 @@ void osmo_tdef_vty_write(struct vty *vty, struct osmo_tdef *tdefs, const char *p
/*! Singleton Tnnn groups definition as set by osmo_tdef_vty_groups_init(). */
static struct osmo_tdef_group *global_tdef_groups;
-/*! \return true iff the first characters of str fully match startswith_str or both are empty. */
-static bool startswith(const char *str, const char *startswith_str)
-{
- if (!startswith_str)
- return true;
- if (!str)
- return false;
- return strncmp(str, startswith_str, strlen(startswith_str)) == 0;
-}
-
DEFUN(show_timer, show_timer_cmd, "DYNAMIC", "DYNAMIC")
/* show timer [(alpha|beta|gamma)] [TNNNN] */
{
@@ -268,7 +258,7 @@ DEFUN(show_timer, show_timer_cmd, "DYNAMIC", "DYNAMIC")
* like "softw" or "t" (which can also be ambiguous). */
osmo_tdef_groups_for_each(g, global_tdef_groups) {
- if (!group_arg || startswith(g->name, group_arg))
+ if (!group_arg || osmo_str_startswith(g->name, group_arg))
osmo_tdef_vty_show_cmd(vty, g->tdefs, T_arg, "%s: ", g->name);
}
return CMD_SUCCESS;
diff --git a/tests/utils/utils_test.c b/tests/utils/utils_test.c
index 711d6e12..211b4d1a 100644
--- a/tests/utils/utils_test.c
+++ b/tests/utils/utils_test.c
@@ -1014,6 +1014,33 @@ void strbuf_test()
printf("(need %d chars, had size=63) %s\n", rc, buf);
}
+static void startswith_test_str(const char *str, const char *startswith_str, bool expect_rc)
+{
+ bool rc = osmo_str_startswith(str, startswith_str);
+ printf("osmo_str_startswith(%s, ", osmo_quote_str(str, -1));
+ printf("%s) == %s\n", osmo_quote_str(startswith_str, -1), rc ? "true" : "false");
+ if (rc != expect_rc)
+ printf(" ERROR: EXPECTED %s\n", expect_rc ? "true" : "false");
+}
+
+static void startswith_test()
+{
+ printf("\n%s()\n", __func__);
+ startswith_test_str(NULL, NULL, true);
+ startswith_test_str("", NULL, true);
+ startswith_test_str(NULL, "", true);
+ startswith_test_str("", "", true);
+ startswith_test_str("abc", NULL, true);
+ startswith_test_str("abc", "", true);
+ startswith_test_str(NULL, "abc", false);
+ startswith_test_str("", "abc", false);
+ startswith_test_str("abc", "a", true);
+ startswith_test_str("abc", "ab", true);
+ startswith_test_str("abc", "abc", true);
+ startswith_test_str("abc", "abcd", false);
+ startswith_test_str("abc", "xyz", false);
+}
+
int main(int argc, char **argv)
{
static const struct log_info log_info = {};
@@ -1032,5 +1059,6 @@ int main(int argc, char **argv)
osmo_sockaddr_to_str_and_uint_test();
osmo_str_tolowupper_test();
strbuf_test();
+ startswith_test();
return 0;
}
diff --git a/tests/utils/utils_test.ok b/tests/utils/utils_test.ok
index 8fce9f13..5783eb16 100644
--- a/tests/utils/utils_test.ok
+++ b/tests/utils/utils_test.ok
@@ -340,3 +340,18 @@ cascade:
(need 134 chars)
T minus 10 9 8 7 6 5 4 3 2 1 ... Lift off! -- T minus 10 9 8 7 6 5 4 3 2 1 ... Lift off! -- T minus 10 9 8 7 6 5 4 3 2 1 ... Lift off!
(need 134 chars, had size=63) T minus 10 9 8 7 6 5 4 3 2 1 ... Lift off! -- T minus 10 9 8 7
+
+startswith_test()
+osmo_str_startswith(NULL, NULL) == true
+osmo_str_startswith("", NULL) == true
+osmo_str_startswith(NULL, "") == true
+osmo_str_startswith("", "") == true
+osmo_str_startswith("abc", NULL) == true
+osmo_str_startswith("abc", "") == true
+osmo_str_startswith(NULL, "abc") == false
+osmo_str_startswith("", "abc") == false
+osmo_str_startswith("abc", "a") == true
+osmo_str_startswith("abc", "ab") == true
+osmo_str_startswith("abc", "abc") == true
+osmo_str_startswith("abc", "abcd") == false
+osmo_str_startswith("abc", "xyz") == false