]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[libc] Add wcsnlen()
authorMichael Brown <mcb30@ipxe.org>
Thu, 28 Aug 2025 14:12:41 +0000 (15:12 +0100)
committerMichael Brown <mcb30@ipxe.org>
Thu, 28 Aug 2025 14:12:41 +0000 (15:12 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/wchar.c
src/include/wchar.h
src/tests/string_test.c

index 8603228205e5b3f34225cab5d147fa4d9b168b49..b06cf452a0cdda0d849945e8f15e1047bc0650e9 100644 (file)
@@ -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] ) ) );
+}
index d054b8d5b3c88a94c6624eb53c7c2d07801a242a..a7e9de4f21bd69598b44f79d979a1b5f8b9b00c5 100644 (file)
@@ -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 */
index c0436c3ad93ef032f4dfaa261c7aba834ed7f2a8..6662848d396a5fbbb65456c0bbf6c6a799e4419a 100644 (file)
@@ -38,6 +38,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 #include <stdio.h>
 #include <string.h>
 #include <strings.h>
+#include <wchar.h>
 #include <ipxe/string.h>
 #include <ipxe/test.h>
 
@@ -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 */