[go: up one dir, main page]

brotli 0.1.1

A brotli decompressor that runs at comparable speed to the reference C implementation with entirely safe rust code.
Documentation
#![cfg(test)]
extern crate core;
use core::cmp;

use std::io;

struct Buffer {
    data : Vec<u8>,
    read_offset : usize,
}
impl Buffer {
    pub fn new(buf : &[u8]) -> Buffer {
        let mut ret = Buffer{
            data : Vec::<u8>::new(),
            read_offset : 0,
        };
        ret.data.extend(buf);
        return ret;
    }
}
impl io::Read for Buffer {
    fn read(self : &mut Self, buf : &mut [u8]) -> io::Result<usize> {
        let bytes_to_read = cmp::min(buf.len(), self.data.len() - self.read_offset);
        if bytes_to_read > 0 {
            buf[0..bytes_to_read].clone_from_slice(&self.data[self.read_offset ..
                                                                     self.read_offset + bytes_to_read]);
        }
        self.read_offset += bytes_to_read;
        return Ok(bytes_to_read);
    }
}
impl io::Write for Buffer {
    fn write(self : &mut Self, buf : &[u8]) -> io::Result<usize> {
        self.data.extend(buf);
        return Ok(buf.len());
    }
    fn flush(self : &mut Self) -> io::Result<()> {
        return Ok(());
    }
}


#[test]
fn test_10x_10y() {
    let in_buf : [u8;12] = [0x1b, 0x13, 0x00, 0x00, 0xa4, 0xb0, 0xb2, 0xea, 0x81, 0x47, 0x02, 0x8a];

    let mut output = Buffer::new(&[]);
    let mut input = super::Decompressor::new(Buffer::new(&in_buf));
    match super::copy_from_to(&mut input, &mut output) {
        Ok(_) => {},
        Err(e) => panic!("Error {:?}", e),
    }
    let mut i : usize = 0;
    while i < 10 {
      assert_eq!(output.data[i], 'X' as u8);
      assert_eq!(output.data[i + 10], 'Y' as u8);
      i += 1;
    }
    assert_eq!(output.data.len(), 20);
}


#[test]
fn test_alice() {
    let in_buf = include_bytes!("../testdata/alice29.txt.compressed");

    let mut output = Buffer::new(&[]);
    let mut input = super::Decompressor::new(Buffer::new(in_buf));
    match super::copy_from_to(&mut input, &mut output) {
        Ok(_) => {},
        Err(e) => panic!("Error {:?}", e),
    }
    let mut i : usize = 0;
    let truth = include_bytes!("../testdata/alice29.txt");
    while i < truth.len() {
      assert_eq!(output.data[i], truth[i]);
      i += 1;
    }
    assert_eq!(truth.len(), output.data.len());
}