From 5d7e0e834135648f02776a0df663abf92fffceff Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Tue, 24 May 2022 10:21:31 +0200 Subject: [PATCH] boot: Add strchr8/16 --- src/boot/efi/efi-string.c | 17 +++++++++++++++++ src/boot/efi/efi-string.h | 3 +++ src/boot/efi/test-efi-string.c | 22 ++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/src/boot/efi/efi-string.c b/src/boot/efi/efi-string.c index 4df705b30d..540ee0b223 100644 --- a/src/boot/efi/efi-string.c +++ b/src/boot/efi/efi-string.c @@ -121,3 +121,20 @@ int strcasecmp16(const char16_t *s1, const char16_t *s2) { DEFINE_STRCPY(char, strcpy8); DEFINE_STRCPY(char16_t, strcpy16); + +#define DEFINE_STRCHR(type, name) \ + type *name(const type *s, type c) { \ + if (!s) \ + return NULL; \ + \ + while (*s) { \ + if (*s == c) \ + return (type *) s; \ + s++; \ + } \ + \ + return NULL; \ + } + +DEFINE_STRCHR(char, strchr8); +DEFINE_STRCHR(char16_t, strchr16); diff --git a/src/boot/efi/efi-string.h b/src/boot/efi/efi-string.h index d3c1786b47..c4973a0d74 100644 --- a/src/boot/efi/efi-string.h +++ b/src/boot/efi/efi-string.h @@ -60,3 +60,6 @@ static inline bool strcaseeq16(const char16_t *s1, const char16_t *s2) { char *strcpy8(char * restrict dest, const char * restrict src); char16_t *strcpy16(char16_t * restrict dest, const char16_t * restrict src); + +char *strchr8(const char *s, char c); +char16_t *strchr16(const char16_t *s, char16_t c); diff --git a/src/boot/efi/test-efi-string.c b/src/boot/efi/test-efi-string.c index 384d5868ba..2ff8bef3f6 100644 --- a/src/boot/efi/test-efi-string.c +++ b/src/boot/efi/test-efi-string.c @@ -200,4 +200,26 @@ TEST(strcpy16) { assert_se(streq16(buf, u"")); } +TEST(strchr8) { + assert_se(!strchr8(NULL, 'a')); + assert_se(!strchr8("", 'a')); + assert_se(!strchr8("123", 'a')); + + const char str[] = "abcaBc"; + assert_se(strchr8(str, 'a') == &str[0]); + assert_se(strchr8(str, 'c') == &str[2]); + assert_se(strchr8(str, 'B') == &str[4]); +} + +TEST(strchr16) { + assert_se(!strchr16(NULL, 'a')); + assert_se(!strchr16(u"", 'a')); + assert_se(!strchr16(u"123", 'a')); + + const char16_t str[] = u"abcaBc"; + assert_se(strchr16(str, 'a') == &str[0]); + assert_se(strchr16(str, 'c') == &str[2]); + assert_se(strchr16(str, 'B') == &str[4]); +} + DEFINE_TEST_MAIN(LOG_INFO); -- 2.25.1