From: Michael Brown Date: Fri, 10 Jul 2026 10:50:35 +0000 (+0100) Subject: [libc] Add strchrnul() X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fbc33effcf1cf05050801741bbb0806a2889de55;p=thirdparty%2Fipxe.git [libc] Add strchrnul() Signed-off-by: Michael Brown --- diff --git a/src/core/string.c b/src/core/string.c index 2af19b7fe..68f01105e 100644 --- a/src/core/string.c +++ b/src/core/string.c @@ -263,23 +263,37 @@ size_t strnlen ( const char *src, size_t max ) { } /** - * Find character within a string + * Find character within a string, or NUL terminator * * @v src String * @v character Character to find - * @ret found Found character, or NULL if not found + * @ret found Found character, or terminating NUL if not found */ -char * strchr ( const char *src, int character ) { +char * strchrnul ( const char *src, int character ) { const uint8_t *src_bytes = ( ( const uint8_t * ) src ); for ( ; ; src_bytes++ ) { - if ( *src_bytes == character ) + if ( ( *src_bytes == character ) || ( ! *src_bytes ) ) return ( ( char * ) src_bytes ); - if ( ! *src_bytes ) - return NULL; } } +/** + * Find character within a string + * + * @v src String + * @v character Character to find + * @ret found Found character, or NULL if not found + */ +char * strchr ( const char *src, int character ) { + char *found; + + found = strchrnul ( src, character ); + if ( character != *( ( uint8_t * ) found ) ) + return NULL; + return found; +} + /** * Find rightmost character within a string * diff --git a/src/include/string.h b/src/include/string.h index 3affe8e86..6b43d8f4e 100644 --- a/src/include/string.h +++ b/src/include/string.h @@ -40,6 +40,7 @@ extern int __pure strncmp ( const char *first, const char *second, size_t max ) __nonnull; extern size_t __pure strlen ( const char *src ) __nonnull; extern size_t __pure strnlen ( const char *src, size_t max ) __nonnull; +extern char * __pure strchrnul ( const char *src, int character ) __nonnull; extern char * __pure strchr ( const char *src, int character ) __nonnull; extern char * __pure strrchr ( const char *src, int character ) __nonnull; extern char * __pure strstr ( const char *haystack, diff --git a/src/tests/string_test.c b/src/tests/string_test.c index 6662848d3..6b659926e 100644 --- a/src/tests/string_test.c +++ b/src/tests/string_test.c @@ -70,6 +70,7 @@ static void string_test_exec ( void ) { ok ( *(strchr ( "Testing", 'e' )) == 'e' ); ok ( *(strchr ( "Testing", 'g' )) == 'g' ); ok ( strchr ( "Testing", 'x' ) == NULL ); + ok ( *(strchr ( "Testing", '\0' )) == '\0' ); /* Test strrchr() */ ok ( strrchr ( "", 'a' ) == NULL ); @@ -77,6 +78,13 @@ static void string_test_exec ( void ) { ok ( *(strrchr ( "Haystack", 'k' )) == 'k' ); ok ( strrchr ( "Haystack", 'x' ) == NULL ); + /* Test strchrnul() */ + ok ( *(strchrnul ( "", 'x' )) == '\0' ); + ok ( *(strchrnul ( "Nonstandard", 's' )) == 's' ); + ok ( *(strchrnul ( "Nonstandard", 't' )) == 't' ); + ok ( *(strchrnul ( "Nonstandard", 'x' )) == '\0' ); + ok ( *(strchrnul ( "Nonstandard", '\0' )) == '\0' ); + /* Test memchr() */ ok ( memchr ( "", '\0', 0 ) == NULL ); ok ( *((uint8_t *)memchr ( "post\0null", 'l', 9 )) == 'l' );