From 7448b513c84feb3fd06fc57b39f5ab450970c01e Mon Sep 17 00:00:00 2001 From: Bartosz Golaszewski Date: Tue, 25 Aug 2015 16:36:43 +0200 Subject: [PATCH] libbb: add is_suffixed_with() function Signed-off-by: Bartosz Golaszewski Signed-off-by: Denys Vlasenko --- include/libbb.h | 1 + libbb/compare_string_array.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/include/libbb.h b/include/libbb.h index 2e20706e7..543214ea4 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -413,6 +413,7 @@ const char *bb_basename(const char *name) FAST_FUNC; char *last_char_is(const char *s, int c) FAST_FUNC; const char* endofname(const char *name) FAST_FUNC; char *is_prefixed_with(const char *string, const char *key) FAST_FUNC; +char *is_suffixed_with(const char *string, const char *key) FAST_FUNC; int ndelay_on(int fd) FAST_FUNC; int ndelay_off(int fd) FAST_FUNC; diff --git a/libbb/compare_string_array.c b/libbb/compare_string_array.c index cdcb2718d..e0d8e421b 100644 --- a/libbb/compare_string_array.c +++ b/libbb/compare_string_array.c @@ -28,6 +28,25 @@ char* FAST_FUNC is_prefixed_with(const char *string, const char *key) #endif } +/* + * Return NULL if string is not suffixed with key. Return pointer to the + * beginning of prefix key in string. If key is an empty string return pointer + * to the end of string. + */ +char* FAST_FUNC is_suffixed_with(const char *string, const char *key) +{ + size_t key_len = strlen(key); + ssize_t len_diff = strlen(string) - key_len; + + if (len_diff >= 0) { + if (strcmp(string + len_diff, key) == 0) { + return (char*)key; + } + } + + return NULL; +} + /* returns the array index of the string */ /* (index of first match is returned, or -1) */ int FAST_FUNC index_in_str_array(const char *const string_array[], const char *key) @@ -133,4 +152,18 @@ BBUNIT_DEFINE_TEST(is_prefixed_with) BBUNIT_ENDTEST; } +BBUNIT_DEFINE_TEST(is_suffixed_with) +{ + BBUNIT_ASSERT_STREQ("bar", is_suffixed_with("foo bar", "bar")); + BBUNIT_ASSERT_STREQ("foo", is_suffixed_with("foo", "foo")); + BBUNIT_ASSERT_STREQ("", is_suffixed_with("foo", "")); + BBUNIT_ASSERT_STREQ("", is_suffixed_with("", "")); + + BBUNIT_ASSERT_NULL(is_suffixed_with("foo", "bar foo")); + BBUNIT_ASSERT_NULL(is_suffixed_with("foo foo", "bar")); + BBUNIT_ASSERT_NULL(is_suffixed_with("", "foo")); + + BBUNIT_ENDTEST; +} + #endif /* ENABLE_UNIT_TEST */