From 5bec2604a3565f6db31419a4630e0317384ebe61 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 28 Aug 2025 15:12:41 +0100 Subject: [PATCH] [libc] Add wcsnlen() Signed-off-by: Michael Brown --- src/core/wchar.c | 19 ++++++++++++++++--- src/include/wchar.h | 1 + src/tests/string_test.c | 18 ++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/core/wchar.c b/src/core/wchar.c index 860322820..b06cf452a 100644 --- a/src/core/wchar.c +++ b/src/core/wchar.c @@ -36,12 +36,25 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); * Calculate length of wide-character string * * @v string String - * @ret len Length (excluding terminating NUL) + * @v max Maximum length (in wide characters) + * @ret len Length (in wide characters, excluding terminating NUL) */ -size_t wcslen ( const wchar_t *string ) { +size_t wcsnlen ( const wchar_t *string, size_t max ) { size_t len = 0; - while ( *(string++) ) + while ( max-- && *(string++) ) len++; return len; } + +/** + * Calculate length of wide-character string + * + * @v string String + * @ret len Length (in wide characters, excluding terminating NUL) + */ +size_t wcslen ( const wchar_t *string ) { + + return wcsnlen ( string, ( ( ~( ( size_t ) 0 ) ) / + sizeof ( string[0] ) ) ); +} diff --git a/src/include/wchar.h b/src/include/wchar.h index d054b8d5b..a7e9de4f2 100644 --- a/src/include/wchar.h +++ b/src/include/wchar.h @@ -24,6 +24,7 @@ size_t wcrtomb ( char *buf, wchar_t wc, mbstate_t *ps __unused ) { return 1; } +extern size_t wcsnlen ( const wchar_t *string, size_t max ); extern size_t wcslen ( const wchar_t *string ); #endif /* WCHAR_H */ diff --git a/src/tests/string_test.c b/src/tests/string_test.c index c0436c3ad..6662848d3 100644 --- a/src/tests/string_test.c +++ b/src/tests/string_test.c @@ -38,6 +38,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include +#include #include #include @@ -322,6 +323,23 @@ static void string_test_exec ( void ) { + 17 ) * 26 + 10 ) ); ok ( endp == &string[6] ); } + + /* Test wcslen() */ + ok ( wcslen ( L"" ) == 0 ); + ok ( wcslen ( L"Helloo" ) == 6 ); + ok ( wcslen ( L"Helloo woorld!" ) == 14 ); + ok ( wcslen ( L"Helloo\0woorld!" ) == 6 ); + + /* Test wcsnlen() */ + ok ( wcsnlen ( L"", 0 ) == 0 ); + ok ( wcsnlen ( L"", 10 ) == 0 ); + ok ( wcsnlen ( L"Helloo", 0 ) == 0 ); + ok ( wcsnlen ( L"Helloo", 3 ) == 3 ); + ok ( wcsnlen ( L"Helloo", 5 ) == 5 ); + ok ( wcsnlen ( L"Helloo", 16 ) == 6 ); + ok ( wcsnlen ( L"Helloo woorld!", 5 ) == 5 ); + ok ( wcsnlen ( L"Helloo woorld!", 11 ) == 11 ); + ok ( wcsnlen ( L"Helloo woorld!", 16 ) == 14 ); } /** String self-test */