aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
blob: b5062f69bb1a8befbb77c45925d6dae7d6028713 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use std::env;
// use std::fs;
use std::io;
use std::io::Read;
use std::io::Write;

pub mod tree;
pub mod bits;
pub mod conversion;

use tree::Tree;
use bits::BitSet;

fn main() {
    if let Some(s) = env::args().nth(1) {
        if s != "d" {
            return
        }
        let data: Vec<u8> = io::stdin().bytes().map(|x| x.unwrap()).collect();

        let mut iter = data.iter();

        let mut size: u32 = 0;
        for i in 0..4 {
            size |= (*iter.next().unwrap() as u32) << ((3 - i) * 8);
        }
        // println!("{}", size);

        let mut header_iter = iter.clone().take(size as usize).cloned();
        let mut table = conversion::Table::new();
        loop {
            let test = header_iter.next();
            if test == None {
                break;
            }
            // FIXME not working with lorem
            let key             = test.unwrap();
            let bits_len: usize = header_iter.next().unwrap().into();
            let value: Vec<u8>  = header_iter.clone().take(bits_len / 8 +
                if bits_len % 8 != 0 {1} else {0}).collect();
            for _ in 0..(bits_len / 8 + 1) {
                header_iter.next();
            }

            table.0.insert(key, BitSet { data: value, len: bits_len });
        }
        // println!("{:?}", table);

        let data: Vec<u8> = iter.skip(size as usize).cloned().collect();
        let mut bitset = BitSet { len: data.len() * 8, data: data };

        // TODO: store bit size in serialized, cause wrong matches due to padding
        let mut found = true;
        let mut content = Vec::new();
        while found {
            println!("{:?}", bitset);
            found = false;
            for (k, v) in &table.0 {
                if bitset.start_with(&v) {
                    content.push(k);
                    bitset <<= v.len;
                    found = true;
                }
            }
        }
        for x in content {
            print!("{}", *x as char);
        }

    } else {
        // let f = fs::File::open(file_path).unwrap();

        let data: Vec<u8> = io::stdin().bytes().map(|x| x.unwrap()).collect();

        let tree = Tree::from_data(&data);
        // print!("{:?}", tree);

        let table = conversion::Table::from_tree(&tree);
        // print!("{:?}", table);

        let converted_data = table.convert(data);
        // println!("{:?}", converted_data);

        let header = table.serialize();

        io::stdout().write_all(&header).unwrap();
        io::stdout().write_all(&converted_data).unwrap();
    }
}