From 5adc143801103f6a914f3738a0f3986d4bff5630 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Mon, 7 Sep 2015 12:26:58 +0300 Subject: [PATCH] Add an unpack option to the data tool --- tool/tool.cpp | 43 +++++++++++++++++++++++++++++++++++++++++-- tool/tool.h | 2 ++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/tool/tool.cpp b/tool/tool.cpp index d58853e..73c49f7 100644 --- a/tool/tool.cpp +++ b/tool/tool.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include "compiler.h" @@ -18,6 +19,7 @@ DataTool::DataTool(int argc, char **argv): float_size(0), compress(false), pack(false), + unpack(false), debug(false) { GetOpt getopt; @@ -27,21 +29,34 @@ DataTool::DataTool(int argc, char **argv): getopt.add_option('g', "debug", debug, GetOpt::NO_ARG).set_help("Display control statements"); getopt.add_option('o', "output", out_fn, GetOpt::REQUIRED_ARG).set_help("Output to a file instead of stdout", "FILE"); getopt.add_option('p', "pack", pack, GetOpt::NO_ARG).set_help("Create a pack from multiple files"); + getopt.add_option('u', "unpack", unpack, GetOpt::NO_ARG).set_help("Unpacks files from packs into the current directory"); getopt.add_option('z', "compress", compress, GetOpt::NO_ARG).set_help("Produce a compressed datafile"); getopt.add_argument("infile", in_fns, GetOpt::OPTIONAL_ARG).set_help("Files to process"); getopt(argc, argv); - if(in_fns.empty()) - in_fns.push_back("-"); + if(compile+pack+unpack>1) + throw usage_error("Only one of -c, -p and -u may be specified"); if(pack && out_fn=="-") throw usage_error("Can't write pack to stdout"); + + if(in_fns.empty()) + in_fns.push_back("-"); + + if(unpack) + { + for(list::const_iterator i=in_fns.begin(); i!=in_fns.end(); ++i) + if(*i=="-") + throw usage_error("Can't unpack from stdout"); + } } int DataTool::main() { if(pack) do_pack(); + else if(unpack) + do_unpack(); else if(compile) do_compile(); else @@ -100,6 +115,30 @@ void DataTool::do_pack() packer.create_pack(out_fn); } +void DataTool::do_unpack() +{ + DataFile::PackSource source; + for(list::const_iterator i=in_fns.begin(); i!=in_fns.end(); ++i) + source.add_pack_file(*i); + + list files = source.list_files(); + for(list::const_iterator i=files.begin(); i!=files.end(); ++i) + { + IO::Seekable *in = source.open(i->name); + IO::Base *out = open_output(i->name); + char buf[16384]; + while(1) + { + unsigned len = in->read(buf, sizeof(buf)); + out->write(buf, len); + if(len