mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 03:51:18 +00:00
* stdlib: implement `std::compression::zip` and `std::compression::deflate` - C3 implementation of DEFLATE (RFC 1951) and ZIP archive handling. - Support for reading and writing archives using STORE and DEFLATE methods. - Decompression supports both fixed and dynamic Huffman blocks. - Compression using greedy LZ77 matching. - Zero dependencies on libc. - Stream-based entry reading and writing. - Full unit test coverage. NOTE: This is an initial implementation. Future improvements could be: - Optimization of the LZ77 matching (lazy matching). - Support for dynamic Huffman blocks in compression. - ZIP64 support for large files/archives. - Support for encryption and additional compression methods. * optimizations+refactoring deflate: - replace linear search with hash-based match finding. - implement support for dynamic Huffman blocks using the Package-Merge algorithm. - add streaming decompression. - add buffered StreamBitReader. zip: - add ZIP64 support. - add CP437 and UTF-8 filename encoding detection. - add DOS date/time conversion and timestamp preservation. - add ZipEntryReader for streaming entry reads. - implement ZipArchive.extract and ZipArchive.recover helpers. other: - Add `set_modified_time` to std::io; - Add benchmarks and a few more unit tests. * zip: add archive comment support add tests * forgot to rename the benchmark :( * detect utf8 names on weird zips fix method not passed to open_writer * another edge case where directory doesn't end with / * testing utilities - detect encrypted zip - `ZipArchive.open_writer` default to DEFLATE * fix zip64 creation, add tests * fix ZIP header endianness for big-endian compatibility Update ZipLFH, ZipCDH, ZipEOCD, Zip64EOCD, and Zip64Locator structs to use little-endian bitstruct types from std::core::bitorder * fix ZipEntryReader position tracking and seek logic ZIP_METHOD_STORE added a test to track this * add package-merge algorithm attribution Thanks @konimarti * standalone deflate_benchmark.c3 against `miniz` * fix integer overflows, leaks and improve safety * a few safety for 32-bit systems and tests * deflate compress optimization * improve match finding, hash updates, and buffer usage * use ulong for zip offsets * style changes (#18) * style changes * update tests * style changes in `deflate.c3` * fix typo * Allocator first. Some changes to deflate to use `copy_to` * Fix missing conversion on 32 bits. * Fix deflate stream. Formatting. Prefer switch over if-elseif * - Stream functions now use long/ulong rather than isz/usz for seek/available. - `instream.seek` is replaced by `set_cursor` and `cursor`. - `instream.available`, `cursor` etc are long/ulong rather than isz/usz to be correct on 32-bit. * Update to constdef * Fix test --------- Co-authored-by: Book-reader <thevoid@outlook.co.nz> Co-authored-by: Christoffer Lerno <christoffer@aegik.com>
92 lines
2.8 KiB
Plaintext
92 lines
2.8 KiB
Plaintext
module std::io::os @if(env::NO_LIBC);
|
|
import libc;
|
|
|
|
alias FopenFn = fn void*?(String, String);
|
|
alias FreopenFn = fn void*?(void*, String, String);
|
|
alias FcloseFn = fn void?(void*);
|
|
alias FseekFn = fn void?(void*, long, SeekOrigin);
|
|
alias FtellFn = fn long?(void*);
|
|
alias FwriteFn = fn usz?(void*, char[] buffer);
|
|
alias FreadFn = fn usz?(void*, char[] buffer);
|
|
alias RemoveFn = fn void?(String);
|
|
alias FputcFn = fn void?(int, void*);
|
|
alias SetModifiedTimeFn = fn void?(String, libc::Time_t);
|
|
|
|
FopenFn native_fopen_fn @weak @if(!$defined(native_fopen_fn));
|
|
FcloseFn native_fclose_fn @weak @if(!$defined(native_fclose_fn));
|
|
FreopenFn native_freopen_fn @weak @if(!$defined(native_freopen_fn));
|
|
FseekFn native_fseek_fn @weak @if(!$defined(native_fseek_fn));
|
|
FtellFn native_ftell_fn @weak @if(!$defined(native_ftell_fn));
|
|
FwriteFn native_fwrite_fn @weak @if(!$defined(native_fwrite_fn));
|
|
FreadFn native_fread_fn @weak @if(!$defined(native_fread_fn));
|
|
RemoveFn native_remove_fn @weak @if(!$defined(native_remove_fn));
|
|
FputcFn native_fputc_fn @weak @if(!$defined(native_fputc_fn));
|
|
SetModifiedTimeFn native_set_modified_time_fn @weak @if(!$defined(native_set_modified_time_fn));
|
|
|
|
<*
|
|
@require mode.len > 0
|
|
@require filename.len > 0
|
|
*>
|
|
fn void*? native_fopen(String filename, String mode) @inline
|
|
{
|
|
if (native_fopen_fn) return native_fopen_fn(filename, mode);
|
|
return io::UNSUPPORTED_OPERATION~;
|
|
}
|
|
|
|
<*
|
|
Delete a file.
|
|
|
|
@require filename.len > 0
|
|
*>
|
|
fn void? native_remove(String filename) @inline
|
|
{
|
|
if (native_remove_fn) return native_remove_fn(filename);
|
|
return io::UNSUPPORTED_OPERATION~;
|
|
}
|
|
|
|
<*
|
|
@require mode.len > 0
|
|
@require filename.len > 0
|
|
*>
|
|
fn void*? native_freopen(void* file, String filename, String mode) @inline
|
|
{
|
|
if (native_freopen_fn) return native_freopen_fn(file, filename, mode);
|
|
return io::UNSUPPORTED_OPERATION~;
|
|
}
|
|
|
|
fn void? native_fseek(void* file, long offset, SeekOrigin whence) @inline
|
|
{
|
|
if (native_fseek_fn) return native_fseek_fn(file, offset, whence);
|
|
return io::UNSUPPORTED_OPERATION~;
|
|
}
|
|
|
|
fn ulong? native_ftell(CFile file) @inline
|
|
{
|
|
if (native_ftell_fn) return native_ftell_fn(file);
|
|
return io::UNSUPPORTED_OPERATION~;
|
|
}
|
|
|
|
fn usz? native_fwrite(CFile file, char[] buffer) @inline
|
|
{
|
|
if (native_fwrite_fn) return native_fwrite_fn(file, buffer);
|
|
return io::UNSUPPORTED_OPERATION~;
|
|
}
|
|
|
|
fn usz? native_fread(CFile file, char[] buffer) @inline
|
|
{
|
|
if (native_fread_fn) return native_fread_fn(file, buffer);
|
|
return io::UNSUPPORTED_OPERATION~;
|
|
}
|
|
|
|
fn void? native_fputc(CInt c, CFile stream) @inline
|
|
{
|
|
if (native_fputc_fn) return native_fputc_fn(c, stream);
|
|
return io::UNSUPPORTED_OPERATION~;
|
|
}
|
|
|
|
fn void? native_set_modified_time(String filename, libc::Time_t time) @inline
|
|
{
|
|
if (native_set_modified_time_fn) return native_set_modified_time_fn(filename, time);
|
|
return io::UNSUPPORTED_OPERATION~;
|
|
}
|