libluna: Simplify the API for Utf8StateDecoder by splitting it into multiple methods
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
27d9cd0e87
commit
d45e9e2a8c
@ -127,12 +127,12 @@ namespace TextConsole
|
||||
{
|
||||
auto guard = make_scope_guard([] { utf8_decoder.reset(); });
|
||||
|
||||
const Option<wchar_t> maybe_wchar = TRY(utf8_decoder.feed(c));
|
||||
bool is_ready = TRY(utf8_decoder.feed(c));
|
||||
|
||||
if (is_ready) putwchar(TRY(utf8_decoder.extract()));
|
||||
|
||||
guard.deactivate();
|
||||
|
||||
if (maybe_wchar.has_value()) putwchar(maybe_wchar.value());
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
|
@ -52,13 +52,16 @@ class Utf8StateDecoder
|
||||
public:
|
||||
Utf8StateDecoder();
|
||||
|
||||
Result<Option<wchar_t>> feed(char c);
|
||||
Result<bool> feed(char c);
|
||||
Result<wchar_t> extract();
|
||||
void reset();
|
||||
|
||||
private:
|
||||
char m_state[4];
|
||||
usize m_state_len = 0;
|
||||
usize m_state_index = 0;
|
||||
wchar_t m_decoded_character;
|
||||
bool m_has_character_ready { false };
|
||||
};
|
||||
|
||||
class Utf8Encoder
|
||||
|
@ -217,19 +217,23 @@ Utf8StateDecoder::Utf8StateDecoder() : m_state_len(0), m_state_index(0)
|
||||
{
|
||||
}
|
||||
|
||||
Result<Option<wchar_t>> Utf8StateDecoder::feed(char c)
|
||||
Result<bool> Utf8StateDecoder::feed(char c)
|
||||
{
|
||||
check(!m_has_character_ready);
|
||||
|
||||
if (m_state_len == 0)
|
||||
{
|
||||
m_state_len = TRY(utf8_char_length(c));
|
||||
if (m_state_len == 1)
|
||||
{
|
||||
m_state_len = 0;
|
||||
return Option<wchar_t> { c & 0x7f };
|
||||
m_decoded_character = c & 0x7f;
|
||||
m_has_character_ready = true;
|
||||
return true;
|
||||
}
|
||||
m_state_index = 0;
|
||||
m_state[m_state_index] = c;
|
||||
return { {} };
|
||||
return false;
|
||||
}
|
||||
|
||||
m_state_index++;
|
||||
@ -238,12 +242,20 @@ Result<Option<wchar_t>> Utf8StateDecoder::feed(char c)
|
||||
if (m_state_index == m_state_len - 1)
|
||||
{
|
||||
usize len = m_state_len;
|
||||
const wchar_t wc = TRY(encode_utf8_as_wide_char(m_state, len));
|
||||
m_decoded_character = TRY(encode_utf8_as_wide_char(m_state, len));
|
||||
m_has_character_ready = true;
|
||||
m_state_len = 0;
|
||||
return Option<wchar_t> { wc };
|
||||
return true;
|
||||
}
|
||||
|
||||
return { {} };
|
||||
return false;
|
||||
}
|
||||
|
||||
Result<wchar_t> Utf8StateDecoder::extract()
|
||||
{
|
||||
check(m_has_character_ready);
|
||||
m_has_character_ready = false;
|
||||
return m_decoded_character;
|
||||
}
|
||||
|
||||
void Utf8StateDecoder::reset()
|
||||
|
Loading…
Reference in New Issue
Block a user