Utilities: Add an lzcat utility

This commit is contained in:
Tim Schumacher 2023-03-05 14:30:23 +01:00 committed by Idan Horowitz
parent b3a9729e23
commit 858c44ae1b
Notes: sideshowbarker 2024-07-17 14:33:07 +09:00
2 changed files with 37 additions and 1 deletions

View file

@ -7,7 +7,7 @@ list(APPEND REQUIRED_TARGETS
touch tr true umount uname uniq uptime w wc which whoami xargs yes
)
list(APPEND RECOMMENDED_TARGETS
adjtime aplay abench asctl bt checksum chres cksum copy fortune gunzip gzip init install keymap lsirq lsof lspci man mknod mktemp
adjtime aplay abench asctl bt checksum chres cksum copy fortune gunzip gzip init install keymap lsirq lsof lspci lzcat man mknod mktemp
nc netstat notify ntpquery open passwd pls printf pro shot strings tar tt unzip wallpaper zip
)
@ -105,6 +105,7 @@ target_link_libraries(keymap PRIVATE LibKeyboard)
target_link_libraries(less PRIVATE LibLine)
target_link_libraries(lspci PRIVATE LibPCIDB)
target_link_libraries(lsusb PRIVATE LibUSBDB)
target_link_libraries(lzcat PRIVATE LibCompress)
target_link_libraries(man PRIVATE LibMarkdown LibManual)
target_link_libraries(markdown-check PRIVATE LibMarkdown)
target_link_libraries(matroska PRIVATE LibVideo)

View file

@ -0,0 +1,35 @@
/*
* Copyright (c) 2023, Tim Schumacher <timschumi@gmx.de>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibCompress/Lzma.h>
#include <LibCore/ArgsParser.h>
#include <LibCore/File.h>
#include <LibCore/System.h>
#include <LibMain/Main.h>
ErrorOr<int> serenity_main(Main::Arguments arguments)
{
TRY(Core::System::pledge("rpath stdio"));
StringView filename;
Core::ArgsParser args_parser;
args_parser.set_general_help("Decompress and print an LZMA archive");
args_parser.add_positional_argument(filename, "File to decompress", "file");
args_parser.parse(arguments);
auto file = TRY(Core::File::open_file_or_standard_stream(filename, Core::File::OpenMode::Read));
auto stream = TRY(Compress::LzmaDecompressor::create_from_container(move(file)));
// Arbitrarily chosen buffer size.
Array<u8, 4096> buffer;
while (!stream->is_eof()) {
auto slice = TRY(stream->read_some(buffer));
out("{:s}", slice);
}
return 0;
}