use super::{ Pullable, PullBuffer, PushBuffer, TranscoderKind, TranscoderImpl, Transcoder };
pub struct EncodeString;
impl TranscoderKind for EncodeString {
type Input = char;
type Output = u8;
}
pub type StringEncoder<E, I> = Transcoder<EncodeString, E, I>;
pub struct DecodeString;
impl TranscoderKind for DecodeString {
type Input = u8;
type Output = char;
}
pub type StringDecoder<E, I> = Transcoder<DecodeString, E, I>;
pub mod adobe {
include!(concat!(env!("OUT_DIR"), "/adobe.rs"));
}
pub mod dos {
include!(concat!(env!("OUT_DIR"), "/dos.rs"));
}
pub mod ebcdic {
include!(concat!(env!("OUT_DIR"), "/ebcdic.rs"));
}
pub mod iso8859 {
include!(concat!(env!("OUT_DIR"), "/iso8859.rs"));
}
pub mod macos {
include!(concat!(env!("OUT_DIR"), "/macos.rs"));
}
pub mod misc {
include!(concat!(env!("OUT_DIR"), "/misc.rs"));
}
pub mod next {
include!(concat!(env!("OUT_DIR"), "/next.rs"));
}
pub mod windows {
include!(concat!(env!("OUT_DIR"), "/windows.rs"));
}
pub mod unicode {
use crate::{ Pullable, PullBuffer, PushBuffer, TranscoderImpl };
use super::{ EncodeString, DecodeString };
#[derive(Clone, Copy)]
pub struct Utf16LE;
impl<I> TranscoderImpl<EncodeString, I> for Utf16LE where I: Pullable<Item = char> {
fn transcode(&self, input: &mut PullBuffer<I>, output: &mut PushBuffer<'_, u8>) {
while output.fits(2) {
match *input.view(1) {
[x @ '\u{0000}'..='\u{FFFF}'] => {
let x = x as u32;
output.push([
(x & 0xFF) as u8,
(x >> 8) as u8,
]);
input.advance(1);
},
[x] if output.fits(4) => {
let x = x as u32 - 0x10000;
output.push([
((x >> 10) & 0xFF) as u8,
((x >> 18) & 3) as u8 | 0xD8,
(x & 0xFF) as u8,
((x >> 8) & 3) as u8 | 0xDC,
]);
input.advance(1);
},
[..] => break,
}
}
}
}
impl<I> TranscoderImpl<DecodeString, I> for Utf16LE where I: Pullable<Item = u8> {
fn transcode(&self, input: &mut PullBuffer<I>, output: &mut PushBuffer<'_, char>) {
while output.fits(1) {
match *input.view(4) {
[] | [_] => break,
[lo, hi @ 0x00..=0xD7, ..] | [lo, hi @ 0xE0..=0xFF, ..] => {
let lo = lo as u32;
let hi = (hi as u32) << 8;
output.push([ char::from_u32(lo | hi).unwrap() ]);
input.advance(2);
},
[lo1, hi1 @ 0xD8..=0xDB, lo2, hi2 @ 0xDC..=0xDF] => {
let lo1 = (lo1 as u32) << 10;
let hi1 = ((hi1 & 3) as u32) << 18;
let lo2 = lo2 as u32;
let hi2 = ((hi2 & 3) as u32) << 8;
let x = lo1 | hi1 | lo2 | hi2;
output.push([ char::from_u32(x + 0x10000).unwrap() ]);
input.advance(4);
},
[_, _, ..] => input.advance(2),
}
}
}
}
#[derive(Clone, Copy)]
pub struct Utf16BE;
impl<I> TranscoderImpl<EncodeString, I> for Utf16BE where I: Pullable<Item = char> {
fn transcode(&self, input: &mut PullBuffer<I>, output: &mut PushBuffer<'_, u8>) {
while output.fits(2) {
match *input.view(1) {
[x @ '\u{0000}'..='\u{FFFF}'] => {
let x = x as u32;
output.push([
(x >> 8) as u8,
(x & 0xFF) as u8,
]);
input.advance(1);
},
[x] if output.fits(4) => {
let x = x as u32 - 0x10000;
output.push([
((x >> 18) & 3) as u8 | 0xD8,
((x >> 10) & 0xFF) as u8,
((x >> 8) & 3) as u8 | 0xDC,
(x & 0xFF) as u8,
]);
input.advance(1);
},
[..] => break,
}
}
}
}
impl<I> TranscoderImpl<DecodeString, I> for Utf16BE where I: Pullable<Item = u8> {
fn transcode(&self, input: &mut PullBuffer<I>, output: &mut PushBuffer<'_, char>) {
while output.fits(1) {
match *input.view(4) {
[] | [_] => break,
[hi @ 0x00..=0xD7, lo, ..] | [hi @ 0xE0..=0xFF, lo, ..] => {
let lo = lo as u32;
let hi = (hi as u32) << 8;
output.push([ char::from_u32(lo | hi).unwrap() ]);
input.advance(2);
},
[hi1 @ 0xD8..=0xDB, lo1, hi2 @ 0xDC..=0xDF, lo2] => {
let lo1 = (lo1 as u32) << 10;
let hi1 = ((hi1 & 3) as u32) << 18;
let lo2 = lo2 as u32;
let hi2 = ((hi2 & 3) as u32) << 8;
let x = lo1 | hi1 | lo2 | hi2;
output.push([ char::from_u32(x + 0x10000).unwrap() ]);
input.advance(4);
},
[_, _, ..] => input.advance(2),
}
}
}
}
}
#[derive(Clone, Copy)]
pub enum Std {
AdobeStandard,
AdobeSymbol,
AdobeZapfDingbats,
DosCp437,
DosCp737,
DosCp775,
DosCp850,
DosCp852,
DosCp855,
DosCp857,
DosCp860,
DosCp861,
DosCp862,
DosCp863,
DosCp864,
DosCp865,
DosCp866,
DosCp869,
DosCp874,
EbcdicCp037,
EbcdicCp500,
EbcdicCp875,
EbcdicCp1026,
Iso8859_1,
Iso8859_2,
Iso8859_3,
Iso8859_4,
Iso8859_5,
Iso8859_6,
Iso8859_7,
Iso8859_8,
Iso8859_9,
Iso8859_10,
Iso8859_11,
Iso8859_13,
Iso8859_14,
Iso8859_15,
Iso8859_16,
MacArabic,
MacCeltic,
MacCentralEuropean,
MacCroatian,
MacCyrillic,
MacDingbats,
MacFarsi,
MacGaelic,
MacGreek,
MacIceland,
MacInuit,
MacRoman,
MacRomanian,
MacTurkish,
MiscAtariST,
MiscCp424,
MiscCp856,
MiscCp1006,
MiscKoi8R,
MiscKoi8U,
MiscKz1048,
MiscAsciiQuotes,
NextStep,
WindowsCp874,
WindowsCp1250,
WindowsCp1251,
WindowsCp1252,
WindowsCp1253,
WindowsCp1254,
WindowsCp1255,
WindowsCp1256,
WindowsCp1267,
WindowsCp1268,
Utf16LE,
Utf16BE,
}
impl<I> TranscoderImpl<EncodeString, I> for Std where I: Pullable<Item = char> {
fn transcode(&self, input: &mut PullBuffer<I>, output: &mut PushBuffer<'_, u8>) {
match self {
Self::AdobeStandard => adobe::Standard.transcode(input, output),
Self::AdobeSymbol => adobe::Symbol.transcode(input, output),
Self::AdobeZapfDingbats => adobe::ZapfDingbats.transcode(input, output),
Self::DosCp437 => dos::Cp437.transcode(input, output),
Self::DosCp737 => dos::Cp737.transcode(input, output),
Self::DosCp775 => dos::Cp775.transcode(input, output),
Self::DosCp850 => dos::Cp850.transcode(input, output),
Self::DosCp852 => dos::Cp852.transcode(input, output),
Self::DosCp855 => dos::Cp855.transcode(input, output),
Self::DosCp857 => dos::Cp857.transcode(input, output),
Self::DosCp860 => dos::Cp860.transcode(input, output),
Self::DosCp861 => dos::Cp861.transcode(input, output),
Self::DosCp862 => dos::Cp862.transcode(input, output),
Self::DosCp863 => dos::Cp863.transcode(input, output),
Self::DosCp864 => dos::Cp864.transcode(input, output),
Self::DosCp865 => dos::Cp865.transcode(input, output),
Self::DosCp866 => dos::Cp866.transcode(input, output),
Self::DosCp869 => dos::Cp869.transcode(input, output),
Self::DosCp874 => dos::Cp874.transcode(input, output),
Self::EbcdicCp037 => ebcdic::Cp037.transcode(input, output),
Self::EbcdicCp500 => ebcdic::Cp500.transcode(input, output),
Self::EbcdicCp875 => ebcdic::Cp875.transcode(input, output),
Self::EbcdicCp1026 => ebcdic::Cp1026.transcode(input, output),
Self::Iso8859_1 => iso8859::Iso8859_1.transcode(input, output),
Self::Iso8859_2 => iso8859::Iso8859_2.transcode(input, output),
Self::Iso8859_3 => iso8859::Iso8859_3.transcode(input, output),
Self::Iso8859_4 => iso8859::Iso8859_4.transcode(input, output),
Self::Iso8859_5 => iso8859::Iso8859_5.transcode(input, output),
Self::Iso8859_6 => iso8859::Iso8859_6.transcode(input, output),
Self::Iso8859_7 => iso8859::Iso8859_7.transcode(input, output),
Self::Iso8859_8 => iso8859::Iso8859_8.transcode(input, output),
Self::Iso8859_9 => iso8859::Iso8859_9.transcode(input, output),
Self::Iso8859_10 => iso8859::Iso8859_10.transcode(input, output),
Self::Iso8859_11 => iso8859::Iso8859_11.transcode(input, output),
Self::Iso8859_13 => iso8859::Iso8859_13.transcode(input, output),
Self::Iso8859_14 => iso8859::Iso8859_14.transcode(input, output),
Self::Iso8859_15 => iso8859::Iso8859_15.transcode(input, output),
Self::Iso8859_16 => iso8859::Iso8859_16.transcode(input, output),
Self::MacArabic => macos::Arabic.transcode(input, output),
Self::MacCeltic => macos::Celtic.transcode(input, output),
Self::MacCentralEuropean => macos::CentralEuropean.transcode(input, output),
Self::MacCroatian => macos::Croatian.transcode(input, output),
Self::MacCyrillic => macos::Cyrillic.transcode(input, output),
Self::MacDingbats => macos::Dingbats.transcode(input, output),
Self::MacFarsi => macos::Farsi.transcode(input, output),
Self::MacGaelic => macos::Gaelic.transcode(input, output),
Self::MacGreek => macos::Greek.transcode(input, output),
Self::MacIceland => macos::Iceland.transcode(input, output),
Self::MacInuit => macos::Inuit.transcode(input, output),
Self::MacRoman => macos::Roman.transcode(input, output),
Self::MacRomanian => macos::Romanian.transcode(input, output),
Self::MacTurkish => macos::Turkish.transcode(input, output),
Self::MiscAtariST => misc::AtariST.transcode(input, output),
Self::MiscCp424 => misc::Cp424.transcode(input, output),
Self::MiscCp856 => misc::Cp856.transcode(input, output),
Self::MiscCp1006 => misc::Cp1006.transcode(input, output),
Self::MiscKoi8R => misc::Koi8R.transcode(input, output),
Self::MiscKoi8U => misc::Koi8U.transcode(input, output),
Self::MiscKz1048 => misc::Kz1048.transcode(input, output),
Self::MiscAsciiQuotes => misc::AsciiQuotes.transcode(input, output),
Self::NextStep => next::NextStep.transcode(input, output),
Self::WindowsCp874 => windows::Cp874.transcode(input, output),
Self::WindowsCp1250 => windows::Cp1250.transcode(input, output),
Self::WindowsCp1251 => windows::Cp1251.transcode(input, output),
Self::WindowsCp1252 => windows::Cp1252.transcode(input, output),
Self::WindowsCp1253 => windows::Cp1253.transcode(input, output),
Self::WindowsCp1254 => windows::Cp1254.transcode(input, output),
Self::WindowsCp1255 => windows::Cp1255.transcode(input, output),
Self::WindowsCp1256 => windows::Cp1256.transcode(input, output),
Self::WindowsCp1267 => windows::Cp1267.transcode(input, output),
Self::WindowsCp1268 => windows::Cp1268.transcode(input, output),
Self::Utf16LE => unicode::Utf16LE.transcode(input, output),
Self::Utf16BE => unicode::Utf16BE.transcode(input, output),
}
}
}
impl<I> TranscoderImpl<DecodeString, I> for Std where I: Pullable<Item = u8> {
fn transcode(&self, input: &mut PullBuffer<I>, output: &mut PushBuffer<'_, char>) {
match self {
Self::AdobeStandard => adobe::Standard.transcode(input, output),
Self::AdobeSymbol => adobe::Symbol.transcode(input, output),
Self::AdobeZapfDingbats => adobe::ZapfDingbats.transcode(input, output),
Self::DosCp437 => dos::Cp437.transcode(input, output),
Self::DosCp737 => dos::Cp737.transcode(input, output),
Self::DosCp775 => dos::Cp775.transcode(input, output),
Self::DosCp850 => dos::Cp850.transcode(input, output),
Self::DosCp852 => dos::Cp852.transcode(input, output),
Self::DosCp855 => dos::Cp855.transcode(input, output),
Self::DosCp857 => dos::Cp857.transcode(input, output),
Self::DosCp860 => dos::Cp860.transcode(input, output),
Self::DosCp861 => dos::Cp861.transcode(input, output),
Self::DosCp862 => dos::Cp862.transcode(input, output),
Self::DosCp863 => dos::Cp863.transcode(input, output),
Self::DosCp864 => dos::Cp864.transcode(input, output),
Self::DosCp865 => dos::Cp865.transcode(input, output),
Self::DosCp866 => dos::Cp866.transcode(input, output),
Self::DosCp869 => dos::Cp869.transcode(input, output),
Self::DosCp874 => dos::Cp874.transcode(input, output),
Self::EbcdicCp037 => ebcdic::Cp037.transcode(input, output),
Self::EbcdicCp500 => ebcdic::Cp500.transcode(input, output),
Self::EbcdicCp875 => ebcdic::Cp875.transcode(input, output),
Self::EbcdicCp1026 => ebcdic::Cp1026.transcode(input, output),
Self::Iso8859_1 => iso8859::Iso8859_1.transcode(input, output),
Self::Iso8859_2 => iso8859::Iso8859_2.transcode(input, output),
Self::Iso8859_3 => iso8859::Iso8859_3.transcode(input, output),
Self::Iso8859_4 => iso8859::Iso8859_4.transcode(input, output),
Self::Iso8859_5 => iso8859::Iso8859_5.transcode(input, output),
Self::Iso8859_6 => iso8859::Iso8859_6.transcode(input, output),
Self::Iso8859_7 => iso8859::Iso8859_7.transcode(input, output),
Self::Iso8859_8 => iso8859::Iso8859_8.transcode(input, output),
Self::Iso8859_9 => iso8859::Iso8859_9.transcode(input, output),
Self::Iso8859_10 => iso8859::Iso8859_10.transcode(input, output),
Self::Iso8859_11 => iso8859::Iso8859_11.transcode(input, output),
Self::Iso8859_13 => iso8859::Iso8859_13.transcode(input, output),
Self::Iso8859_14 => iso8859::Iso8859_14.transcode(input, output),
Self::Iso8859_15 => iso8859::Iso8859_15.transcode(input, output),
Self::Iso8859_16 => iso8859::Iso8859_16.transcode(input, output),
Self::MacArabic => macos::Arabic.transcode(input, output),
Self::MacCeltic => macos::Celtic.transcode(input, output),
Self::MacCentralEuropean => macos::CentralEuropean.transcode(input, output),
Self::MacCroatian => macos::Croatian.transcode(input, output),
Self::MacCyrillic => macos::Cyrillic.transcode(input, output),
Self::MacDingbats => macos::Dingbats.transcode(input, output),
Self::MacFarsi => macos::Farsi.transcode(input, output),
Self::MacGaelic => macos::Gaelic.transcode(input, output),
Self::MacGreek => macos::Greek.transcode(input, output),
Self::MacIceland => macos::Iceland.transcode(input, output),
Self::MacInuit => macos::Inuit.transcode(input, output),
Self::MacRoman => macos::Roman.transcode(input, output),
Self::MacRomanian => macos::Romanian.transcode(input, output),
Self::MacTurkish => macos::Turkish.transcode(input, output),
Self::MiscAtariST => misc::AtariST.transcode(input, output),
Self::MiscCp424 => misc::Cp424.transcode(input, output),
Self::MiscCp856 => misc::Cp856.transcode(input, output),
Self::MiscCp1006 => misc::Cp1006.transcode(input, output),
Self::MiscKoi8R => misc::Koi8R.transcode(input, output),
Self::MiscKoi8U => misc::Koi8U.transcode(input, output),
Self::MiscKz1048 => misc::Kz1048.transcode(input, output),
Self::MiscAsciiQuotes => misc::AsciiQuotes.transcode(input, output),
Self::NextStep => next::NextStep.transcode(input, output),
Self::WindowsCp874 => windows::Cp874.transcode(input, output),
Self::WindowsCp1250 => windows::Cp1250.transcode(input, output),
Self::WindowsCp1251 => windows::Cp1251.transcode(input, output),
Self::WindowsCp1252 => windows::Cp1252.transcode(input, output),
Self::WindowsCp1253 => windows::Cp1253.transcode(input, output),
Self::WindowsCp1254 => windows::Cp1254.transcode(input, output),
Self::WindowsCp1255 => windows::Cp1255.transcode(input, output),
Self::WindowsCp1256 => windows::Cp1256.transcode(input, output),
Self::WindowsCp1267 => windows::Cp1267.transcode(input, output),
Self::WindowsCp1268 => windows::Cp1268.transcode(input, output),
Self::Utf16LE => unicode::Utf16LE.transcode(input, output),
Self::Utf16BE => unicode::Utf16BE.transcode(input, output),
}
}
}
pub type StdEncoder<I> = StringEncoder<Std, I>;
pub type StdDecoder<I> = StringDecoder<Std, I>;