mod error;
mod reader;
#[cfg(feature = "decode1")]
pub mod table1;
#[cfg(feature = "decode2")]
pub mod table2;
#[cfg(feature = "decode3")]
pub mod table3;
#[cfg(feature = "decode4")]
pub mod table4;
#[cfg(feature = "decode5")]
pub mod table5;
pub use error::*;
use reader::*;
pub fn decode(src: &[u8], dst: &mut Vec<u8>, speed: u8) -> Result<(), DecoderError> {
let mut reader = DecodeReader::new(speed);
for byte in src.iter() {
reader.write(*byte)?;
reader.decode(dst)?;
}
reader.flush()?;
reader.decode(dst)?;
Ok(())
}
#[cfg(test)]
mod test {
use super::*;
fn supported_characters() -> Vec<(&'static [u8], Vec<u8>)> {
vec![
(&[0], vec![255, 199]),
(&[1], vec![255, 255, 177]),
(&[2], vec![255, 255, 254, 47]),
(&[3], vec![255, 255, 254, 63]),
(&[4], vec![255, 255, 254, 79]),
(&[5], vec![255, 255, 254, 95]),
(&[6], vec![255, 255, 254, 111]),
(&[7], vec![255, 255, 254, 127]),
(&[8], vec![255, 255, 254, 143]),
(&[9], vec![255, 255, 234]),
(&[10], vec![255, 255, 255, 243]),
(&[11], vec![255, 255, 254, 159]),
(&[12], vec![255, 255, 254, 175]),
(&[13], vec![255, 255, 255, 247]),
(&[14], vec![255, 255, 254, 191]),
(&[15], vec![255, 255, 254, 207]),
(&[16], vec![255, 255, 254, 223]),
(&[17], vec![255, 255, 254, 239]),
(&[18], vec![255, 255, 254, 255]),
(&[19], vec![255, 255, 255, 15]),
(&[20], vec![255, 255, 255, 31]),
(&[21], vec![255, 255, 255, 47]),
(&[22], vec![255, 255, 255, 251]),
(&[23], vec![255, 255, 255, 63]),
(&[24], vec![255, 255, 255, 79]),
(&[25], vec![255, 255, 255, 95]),
(&[26], vec![255, 255, 255, 111]),
(&[27], vec![255, 255, 255, 127]),
(&[28], vec![255, 255, 255, 143]),
(&[29], vec![255, 255, 255, 159]),
(&[30], vec![255, 255, 255, 175]),
(&[31], vec![255, 255, 255, 191]),
(b" ", vec![83]),
(b"!", vec![254, 63]),
(b"\"", vec![254, 127]),
(b"#", vec![255, 175]),
(b"$", vec![255, 207]),
(b"%", vec![87]),
(b"&", vec![248]),
(b"'", vec![255, 95]),
(b"(", vec![254, 191]),
(b")", vec![254, 255]),
(b"*", vec![249]),
(b"+", vec![255, 127]),
(b",", vec![250]),
(b"-", vec![91]),
(b".", vec![95]),
(b"/", vec![99]),
(b"0", vec![7]),
(b"1", vec![15]),
(b"2", vec![23]),
(b"3", vec![103]),
(b"4", vec![107]),
(b"5", vec![111]),
(b"6", vec![115]),
(b"7", vec![119]),
(b"8", vec![123]),
(b"9", vec![127]),
(b":", vec![185]),
(b";", vec![251]),
(b"<", vec![255, 249]),
(b"=", vec![131]),
(b">", vec![255, 191]),
(b"?", vec![255, 63]),
(b"@", vec![255, 215]),
(b"A", vec![135]),
(b"B", vec![187]),
(b"C", vec![189]),
(b"D", vec![191]),
(b"E", vec![193]),
(b"F", vec![195]),
(b"G", vec![197]),
(b"H", vec![199]),
(b"I", vec![201]),
(b"J", vec![203]),
(b"K", vec![205]),
(b"L", vec![207]),
(b"M", vec![209]),
(b"N", vec![211]),
(b"O", vec![213]),
(b"P", vec![215]),
(b"Q", vec![217]),
(b"R", vec![219]),
(b"S", vec![221]),
(b"T", vec![223]),
(b"U", vec![225]),
(b"V", vec![227]),
(b"W", vec![229]),
(b"X", vec![252]),
(b"Y", vec![231]),
(b"Z", vec![253]),
(b"[", vec![255, 223]),
(b"\\", vec![255, 254, 31]),
(b"]", vec![255, 231]),
(b"^", vec![255, 243]),
(b"_", vec![139]),
(b"`", vec![255, 251]),
(b"a", vec![31]),
(b"b", vec![143]),
(b"c", vec![39]),
(b"d", vec![147]),
(b"e", vec![47]),
(b"f", vec![151]),
(b"g", vec![155]),
(b"h", vec![159]),
(b"i", vec![55]),
(b"j", vec![233]),
(b"k", vec![235]),
(b"l", vec![163]),
(b"m", vec![167]),
(b"n", vec![171]),
(b"o", vec![63]),
(b"p", vec![175]),
(b"q", vec![237]),
(b"r", vec![179]),
(b"s", vec![71]),
(b"t", vec![79]),
(b"u", vec![183]),
(b"v", vec![239]),
(b"w", vec![241]),
(b"x", vec![243]),
(b"y", vec![245]),
(b"z", vec![247]),
(b"{", vec![255, 253]),
(b"|", vec![255, 159]),
(b"}", vec![255, 247]),
(b"~", vec![255, 239]),
(&[127], vec![255, 255, 255, 207]),
(&[128], vec![255, 254, 111]),
(&[129], vec![255, 255, 75]),
(&[130], vec![255, 254, 127]),
(&[131], vec![255, 254, 143]),
(&[132], vec![255, 255, 79]),
(&[133], vec![255, 255, 83]),
(&[134], vec![255, 255, 87]),
(&[135], vec![255, 255, 179]),
(&[136], vec![255, 255, 91]),
(&[137], vec![255, 255, 181]),
(&[138], vec![255, 255, 183]),
(&[139], vec![255, 255, 185]),
(&[140], vec![255, 255, 187]),
(&[141], vec![255, 255, 189]),
(&[142], vec![255, 255, 235]),
(&[143], vec![255, 255, 191]),
(&[144], vec![255, 255, 236]),
(&[145], vec![255, 255, 237]),
(&[146], vec![255, 255, 95]),
(&[147], vec![255, 255, 193]),
(&[148], vec![255, 255, 238]),
(&[149], vec![255, 255, 195]),
(&[150], vec![255, 255, 197]),
(&[151], vec![255, 255, 199]),
(&[152], vec![255, 255, 201]),
(&[153], vec![255, 254, 231]),
(&[154], vec![255, 255, 99]),
(&[155], vec![255, 255, 203]),
(&[156], vec![255, 255, 103]),
(&[157], vec![255, 255, 205]),
(&[158], vec![255, 255, 207]),
(&[159], vec![255, 255, 239]),
(&[160], vec![255, 255, 107]),
(&[161], vec![255, 254, 239]),
(&[162], vec![255, 254, 159]),
(&[163], vec![255, 255, 111]),
(&[164], vec![255, 255, 115]),
(&[165], vec![255, 255, 209]),
(&[166], vec![255, 255, 211]),
(&[167], vec![255, 254, 247]),
(&[168], vec![255, 255, 213]),
(&[169], vec![255, 255, 119]),
(&[170], vec![255, 255, 123]),
(&[171], vec![255, 255, 240]),
(&[172], vec![255, 254, 255]),
(&[173], vec![255, 255, 127]),
(&[174], vec![255, 255, 215]),
(&[175], vec![255, 255, 217]),
(&[176], vec![255, 255, 7]),
(&[177], vec![255, 255, 15]),
(&[178], vec![255, 255, 131]),
(&[179], vec![255, 255, 23]),
(&[180], vec![255, 255, 219]),
(&[181], vec![255, 255, 135]),
(&[182], vec![255, 255, 221]),
(&[183], vec![255, 255, 223]),
(&[184], vec![255, 254, 175]),
(&[185], vec![255, 255, 139]),
(&[186], vec![255, 255, 143]),
(&[187], vec![255, 255, 147]),
(&[188], vec![255, 255, 225]),
(&[189], vec![255, 255, 151]),
(&[190], vec![255, 255, 155]),
(&[191], vec![255, 255, 227]),
(&[192], vec![255, 255, 248, 63]),
(&[193], vec![255, 255, 248, 127]),
(&[194], vec![255, 254, 191]),
(&[195], vec![255, 254, 63]),
(&[196], vec![255, 255, 159]),
(&[197], vec![255, 255, 229]),
(&[198], vec![255, 255, 163]),
(&[199], vec![255, 255, 246, 127]),
(&[200], vec![255, 255, 248, 191]),
(&[201], vec![255, 255, 248, 255]),
(&[202], vec![255, 255, 249, 63]),
(&[203], vec![255, 255, 251, 223]),
(&[204], vec![255, 255, 251, 255]),
(&[205], vec![255, 255, 249, 127]),
(&[206], vec![255, 255, 241]),
(&[207], vec![255, 255, 246, 255]),
(&[208], vec![255, 254, 95]),
(&[209], vec![255, 255, 31]),
(&[210], vec![255, 255, 249, 191]),
(&[211], vec![255, 255, 252, 31]),
(&[212], vec![255, 255, 252, 63]),
(&[213], vec![255, 255, 249, 255]),
(&[214], vec![255, 255, 252, 95]),
(&[215], vec![255, 255, 242]),
(&[216], vec![255, 255, 39]),
(&[217], vec![255, 255, 47]),
(&[218], vec![255, 255, 250, 63]),
(&[219], vec![255, 255, 250, 127]),
(&[220], vec![255, 255, 255, 223]),
(&[221], vec![255, 255, 252, 127]),
(&[222], vec![255, 255, 252, 159]),
(&[223], vec![255, 255, 252, 191]),
(&[224], vec![255, 254, 207]),
(&[225], vec![255, 255, 243]),
(&[226], vec![255, 254, 223]),
(&[227], vec![255, 255, 55]),
(&[228], vec![255, 255, 167]),
(&[229], vec![255, 255, 63]),
(&[230], vec![255, 255, 71]),
(&[231], vec![255, 255, 231]),
(&[232], vec![255, 255, 171]),
(&[233], vec![255, 255, 175]),
(&[234], vec![255, 255, 247, 127]),
(&[235], vec![255, 255, 247, 255]),
(&[236], vec![255, 255, 244]),
(&[237], vec![255, 255, 245]),
(&[238], vec![255, 255, 250, 191]),
(&[239], vec![255, 255, 233]),
(&[240], vec![255, 255, 250, 255]),
(&[241], vec![255, 255, 252, 223]),
(&[242], vec![255, 255, 251, 63]),
(&[243], vec![255, 255, 251, 127]),
(&[244], vec![255, 255, 252, 255]),
(&[245], vec![255, 255, 253, 31]),
(&[246], vec![255, 255, 253, 63]),
(&[247], vec![255, 255, 253, 95]),
(&[248], vec![255, 255, 253, 127]),
(&[249], vec![255, 255, 255, 239]),
(&[250], vec![255, 255, 253, 159]),
(&[251], vec![255, 255, 253, 191]),
(&[252], vec![255, 255, 253, 223]),
(&[253], vec![255, 255, 253, 255]),
(&[254], vec![255, 255, 254, 31]),
(&[255], vec![255, 255, 251, 191]),
]
}
fn sample_literals() -> Vec<(Vec<u8>, Vec<u8>)> {
vec![(
vec![3, 4, 1, 2],
vec![255, 255, 254, 63, 255, 255, 228, 255, 255, 177, 255, 255, 252, 95],
), (
b":method".to_vec(),
vec![185, 73, 83, 57, 228],
), (
b":scheme".to_vec(),
vec![184, 130, 78, 90, 75],
), (
b":authority".to_vec(),
vec![184, 59, 83, 57, 236, 50, 125, 127],
), (
b"nibbstack.com".to_vec(),
vec![168, 209, 198, 132, 140, 157, 87, 33, 233],
), (
b"GET".to_vec(),
vec![197, 131, 127],
), (
b"http".to_vec(),
vec![157, 41, 175],
), (
b":path".to_vec(),
vec![185, 88, 211, 63],
), (
b"/images/top/sp2/cmn/logo-ns-130528.png".to_vec(),
vec![96, 212, 142, 98, 161, 132, 158, 182, 17, 88, 152, 37, 53, 49, 65, 230, 58, 213, 33, 96, 178, 6, 196, 242, 245, 213, 55],
), (
b"hpack-test".to_vec(),
vec![158, 177, 147, 170, 201, 42, 19],
), (
b"xxxxxxx1".to_vec(),
vec![243, 231, 207, 159, 62, 124, 135],
), (
b"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0".to_vec(),
vec![208, 127, 102, 162, 129, 176, 218, 224, 83, 250, 208, 50, 26, 164, 157, 19, 253, 169, 146, 164, 150, 133, 52, 12, 138, 106, 220, 167, 226, 129, 2, 239, 125, 169, 103, 123, 129, 113, 112, 127, 106, 98, 41, 58, 157, 129, 0, 32, 0, 64, 21, 48, 154, 194, 202, 127, 44, 5, 197, 193],
), (
b"accept".to_vec(),
vec![25, 8, 90, 211],
), (
b"Accept".to_vec(),
vec![132, 132, 45, 105],
), (
b"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8".to_vec(),
vec![73, 124, 165, 137, 211, 77, 31, 67, 174, 186, 12, 65, 164, 199, 169, 143, 51, 166, 154, 63, 223, 154, 104, 250, 29, 117, 208, 98, 13, 38, 61, 76, 121, 166, 143, 190, 208, 1, 119, 254, 190, 88, 249, 251, 237, 0, 23, 123],
), (
b"cookie".to_vec(),
vec![33, 207, 212, 197],
), (
b"B=11231252zdf&b=3&s=0b".to_vec(),
vec![187, 0, 66, 38, 66, 38, 197, 238, 73, 126, 35, 129, 159, 132, 64, 8, 255],
), (
b"TE".to_vec(),
vec![223, 131],
), (
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi non bibendum libero. Etiam ultrices lorem ut.".to_vec(),
vec![206, 123, 11, 74, 134, 173, 22, 210, 164, 135, 160, 246, 40, 131, 37, 65, 210, 84, 253, 40, 67, 212, 130, 145, 37, 77, 182, 40, 57, 13, 89, 144, 67, 85, 50, 133, 160, 201, 93, 77, 7, 178, 51, 41, 81, 234, 82, 51, 70, 90, 164, 182, 149, 40, 52, 101, 176, 235, 169, 129, 38, 29, 42, 91, 66, 108, 49, 10, 133, 40, 61, 133, 165, 75, 82, 191],
)]
}
#[cfg(feature = "decode1")]
#[test]
fn decodes_characters_1bits() {
for (ansii_bytes, code_bytes) in supported_characters().iter() {
let mut dst = Vec::new();
decode(&code_bytes, &mut dst, 1).unwrap();
assert_eq!(dst, *ansii_bytes);
}
}
#[cfg(feature = "decode2")]
#[test]
fn decodes_characters_2bits() {
for (ansii_bytes, code_bytes) in supported_characters().iter() {
let mut dst = Vec::new();
decode(&code_bytes, &mut dst, 2).unwrap();
assert_eq!(dst, *ansii_bytes);
}
}
#[cfg(feature = "decode3")]
#[test]
fn decodes_characters_3bits() {
for (ansii_bytes, code_bytes) in supported_characters().iter() {
let mut dst = Vec::new();
decode(&code_bytes, &mut dst, 3).unwrap();
assert_eq!(dst, *ansii_bytes);
}
}
#[cfg(feature = "decode4")]
#[test]
fn decodes_characters_4bits() {
for (ansii_bytes, code_bytes) in supported_characters().iter() {
let mut dst = Vec::new();
decode(&code_bytes, &mut dst, 4).unwrap();
assert_eq!(dst, *ansii_bytes);
}
}
#[cfg(feature = "decode5")]
#[test]
fn decodes_characters_5bits() {
for (ansii_bytes, code_bytes) in supported_characters().iter() {
let mut dst = Vec::new();
decode(&code_bytes, &mut dst, 5).unwrap();
assert_eq!(dst, *ansii_bytes);
}
}
#[cfg(feature = "decode1")]
#[test]
fn decodes_literals_1bits() {
for (ansii_bytes, code_bytes) in sample_literals().iter() {
let mut dst = Vec::new();
decode(code_bytes, &mut dst, 1).unwrap();
assert_eq!(dst, *ansii_bytes);
}
}
#[cfg(feature = "decode2")]
#[test]
fn decodes_literals_2bits() {
for (ansii_bytes, code_bytes) in sample_literals().iter() {
let mut dst = Vec::new();
decode(code_bytes, &mut dst, 2).unwrap();
assert_eq!(dst, *ansii_bytes);
}
}
#[cfg(feature = "decode3")]
#[test]
fn decodes_literals_3bits() {
for (ansii_bytes, code_bytes) in sample_literals().iter() {
let mut dst = Vec::new();
decode(code_bytes, &mut dst, 3).unwrap();
assert_eq!(dst, *ansii_bytes);
}
}
#[cfg(feature = "decode4")]
#[test]
fn decodes_literals_4bits() {
for (ansii_bytes, code_bytes) in sample_literals().iter() {
let mut dst = Vec::new();
decode(code_bytes, &mut dst, 4).unwrap();
assert_eq!(dst, *ansii_bytes);
}
}
#[cfg(feature = "decode5")]
#[test]
fn decodes_literals_5bits() {
for (ansii_bytes, code_bytes) in sample_literals().iter() {
let mut dst = Vec::new();
decode(code_bytes, &mut dst, 5).unwrap();
assert_eq!(dst, *ansii_bytes);
}
}
}