szs

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.

Algorithms

Rust

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 = "Hello, World!".asbytes().to_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 = vec![0; maxlen as usize];

// 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); } } ```

Example (C++ Bindings)

```cpp

include 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 szsdata = *encoded; std::println("Encoded {} bytes.", szs_data.size()); ```

Example (C Bindings)

```c

include 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); ```

License

This library is published under the MIT license.