summaryrefslogtreecommitdiffstats
path: root/rust/vendor/brotli-decompressor/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'rust/vendor/brotli-decompressor/README.md')
-rw-r--r--rust/vendor/brotli-decompressor/README.md143
1 files changed, 143 insertions, 0 deletions
diff --git a/rust/vendor/brotli-decompressor/README.md b/rust/vendor/brotli-decompressor/README.md
new file mode 100644
index 0000000..7bf9656
--- /dev/null
+++ b/rust/vendor/brotli-decompressor/README.md
@@ -0,0 +1,143 @@
+# rust-brotli-decompressor
+
+[![crates.io](https://img.shields.io/crates/v/brotli-decompressor.svg)](https://crates.io/crates/brotli-decompressor)
+[![Build Status](https://travis-ci.org/dropbox/rust-brotli-decompressor.svg?branch=master)](https://travis-ci.org/dropbox/rust-brotli-decompressor)
+
+## What's new in version 2.5.0
+* If you call write with extra bytes it will only return the bytes consumed
+* Further calls to write will return Ok(0)
+
+## What's new in version 2.4.0
+* If you call read until the file is ended, it will return 0 bytes.
+* Further calls to read will error if there are extra unconsumed bytes in the file.
+
+## What's new in version 2.3.5
+* Fix bug in BrotliFillBitWindow
+
+## What's new in version 2.3.4
+* Check for fully consumed buffers in the decompressor reader/writer.
+
+## What's new in version 2.3.x
+* Error handling for Write and Read implementations.
+* Fixed issue with small buffer sizes on certain files when repeatedly calling Decode stream
+* Expose BrotliDecoderIsFinished
+
+## What's new in version 2.2.x
+* into_impl for reader and writer classes
+* removed BrotliStateCleanup since it happens upon drop()
+
+## What's new in version 2.1.2
+* Better handling of transient errors ( fixes #4 )
+* Do not panic in debug mode on unexpected bytes (handle arithmetic overflow)
+* Smaller stack allocations
+* Never create slice::from_raw_parts with nil
+* Better panic reporting to C FFI
+* Backport fixes to brotli issues 502 and 506
+b
+## What's new in version 2.0.0
+
+* Legacy Custom dictionaries (mostly useful for testing multithreaded brotli encoding and experimentation)
+* New mechanism to request that the library should only depend on custom allocations: the --no-default-features flag since --features=std is on by default.
+* Fully compatible C FFI to match the https://github.com/google/brotli C API and become a drop-in replacement
+
+## Project Requirements
+
+Direct no-stdlib port of the C brotli decompressor to Rust if --no-default-features is passed into the build
+
+no dependency on the Rust stdlib: this library would be ideal for decompressing within a rust kernel among other things.
+
+This will be useful to see how C and Rust compare in an apples-to-apples
+comparison where the same algorithms and data structures and
+optimizations are employed.
+
+The current expected performance losses come from
+
+1. an extra indirection in the hgroups
+2. array bounds checks on every access
+3. no ability to load a full aligned 64 bit or 128 bit item from a [u8]
+
+the system also enables all syscalls to be "frontloaded" in the initial generation
+of a memory pool for the allocator. Afterwards, SECCOMP can be activated or
+other mechanisms can be used to secure the application, if desired
+
+## Linking rust-brotli-decompressor with C code using the zero-cost rust FFI abstraction
+
+This library has FFI exports which comply with the original C interfaces.
+To build them, enter the c directory and just type make there.
+That will build a small example program and the cdylib with the appropriate ffi in place to link against
+
+the example, called c/main.c shows how to decompress a program using the streaming interface and the nonstreaming interface.
+
+If a nostdlib version is desired, then an unstable rust must be used (to enable the custom panic handler)
+and then the BrotliDecoderDecompress function is deactivated since that has no facilities for specifying a custom malloc
+
+a customized malloc must be used if a nostdlib build is chosen and additionally the no-stdlib-ffi-binding cargo feature must be set
+eg
+
+cargo build --features='no-stdlib no-stdlib-ffi-binding' --release
+
+
+## Usage
+
+### With the io::Read abstraction
+
+```rust
+let mut input = brotli_decompressor::Decompressor::new(&mut io::stdin(), 4096 /* buffer size */);
+```
+then you can simply read input as you would any other io::Read class
+
+### With the Stream Copy abstraction
+
+```rust
+match brotli_decompressor::BrotliDecompress(&mut io::stdin(), &mut io::stdout(), 65536 /* buffer size */) {
+ Ok(_) => {},
+ Err(e) => panic!("Error {:?}", e),
+}
+```
+
+### With manual memory management
+
+There are 3 steps to using brotli without stdlib
+
+1. setup the memory manager
+2. setup the BrotliState
+3. in a loop, call BrotliDecompressStream
+
+in Detail
+
+```rust
+// at global scope declare a MemPool type -- in this case we'll choose the heap to
+// avoid unsafe code, and avoid restrictions of the stack size
+
+declare_stack_allocator_struct!(MemPool, heap);
+
+// at local scope, make a heap allocated buffers to hold uint8's uint32's and huffman codes
+let mut u8_buffer = define_allocator_memory_pool!(4096, u8, [0; 32 * 1024 * 1024], heap);
+let mut u32_buffer = define_allocator_memory_pool!(4096, u32, [0; 1024 * 1024], heap);
+let mut hc_buffer = define_allocator_memory_pool!(4096, HuffmanCode, [0; 4 * 1024 * 1024], heap);
+let heap_u8_allocator = HeapPrealloc::<u8>::new_allocator(4096, &mut u8_buffer, bzero);
+let heap_u32_allocator = HeapPrealloc::<u32>::new_allocator(4096, &mut u32_buffer, bzero);
+let heap_hc_allocator = HeapPrealloc::<HuffmanCode>::new_allocator(4096, &mut hc_buffer, bzero);
+
+// At this point no more syscalls are going to be needed since everything can come from the allocators.
+
+// Feel free to activate SECCOMP jailing or other mechanisms to secure your application if you wish.
+
+// Now it's possible to setup the decompressor state
+let mut brotli_state = BrotliState::new(heap_u8_allocator, heap_u32_allocator, heap_hc_allocator);
+
+// at this point the decompressor simply needs an input and output buffer and the ability to track
+// the available data left in each buffer
+loop {
+ result = BrotliDecompressStream(&mut available_in, &mut input_offset, &input.slice(),
+ &mut available_out, &mut output_offset, &mut output.slice_mut(),
+ &mut written, &mut brotli_state);
+
+ // just end the decompression if result is BrotliResult::ResultSuccess or BrotliResult::ResultFailure
+}
+```
+
+This interface is the same interface that the C brotli decompressor uses
+
+Also feel free to use custom allocators that invoke Box directly.
+This example illustrates a mechanism to avoid subsequent syscalls after the initial allocation