szs is a WIP crate for compressing and decompressing SZS formats used in the Nintendo GameCube and Wii games. The library provides C bindings, making it useful in both Rust and C/C++ based projects.
Warning: The library is not currently in a fully functional state. Use at your own risk. 0.1.0 will start the release series.
The following snippet demonstrates how to compress a file as a SZS format using Rust:
```rs
// Sample source bytes to be encoded.
let srcdata: Vec
// Calculate the upper bound for encoding. let maxlen = encodedupperbound(srcdata.len() as u32);
// Allocate a buffer based on the calculated upper bound.
let mut dstdata: Vec
// Boyer-Moore-hoorspool variant let algo_number: u32 = 0;
match encodealgofast(&mut dstdata, &srcdata, algonumber) { Ok(encodedlen) => { println!("Encoded {} bytes", encodedlen); // Optionally: shrink the dstdata to the actual size. dstdata.truncate(encodedlen as usize); } Err(EncodeAlgoError::Error(errmsg)) => { println!("Encoding failed: {}", errmsg); } } ```
```cpp
szs.h
// Boyer-Moore-hoorspool variant
szs::Algo algorithm = szs::Algo::Nintendo;
auto encoded = szs::encodealgo(data, algorithm);
if (!encoded)
std::println(stderr, "Failed to compress: {}.", encoded.error()); {
return -1;
}
std::vector
```c
szs.h
// Calculate the upper bound for encoding. u32 maxsize = riiszsencodedupperbound(sizeof(data));
// Allocate a buffer based on the calculated upper bound. void* encodedbuf = malloc(maxsize); if (!buf) { fprintf(stderr, "Failed to allocate %u bytes.\n", max_size); return -1; }
// Boyer-Moore-hoorspool variant u32 algorithm = RIISZSENCODEALGONINTENDO;
u32 actuallen = 0; const char* ec = riiszsencodealgofast(encodedbuf, maxsize, data, sizeof(data), &actuallen, algorithm); if (ec != NULL) { fprintf(stderr, "Failed to compress: %s\n", ec); riiszsfreeerrormessage(ec); return -1; } printf("Encoded %u bytes.\n", actuallen); // Optionally: shrink the dstdata to the actual size. encodedbuf = realloc(encodedbuf, actual_len); ```
This library is published under the MIT license.