[libc] Changed CharacterConverter returns (#146130)

changed internal CharacterConverter returns to return errno macro when
necessary for consistency.

---------

Co-authored-by: Sriya Pratipati <sriyap@google.com>
This commit is contained in:
sribee8
2025-06-27 14:50:09 -07:00
committed by GitHub
parent 171aa34e43
commit f58caed1bc
5 changed files with 14 additions and 14 deletions

View File

@@ -13,6 +13,7 @@ add_object_library(
SRCS SRCS
character_converter.cpp character_converter.cpp
DEPENDS DEPENDS
libc.hdr.errno_macros
libc.hdr.types.char8_t libc.hdr.types.char8_t
libc.hdr.types.char32_t libc.hdr.types.char32_t
libc.src.__support.error_or libc.src.__support.error_or

View File

@@ -6,6 +6,7 @@
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#include "hdr/errno_macros.h"
#include "hdr/types/char32_t.h" #include "hdr/types/char32_t.h"
#include "hdr/types/char8_t.h" #include "hdr/types/char8_t.h"
#include "src/__support/CPP/bit.h" #include "src/__support/CPP/bit.h"
@@ -76,7 +77,7 @@ int CharacterConverter::push(char8_t utf8_byte) {
else { else {
// bytes_stored and total_bytes will always be 0 here // bytes_stored and total_bytes will always be 0 here
state->partial = static_cast<char32_t>(0); state->partial = static_cast<char32_t>(0);
return -1; return EILSEQ;
} }
state->partial = static_cast<char32_t>(utf8_byte); state->partial = static_cast<char32_t>(utf8_byte);
state->bytes_stored++; state->bytes_stored++;
@@ -93,7 +94,7 @@ int CharacterConverter::push(char8_t utf8_byte) {
} }
// Invalid byte -> reset the state // Invalid byte -> reset the state
clear(); clear();
return -1; return EILSEQ;
} }
int CharacterConverter::push(char32_t utf32) { int CharacterConverter::push(char32_t utf32) {
@@ -115,7 +116,7 @@ int CharacterConverter::push(char32_t utf32) {
// `utf32` contains a value that is too large to actually represent a valid // `utf32` contains a value that is too large to actually represent a valid
// unicode character // unicode character
clear(); clear();
return -1; return EILSEQ;
} }
ErrorOr<char32_t> CharacterConverter::pop_utf32() { ErrorOr<char32_t> CharacterConverter::pop_utf32() {

View File

@@ -32,8 +32,8 @@ ErrorOr<size_t> mbrtowc(wchar_t *__restrict pwc, const char *__restrict s,
for (; i < n && !char_conv.isFull(); ++i) { for (; i < n && !char_conv.isFull(); ++i) {
int err = char_conv.push(static_cast<char8_t>(s[i])); int err = char_conv.push(static_cast<char8_t>(s[i]));
// Encoding error // Encoding error
if (err == -1) if (err == EILSEQ)
return Error(EILSEQ); return Error(err);
} }
auto wc = char_conv.pop_utf32(); auto wc = char_conv.pop_utf32();
if (wc.has_value()) { if (wc.has_value()) {

View File

@@ -30,12 +30,9 @@ ErrorOr<size_t> wcrtomb(char *__restrict s, wchar_t wc,
if (!cr.isValidState()) if (!cr.isValidState())
return Error(EINVAL); return Error(EINVAL);
if (s == nullptr)
return Error(EILSEQ);
int status = cr.push(static_cast<char32_t>(wc)); int status = cr.push(static_cast<char32_t>(wc));
if (status != 0) if (status != 0)
return Error(EILSEQ); return Error(status);
size_t count = 0; size_t count = 0;
while (!cr.isEmpty()) { while (!cr.isEmpty()) {

View File

@@ -6,6 +6,7 @@
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#include "hdr/errno_macros.h"
#include "src/__support/error_or.h" #include "src/__support/error_or.h"
#include "src/__support/wchar/character_converter.h" #include "src/__support/wchar/character_converter.h"
#include "src/__support/wchar/mbstate.h" #include "src/__support/wchar/mbstate.h"
@@ -87,7 +88,7 @@ TEST(LlvmLibcCharacterConverterUTF8To32Test, InvalidByte) {
LIBC_NAMESPACE::internal::CharacterConverter char_conv(&state); LIBC_NAMESPACE::internal::CharacterConverter char_conv(&state);
int err = char_conv.push(static_cast<char8_t>(ch)); int err = char_conv.push(static_cast<char8_t>(ch));
ASSERT_EQ(err, -1); ASSERT_EQ(err, EILSEQ);
} }
TEST(LlvmLibcCharacterConverterUTF8To32Test, InvalidMultiByte) { TEST(LlvmLibcCharacterConverterUTF8To32Test, InvalidMultiByte) {
@@ -100,12 +101,12 @@ TEST(LlvmLibcCharacterConverterUTF8To32Test, InvalidMultiByte) {
LIBC_NAMESPACE::internal::CharacterConverter char_conv(&state); LIBC_NAMESPACE::internal::CharacterConverter char_conv(&state);
int err = char_conv.push(static_cast<char8_t>(ch[0])); int err = char_conv.push(static_cast<char8_t>(ch[0]));
ASSERT_EQ(err, -1); ASSERT_EQ(err, EILSEQ);
err = char_conv.push(static_cast<char8_t>(ch[1])); err = char_conv.push(static_cast<char8_t>(ch[1]));
ASSERT_EQ(err, 0); ASSERT_EQ(err, 0);
// Prev byte was single byte so trying to push another should error. // Prev byte was single byte so trying to push another should error.
err = char_conv.push(static_cast<char8_t>(ch[2])); err = char_conv.push(static_cast<char8_t>(ch[2]));
ASSERT_EQ(err, -1); ASSERT_EQ(err, EILSEQ);
err = char_conv.push(static_cast<char8_t>(ch[3])); err = char_conv.push(static_cast<char8_t>(ch[3]));
ASSERT_EQ(err, 0); ASSERT_EQ(err, 0);
} }
@@ -127,7 +128,7 @@ TEST(LlvmLibcCharacterConverterUTF8To32Test, InvalidLastByte) {
err = char_conv.push(static_cast<char8_t>(ch[2])); err = char_conv.push(static_cast<char8_t>(ch[2]));
ASSERT_EQ(err, 0); ASSERT_EQ(err, 0);
err = char_conv.push(static_cast<char8_t>(ch[3])); err = char_conv.push(static_cast<char8_t>(ch[3]));
ASSERT_EQ(err, -1); ASSERT_EQ(err, EILSEQ);
} }
TEST(LlvmLibcCharacterConverterUTF8To32Test, ValidTwoByteWithExtraRead) { TEST(LlvmLibcCharacterConverterUTF8To32Test, ValidTwoByteWithExtraRead) {
@@ -144,7 +145,7 @@ TEST(LlvmLibcCharacterConverterUTF8To32Test, ValidTwoByteWithExtraRead) {
ASSERT_EQ(err, 0); ASSERT_EQ(err, 0);
// Should produce an error on 3rd byte // Should produce an error on 3rd byte
err = char_conv.push(static_cast<char8_t>(ch[2])); err = char_conv.push(static_cast<char8_t>(ch[2]));
ASSERT_EQ(err, -1); ASSERT_EQ(err, EILSEQ);
// Should produce an error since mbstate was reset // Should produce an error since mbstate was reset
auto wch = char_conv.pop_utf32(); auto wch = char_conv.pop_utf32();