From b3c0b0489ebc5811452c2cc414dc63ce32e7ec97 Mon Sep 17 00:00:00 2001 From: lzwdgc Date: Tue, 10 Jan 2023 15:46:25 +0300 Subject: [PATCH] [unpaker2] lzma decoder. --- src/unpaker2/unpaker2.cpp | 23 +++++++++++++++++++++-- sw.cpp | 5 ++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/unpaker2/unpaker2.cpp b/src/unpaker2/unpaker2.cpp index dfcc759..02c477e 100644 --- a/src/unpaker2/unpaker2.cpp +++ b/src/unpaker2/unpaker2.cpp @@ -32,6 +32,7 @@ #include #include +#include #include using namespace std; @@ -135,12 +136,30 @@ void unpack_file(path fn) { } break; } - case segment::decode_algorithm::lzma: + case segment::decode_algorithm::lzma: { + uint8_t flags = s; + + lzma_stream strm{}; + strm.next_in = s.p; + strm.avail_in = len; + strm.next_out = pp; + strm.avail_out = 1'000'000; + + auto r = lzma_auto_decoder(&strm, 1'000'000'000, flags); + if (r != LZMA_OK) { + throw std::runtime_error{"lzma error"}; + } + r = lzma_code(&strm, LZMA_RUN); + if (r != LZMA_STREAM_END) { + throw std::runtime_error{"lzma error"}; + } + pp += strm.total_out; + break; + } default: throw std::runtime_error{"compression unsupported: "s + std::to_string(seg.algorithm)}; } } - exi: pp = bbb.data(); auto dir = fn += ".dir2"; diff --git a/sw.cpp b/sw.cpp index f646a22..9f8768f 100644 --- a/sw.cpp +++ b/sw.cpp @@ -54,7 +54,10 @@ void build(Solution &s) auto &unpaker = add_exe_base("unpaker"); // 32-bit only if (unpaker.getBuildSettings().TargetOS.Arch != ArchType::x86) unpaker.HeaderOnly = true; - add_exe_with_common("unpaker2") += "org.sw.demo.oberhumer.lzo.lzo"_dep; + add_exe_with_common("unpaker2") += + "org.sw.demo.oberhumer.lzo.lzo"_dep, + "org.sw.demo.xz_utils.lzma"_dep + ; // not so simple targets auto &script2txt = add_exe_with_common("script2txt");