[libc] Implemented wcsnlen (#145610)
Implemented wcsnlen and tests for the function. --------- Co-authored-by: Sriya Pratipati <sriyap@google.com>
This commit is contained in:
@@ -366,6 +366,7 @@ set(TARGET_LIBC_ENTRYPOINTS
|
||||
# wchar.h entrypoints
|
||||
libc.src.wchar.btowc
|
||||
libc.src.wchar.wcslen
|
||||
libc.src.wchar.wcsnlen
|
||||
libc.src.wchar.wctob
|
||||
libc.src.wchar.wmemmove
|
||||
libc.src.wchar.wmemset
|
||||
|
||||
@@ -17,6 +17,13 @@ functions:
|
||||
return_type: size_t
|
||||
arguments:
|
||||
- type: const wchar_t *
|
||||
- name: wcsnlen
|
||||
standards:
|
||||
- stdc
|
||||
return_type: size_t
|
||||
arguments:
|
||||
- type: const wchar_t *
|
||||
- type: size_t
|
||||
- name: wctob
|
||||
standards:
|
||||
- stdc
|
||||
|
||||
@@ -10,6 +10,17 @@ add_entrypoint_object(
|
||||
libc.src.string.string_utils
|
||||
)
|
||||
|
||||
add_entrypoint_object(
|
||||
wcsnlen
|
||||
SRCS
|
||||
wcsnlen.cpp
|
||||
HDRS
|
||||
wcsnlen.h
|
||||
DEPENDS
|
||||
libc.hdr.types.size_t
|
||||
libc.hdr.types.wchar_t
|
||||
)
|
||||
|
||||
add_entrypoint_object(
|
||||
wctob
|
||||
SRCS
|
||||
|
||||
25
libc/src/wchar/wcsnlen.cpp
Normal file
25
libc/src/wchar/wcsnlen.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
//===-- Implementation of wcsnlen -----------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "src/wchar/wcsnlen.h"
|
||||
|
||||
#include "hdr/types/size_t.h"
|
||||
#include "hdr/types/wchar_t.h"
|
||||
#include "src/__support/common.h"
|
||||
#include "src/__support/macros/config.h"
|
||||
|
||||
namespace LIBC_NAMESPACE_DECL {
|
||||
|
||||
LLVM_LIBC_FUNCTION(size_t, wcsnlen, (const wchar_t *src, size_t maxlen)) {
|
||||
size_t i = 0;
|
||||
for (; i < maxlen && src[i]; ++i)
|
||||
;
|
||||
return i;
|
||||
}
|
||||
|
||||
} // namespace LIBC_NAMESPACE_DECL
|
||||
22
libc/src/wchar/wcsnlen.h
Normal file
22
libc/src/wchar/wcsnlen.h
Normal file
@@ -0,0 +1,22 @@
|
||||
//===-- Implementation header for wcsnlen ---------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_LIBC_SRC_WCHAR_WCSNLEN_H
|
||||
#define LLVM_LIBC_SRC_WCHAR_WCSNLEN_H
|
||||
|
||||
#include "hdr/types/size_t.h"
|
||||
#include "hdr/types/wchar_t.h"
|
||||
#include "src/__support/macros/config.h"
|
||||
|
||||
namespace LIBC_NAMESPACE_DECL {
|
||||
|
||||
size_t wcsnlen(const wchar_t *src, size_t maxlen);
|
||||
|
||||
} // namespace LIBC_NAMESPACE_DECL
|
||||
|
||||
#endif // LLVM_LIBC_SRC_WCHAR_WCSNLEN_H
|
||||
@@ -12,6 +12,18 @@ add_libc_test(
|
||||
libc.src.wchar.wcslen
|
||||
)
|
||||
|
||||
add_libc_test(
|
||||
wcsnlen_test
|
||||
SUITE
|
||||
libc_wchar_unittests
|
||||
SRCS
|
||||
wcsnlen_test.cpp
|
||||
DEPENDS
|
||||
libc.hdr.types.size_t
|
||||
libc.hdr.types.wchar_t
|
||||
libc.src.wchar.wcsnlen
|
||||
)
|
||||
|
||||
add_libc_test(
|
||||
btowc_test
|
||||
SUITE
|
||||
|
||||
54
libc/test/src/wchar/wcsnlen_test.cpp
Normal file
54
libc/test/src/wchar/wcsnlen_test.cpp
Normal file
@@ -0,0 +1,54 @@
|
||||
//===-- Unittests for wcsnlen ---------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "hdr/types/size_t.h"
|
||||
#include "hdr/types/wchar_t.h"
|
||||
#include "src/wchar/wcsnlen.h"
|
||||
#include "test/UnitTest/Test.h"
|
||||
|
||||
TEST(LlvmLibcWCSNLenTest, EmptyString) {
|
||||
ASSERT_EQ(static_cast<size_t>(0), LIBC_NAMESPACE::wcsnlen(L"", 0));
|
||||
// If N is greater than string length, this should still return 0.
|
||||
ASSERT_EQ(static_cast<size_t>(0), LIBC_NAMESPACE::wcsnlen(L"", 1));
|
||||
}
|
||||
|
||||
TEST(LlvmLibcWCSNLenTest, OneCharacterString) {
|
||||
const wchar_t *src = L"A";
|
||||
ASSERT_EQ(static_cast<size_t>(1), LIBC_NAMESPACE::wcsnlen(src, 1));
|
||||
// If N is 0, this should return 0.
|
||||
ASSERT_EQ(static_cast<size_t>(0), LIBC_NAMESPACE::wcsnlen(src, 0));
|
||||
// If N is greater than string length, this should still return 1.
|
||||
ASSERT_EQ(static_cast<size_t>(1), LIBC_NAMESPACE::wcsnlen(src, 3));
|
||||
}
|
||||
|
||||
TEST(LlvmLibcWCSNLenTest, ManyCharacterString) {
|
||||
const wchar_t *src = L"123456789";
|
||||
ASSERT_EQ(static_cast<size_t>(9), LIBC_NAMESPACE::wcsnlen(src, 9));
|
||||
// If N is 0, this should return 0.
|
||||
ASSERT_EQ(static_cast<size_t>(0), LIBC_NAMESPACE::wcsnlen(src, 0));
|
||||
// If N is smaller than the string length, it should return N.
|
||||
ASSERT_EQ(static_cast<size_t>(3), LIBC_NAMESPACE::wcsnlen(src, 3));
|
||||
// If N is greater than string length, this should still return 9.
|
||||
ASSERT_EQ(static_cast<size_t>(9), LIBC_NAMESPACE::wcsnlen(src, 42));
|
||||
}
|
||||
|
||||
TEST(LlvmLibcWCSNLenTest, IgnoreCharactersAfterNullTerminator) {
|
||||
const wchar_t src[5] = {L'a', L'b', L'c', L'\0', L'd'};
|
||||
ASSERT_EQ(static_cast<size_t>(3), LIBC_NAMESPACE::wcsnlen(src, 3));
|
||||
// This should only read up to the null terminator.
|
||||
ASSERT_EQ(static_cast<size_t>(3), LIBC_NAMESPACE::wcsnlen(src, 4));
|
||||
ASSERT_EQ(static_cast<size_t>(3), LIBC_NAMESPACE::wcsnlen(src, 5));
|
||||
}
|
||||
|
||||
TEST(LlvmLibcWCSNLenTest, NoNullTerminator) {
|
||||
const wchar_t src[4] = {L'a', L'b', L'c', L'd'};
|
||||
// Should return 4
|
||||
ASSERT_EQ(static_cast<size_t>(4), LIBC_NAMESPACE::wcsnlen(src, 4));
|
||||
// Should return 2 since N is smaller than string length
|
||||
ASSERT_EQ(static_cast<size_t>(2), LIBC_NAMESPACE::wcsnlen(src, 2));
|
||||
}
|
||||
Reference in New Issue
Block a user