Skip to content

Commit 11bb216

Browse files
skyrisingawesomekling
authored andcommitted
LibTextCodec: Add replacement decoder
1 parent 7f3b457 commit 11bb216

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

Userland/Libraries/LibTextCodec/Decoder.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ EUCJPDecoder s_euc_jp_decoder;
3434
ISO2022JPDecoder s_iso_2022_jp_decoder;
3535
ShiftJISDecoder s_shift_jis_decoder;
3636
EUCKRDecoder s_euc_kr_decoder;
37+
ReplacementDecoder s_replacement_decoder;
3738

3839
// clang-format off
3940
// https://encoding.spec.whatwg.org/index-ibm866.txt
@@ -353,6 +354,8 @@ Optional<Decoder&> decoder_for(StringView a_encoding)
353354
return s_mac_roman_decoder;
354355
if (encoding.value().equals_ignoring_ascii_case("PDFDocEncoding"sv))
355356
return s_pdf_doc_encoding_decoder;
357+
if (encoding.value().equals_ignoring_ascii_case("replacement"sv))
358+
return s_replacement_decoder;
356359
if (encoding.value().equals_ignoring_ascii_case("shift_jis"sv))
357360
return s_shift_jis_decoder;
358361
if (encoding.value().equals_ignoring_ascii_case("windows-874"sv))
@@ -1777,4 +1780,18 @@ ErrorOr<void> EUCKRDecoder::process(StringView input, Function<ErrorOr<void>(u32
17771780
}
17781781
}
17791782

1783+
// https://encoding.spec.whatwg.org/#replacement-decoder
1784+
ErrorOr<void> ReplacementDecoder::process(StringView input, Function<ErrorOr<void>(u32)> on_code_point)
1785+
{
1786+
// replacement’s decoder has an associated replacement error returned (initially false).
1787+
// replacement’s decoder’s handler, given ioQueue and byte, runs these steps:
1788+
// 1. If byte is end-of-queue, return finished.
1789+
// 2. If replacement error returned is false, set replacement error returned to true and return error.
1790+
// 3. Return finished.
1791+
1792+
if (!input.is_empty())
1793+
return on_code_point(replacement_code_point);
1794+
return {};
1795+
}
1796+
17801797
}

Userland/Libraries/LibTextCodec/Decoder.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,12 @@ class EUCKRDecoder final : public Decoder {
125125
virtual ErrorOr<void> process(StringView, Function<ErrorOr<void>(u32)> on_code_point) override;
126126
};
127127

128+
class ReplacementDecoder final : public Decoder {
129+
public:
130+
virtual ErrorOr<void> process(StringView, Function<ErrorOr<void>(u32)> on_code_point) override;
131+
virtual bool validate(StringView input) override { return input.is_empty(); }
132+
};
133+
128134
Optional<Decoder&> decoder_for(StringView encoding);
129135
Optional<StringView> get_standardized_encoding(StringView encoding);
130136

0 commit comments

Comments
 (0)