]> git.tdb.fi Git - libs/datafile.git/blobdiff - tool/tool.cpp
Add an intelligent packed collection class
[libs/datafile.git] / tool / tool.cpp
index 5469106f50322b7497ea9626c5a4b2400187aa1c..81c6be9b831b8bd74a80258337cd5d692f0d4734 100644 (file)
@@ -5,6 +5,7 @@
 #include <msp/datafile/parser.h>
 #include <msp/datafile/statement.h>
 #include "compiler.h"
+#include "packer.h"
 #include "tool.h"
 
 using namespace std;
@@ -16,6 +17,7 @@ DataTool::DataTool(int argc, char **argv):
        compile(false),
        float_size(0),
        compress(false),
+       pack(false),
        debug(false)
 {
        GetOpt getopt;
@@ -24,17 +26,23 @@ DataTool::DataTool(int argc, char **argv):
        getopt.add_option('f', "float-size", float_size, GetOpt::REQUIRED_ARG);
        getopt.add_option('g', "debug", debug, GetOpt::NO_ARG);
        getopt.add_option('o', "output", out_fn, GetOpt::REQUIRED_ARG);
+       getopt.add_option('p', "pack", pack, GetOpt::NO_ARG);
        getopt.add_option('z', "compress", compress, GetOpt::NO_ARG);
        getopt(argc, argv);
 
        in_fns = getopt.get_args();
        if(in_fns.empty())
                in_fns.push_back("-");
+
+       if(pack && out_fn=="-")
+               throw usage_error("Can't write pack to stdout");
 }
 
 int DataTool::main()
 {
-       if(compile)
+       if(pack)
+               do_pack();
+       else if(compile)
                do_compile();
        else
                do_transfer();
@@ -84,6 +92,14 @@ void DataTool::do_compile()
        delete out;
 }
 
+void DataTool::do_pack()
+{
+       Packer packer(*this);
+       for(vector<string>::const_iterator i=in_fns.begin(); i!=in_fns.end(); ++i)
+               packer.pack_file(*i);
+       packer.create_pack(out_fn);
+}
+
 IO::Base *DataTool::open_output(const string &fn)
 {
        if(fn=="-")