diff --git a/README.md b/README.md index 3aa8737a..f0586d19 100644 --- a/README.md +++ b/README.md @@ -4343,7 +4343,13 @@ Put the string in the file. ##### bool string\_start\_with\_str\_p(const string\_t v, const char str[]) ##### bool string\_start\_with\_string\_p(const string_t v, const string_t str) -Return true if the string start with the same characters than 'str', +Return true if the string starts with the same characters than 'str', +false otherwise. + +##### bool string\_end\_with\_str\_p(const string\_t v, const char str[]) +##### bool string\_end\_with\_string\_p(const string_t v, const string_t str) + +Return true if the string ends with the same characters than 'str', false otherwise. ##### size\_t string\_hash(const string\_t v) diff --git a/m-string.h b/m-string.h index d690dc62..d2b70b67 100644 --- a/m-string.h +++ b/m-string.h @@ -855,11 +855,34 @@ string_start_with_string_p(const string_t v, const string_t v2) return string_start_with_str_p (v, string_get_cstr(v2)); } +static inline bool +string_end_with_str_p(const string_t v, const char str[]) +{ + STRINGI_CONTRACT (v); + M_ASSUME (str != NULL); + const char *v_str = string_get_cstr(v); + const size_t v_l = string_size(v); + const size_t str_l = strlen(str); + if (v_l < str_l) + return false; + for(size_t i = 0; i < str_l; i++) { + if (str[i] != v_str[v_l - str_l + i]) + return false; + } + return true; +} + +static inline bool +string_end_with_string_p(const string_t v, const string_t v2) +{ + STRINGI_CONTRACT (v2); + return string_end_with_str_p (v, string_get_cstr(v2)); +} + static inline size_t string_hash(const string_t v) { STRINGI_CONTRACT (v); - // TODO: alignemnt incorrect if stack based & string_t is 32-bits aligned ?... return m_core_hash(string_get_cstr(v), string_size(v)); } diff --git a/tests/test-mstring.c b/tests/test-mstring.c index 1b451c2d..9339af1f 100644 --- a/tests/test-mstring.c +++ b/tests/test-mstring.c @@ -274,8 +274,13 @@ static void test0(void) string_set_str(s1, "Hello, world!"); assert(string_start_with_str_p(s1, "Hello") == true); assert(string_start_with_str_p(s1, "Help") == false); + assert(string_end_with_str_p(s1, "world!") == true); + assert(string_end_with_str_p(s1, "worldX") == false); + assert(string_end_with_str_p(s1, "Hello, world!!") == false); string_set_str(s2, "H"); assert(string_start_with_string_p(s1, s2) == true); + string_set_str(s2, "!"); + assert(string_end_with_string_p(s1, s2) == true); string_cat_printf(s1, " %d little %s.", 10, "suns"); string_set_str(s2, "Hello, world! 10 little suns.");