diff options
| -rw-r--r-- | include/osmocom/core/utils.h | 2 | ||||
| -rw-r--r-- | src/utils.c | 14 | ||||
| -rw-r--r-- | src/vty/tdef_vty.c | 12 | ||||
| -rw-r--r-- | tests/utils/utils_test.c | 28 | ||||
| -rw-r--r-- | tests/utils/utils_test.ok | 15 | 
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  | 
