扩展库/miniz
miniz
压缩归档2026-10-29 新顶层对象检查确认 M2 主线阻断:Windows/Linux JIT 退出0;独立 EXE 均打印校验 PASS 后在退出期报状态错误、退出1。默认门禁已接入,旧函数内对象、算法互通与双语通过不覆盖该边界,暂不作完整发布签收;不提前销毁或移动全局对象绕开。
2026-10-30 打开态文件回滚双故障已修复,96 组真实 C 夹具在 Windows 旧 8 失败→新 0;首因、旧目标和内存平衡保持。Windows 关闭态回滚 OOM 仍有两组残留(RFS),Linux 同例过;默认门禁分别保留 RFS/M2,不能签收整包。标准 zlib 77 编码/56 外部解码/70 拒绝和新双语事务例、各 14 条普通独立程序路径通过。
标准 zlib 流压缩,底层复用 XRT 的 deflate/inflate,不重复携带另一套压缩引擎。xlang 层提供二进制安全的 Buffer 一次性、文件级和 update → drain → finish 增量流式接口。
典型场景
快速开始
import miniz
func main(...) as int
Buffer packed = miniz.compress("hello miniz")
println(miniz.decompressText(packed)) // hello miniz
auto enc = miniz.compressor()
enc.update("part1 ")
enc.update("part2")
enc.finish()
Buffer blob = enc.drain()
auto dec = miniz.decompressor()
dec.update(blob)
dec.finish()
println(dec.drain().text()) // part1 part2
return 0
end核心特性
- 标准 zlib 流 — 可与 zlib 工具互通;它不是 gzip 容器
- 二进制安全 — 原始输出使用
Buffer;decompressText只接受合法 UTF-8 明文 - 三种粒度 — 一次性内存、文件级、增量流式(
MinizCompressor/MinizDecompressor) - 真流式输出 —
drain()随时取走已产出字节 - 进度回显 —
inputBytes/outputBytes字节计数器 - 完整性校验 — Adler-32、截断和尾部数据由 XRT 解码器检查
- 级别 0..10 — 0 存储、6 默认、10 最大设置;压缩率和耗时按实际输入测量
- 目标提交 — 同目录临时文件,处理、flush/close 成功后才重命名;不等于断电持久性保证
包信息
| 包名 | miniz |
|---|---|
| 版本 | 1.0.0 |
| 引擎 | XRT deflate/inflate(zlib 格式) |
| 实现方式 | XRT 编解码 + C/XLang 接口层 |
| 依赖 | 无 |
| ABI 版本 | 1 |
| 导出符号 | compress(), decompress(), decompressText(), compressFile(), decompressFile(), compressor(), decompressor(), MinizCompressor, MinizDecompressor, MINIZ_* 常量 |
| 源文件 | extlibs/miniz/src/miniz.xl |
压缩级别常量。0 不压缩、10 压缩率最高、6 为默认平衡点。
提供一次性、文件级和增量流式三种接口。流式类提供 update/drain/finish、inputBytes/outputBytes/finished;每次编码只生成一条 zlib 流,解码拒绝第二条拼接流及旧私有容器。
onProgress(inputBytes, totalBytes, outputBytes)。含 NUL 的源/目标路径报 ValueError,false 取消,回调错误保留首因。普通 C Reader/Writer 流使用 xrtprogressproc + userData;native 文件 ABI 使用三个 uint64 参数、bool 返回的 XRT callable,无 FINAL 参数。C 流进度从 Reader 当前位置起算,无法同时取得总长和当前位置时不置 TOTAL_KNOWN。Windows 关闭态回滚 OOM 仍开放。level 在工厂和直接原生构造入口都只接受 0..10,越界抛 ValueError。结构化底层错误直接分发:损坏/截断通常为 IOError,限额为 RangeError,分配失败为 MemoryError,不一概改成 CompressionError。教学范例
完整源文件:examples/extlibs/miniz.xl
1. 一次性 + 流式
import miniz
Buffer packed = miniz.compress("xlang miniz")
assert miniz.decompressText(packed) == "xlang miniz"
println("引擎版本: ", miniz.version())
auto encoder = miniz.compressor()
Buffer streamPacked = Buffer()
encoder.update("hello ")
streamPacked.append(encoder.drain())
encoder.update("stream")
streamPacked.append(encoder.drain())
encoder.finish()
streamPacked.append(encoder.drain())
auto decoder = miniz.decompressor()
decoder.update(streamPacked)
decoder.finish()
assert decoder.drain().text() == "hello stream"2. 最高级别 L10
import miniz
auto tuned = miniz.compressor(miniz.MINIZ_MAX_LEVEL)
tuned.update("tune me")
tuned.finish()
assert miniz.decompress(tuned.drain()).text() == "tune me"以上两段对象在顶层:当前 JIT 可运行,AOT 仍在退出时受 M2 阻断,不以正文断言通过代替自然退役。文件事务双语完整例 extlibs/miniz/examples/file_transaction.xl / file_transaction_c.c 展示 UTF-8 路径、取消/回调错误保护旧目标及重试,各自创建并清理独占目录。
运行范例
cd release xl.exe run examples\extlibs\miniz.xl
C 对照范例可从 release 目录直接运行:xl.exe run extlibs/miniz/examples/basic.c。正式包仍按清单分离编译原生源码。
包内 extlibs/miniz/examples/streaming.xl 与 streaming_c.c 是完整增量流双语对照:及时 drain、finish 尾部收集、分块解压和计数断言。两份可直接 xl run 或 build,无文件依赖,固定输出为 hello stream 和 12 / 12。
测试覆盖
当前普通功能和各 14 条普通 AOT 路径通过,不表示默认门禁全绿:Windows 76 阶段中 74 项符合要求,关闭态 RFS 与顶层 M2 分别失败;Linux 此轮只剩 M2。直接构造器/C 桥接、五类非法级别、0..10 往返、显式类型、头包含顺序和原先 IO 首因/分配测试保留。历史资源事件未被本轮绿跑当成已关闭。
2026-10-28 Windows/Linux 默认门禁通过新增 C IO 首因矩阵:四个入口 × 七类错误共 28 组、真实 Writer 扩容 OOM、关闭归属和活动分配恢复。保留严格 GCC、Linux ASan/UBSan、Python zlib 互通、新旧双语 JIT/AOT;Windows 默认模式也完整构建运行中央、进度、文件、分配和完整范例。失败保留原始状态与输入指纹,不把一次通过写成长期压力或所有平台认证。
测试文件:extlibs/miniz/test/file_ops.xl、extlibs/miniz/test/test_miniz.c,以及中央 test/cases/extlib_miniz.xl。C 入口先验证选项和资源限制结构的长度、版本、保留字段及 0..10 级别;条目、节点、深度限额及未知标志不适用于单条 zlib 流,显式设置会报参数错误,不读取文件流输入。
- 一次性二进制往返(含 NUL / 0xFF)
- 流式往返 + finished 状态
- 分块收集 + inputBytes 计数器
- 最高级别 MINIZ_MAX_LEVEL(L10)往返
- 级别越界抛 ValueError
- Python zlib 双向互通、拼接流与尾部数据拒绝
- 77 组本包编码、56 组外部流解码、70 组拒绝;含存储/固定/动态块、RLE、Huffman-only、不同窗口
- Python -I -O 仍执行判据:坏流须 raw1、DATA/TRUNCATED 诊断及零部分输出,OOM/崩溃/超时不算通过
- 损坏数据抛 IOError
- 文件级往返 + overwrite 拒绝
- 打开态 96 组双故障回滚全过,关闭态 16 组 Windows 仍有两组临时残留,保持真实失败
- 文件进度回调、取消清理及限额失败时的既有目标保护
- C Reader/Writer 二进制流往返与进度回调
- 一次性编解码的 XRT 分配失败、空输出、释放平衡与恢复;XLang 公开入口须抛 MemoryError
- 流对象、一次性及文件流入口的选项 ABI 和 -1/11 级别拒绝;0..10 全部可往返
2026-10-26 当前 Windows/Linux x64 包级门禁通过:严格 C、Linux ASan/UBSan、Python 标准库 zlib 双向互通、XLang JIT/AOT,以及 C/XLang 基础范例输出一致。Linux 另覆盖七条独立 EXE AOT 和文件/完整范例 JIT/AOT 对照。旧 Linux cstring、根目录 VFS 与 AOT 缺符号阻断不再复现;32 位、TSan、长时压力及持续模糊测试尚未验收。
运行测试
powershell -NoProfile -ExecutionPolicy Bypass -File release/extlibs/miniz/test/check.ps1 bash release/extlibs/miniz/test/check.sh