1#[macro_use]
2mod utils;
3
4mod base64;
5mod bitreader;
6mod error;
7
8use bitreader::RevBitReader;
9use std::char::decode_utf16;
10use std::result;
11
12pub use error::{Error, Result};
13
14#[derive(Default)]
15struct State {
16 n_bits: u8,
17 enlarge_in: u64,
18 dict: Vec<Vec<u16>>,
19 res: Vec<u16>,
20 last: (usize, usize),
21}
22
23impl State {
24 fn reset(&mut self) {
25 self.n_bits = 2;
26 self.enlarge_in = 5;
27 self.dict.clear();
28 for i in 0..3 {
29 self.dict.push(vec![i]);
30 }
31 self.res.clear();
32 self.last = (0, 0);
33 }
34}
35
36pub struct Decoder {
37 state: State,
38}
39
40impl Decoder {
41 pub fn new() -> Self {
42 let state = State::default();
43 Decoder { state }
44 }
45
46 pub fn decode_base64_to(&mut self, input: &str, dst: &mut String) -> Result<()> {
47 let reader = RevBitReader::from_iter(base64::DecodeIterator::from_str(input));
48 self.decode_impl(reader, dst)
49 }
50
51 pub fn decode_base64(&mut self, input: &str) -> Result<String> {
52 let mut dst = String::new();
53 self.decode_base64_to(input, &mut dst).and(Ok(dst))
54 }
55
56 pub fn decode_to(&mut self, input: &[u8], dst: &mut String) -> Result<()> {
57 let reader = RevBitReader::from_bytes(input);
58 self.decode_impl(reader, dst)
59 }
60
61 pub fn decode(&mut self, input: &[u8]) -> Result<String> {
62 let mut dst = String::new();
63 self.decode_to(input, &mut dst).and(Ok(dst))
64 }
65
66 pub fn decode_impl<I, E>(&mut self, mut reader: RevBitReader<I>, dst: &mut String) -> Result<()>
67 where
68 E: Into<Error>,
69 I: Iterator<Item = result::Result<u8, E>>,
70 {
71 self.state.reset();
72
73 let slice = self.state.next(&mut reader)?;
74 if slice.is_empty() {
75 return Ok(());
76 }
77
78 self.state.last = (0, 1);
79 self.state.n_bits += 1;
80
81 loop {
82 let before = self.state.res.len();
83 let slice = self.state.next(&mut reader)?;
84 if slice.is_empty() {
85 return self.flush(dst);
86 }
87
88 let mut last = self.state.res[self.state.last.0..self.state.last.1].to_owned();
89 last.push(slice[0]);
90 self.state.add_to_dict(&last);
91
92 self.state.last = (before, self.state.res.len());
93 }
94 }
95
96 fn flush(&mut self, dst: &mut String) -> Result<()> {
97 let chars = self.state.res.iter().map(|u| *u);
98 for chr in decode_utf16(chars) {
99 let chr = chr?;
100 dst.push(chr);
101 }
102
103 Ok(())
104 }
105}
106
107impl State {
108 fn next<I, E>(&mut self, reader: &mut RevBitReader<I>) -> Result<Vec<u16>>
109 where
110 E: Into<Error>,
111 I: Iterator<Item = result::Result<u8, E>>,
112 {
113 let bits = take(reader, self.n_bits)?;
114
115 match bits {
116 0 => self.litteral(reader, 8),
117 1 => self.litteral(reader, 16),
118 2 => Ok(vec![]),
119 c if (c as usize) < self.dict.len() => self.dict_entry(c as usize),
120 c if (c as usize) == self.dict.len() => self.repeat_last(),
121 c => Err(Error::InvalidHeader(c)),
122 }
123 }
124
125 fn litteral<I, E>(&mut self, reader: &mut RevBitReader<I>, n_bits: u8) -> Result<Vec<u16>>
126 where
127 E: Into<Error>,
128 I: Iterator<Item = result::Result<u8, E>>,
129 {
130 let bits = take(reader, n_bits)? as u16;
131 self.add_to_dict(&[bits]);
132 self.res.push(bits);
133 Ok(self.res[self.res.len() - 1..].to_owned())
134 }
135
136 fn dict_entry(&mut self, idx: usize) -> Result<Vec<u16>> {
137 let entry = &self.dict[idx];
138 self.res.extend(entry);
139 Ok(entry.to_owned())
140 }
141
142 fn repeat_last(&mut self) -> Result<Vec<u16>> {
143 let mut value = self.res[self.last.0..self.last.1].to_owned();
144 value.push(value[0]);
145 self.res.extend(value.iter());
146 Ok(value)
147 }
148
149 fn add_to_dict(&mut self, entry: &[u16]) {
150 self.dict.push(entry.to_owned());
151 self.enlarge_in -= 1;
152 if self.enlarge_in == 0 {
153 self.enlarge_in = 1 << self.n_bits;
154 self.n_bits += 1;
155 }
156 }
157}
158
159fn take<I, E>(reader: &mut RevBitReader<I>, n: u8) -> Result<u64>
160where
161 E: Into<Error>,
162 I: Iterator<Item = result::Result<u8, E>>,
163{
164 reader
165 .take(n)
166 .map(|r| r.map_err(Into::into))
167 .unwrap_or(Err(Error::UnexpectedEof))
168}