#include <msp/io/file.h>
#include <msp/datafile/parser.h>
#include <msp/datafile/statement.h>
-#include <msp/datafile/writer.h>
#include "compiler.h"
+#include "packer.h"
#include "tool.h"
using namespace std;
binary(false),
compile(false),
float_size(0),
- compress(false)
+ compress(false),
+ pack(false),
+ debug(false)
{
GetOpt getopt;
getopt.add_option('b', "binary", binary, GetOpt::NO_ARG);
getopt.add_option('c', "compile", compile, GetOpt::NO_ARG);
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();
void DataTool::do_transfer()
{
IO::Base *out = open_output(out_fn);
- DataFile::Writer writer(*out);
- set_writer_parameters(writer);
+ DataFile::Writer *writer = create_writer(*out);
for(vector<string>::const_iterator i=in_fns.begin(); i!=in_fns.end(); ++i)
{
while(parser)
{
- DataFile::Statement st = parser.parse();
- if(st.valid)
- writer.write(st);
+ DataFile::Statement st = parser.parse(true);
+ if(st.valid && (st.keyword.compare(0, 2, "__") || st.keyword=="__src" || debug))
+ writer->write(st);
}
delete in;
}
+ delete writer;
delete out;
}
void DataTool::do_compile()
{
IO::Base *out = open_output(out_fn);
- DataFile::Writer writer(*out);
- set_writer_parameters(writer);
+ DataFile::Writer *writer = create_writer(*out);
- Compiler compiler(writer);
+ Compiler compiler(*writer);
for(vector<string>::const_iterator i=in_fns.begin(); i!=in_fns.end(); ++i)
{
IO::Base *in = open_input(*i);
delete in;
}
+ delete writer;
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=="-")
return new IO::BufferedFile(fn, IO::M_READ);
}
-void DataTool::set_writer_parameters(DataFile::Writer &writer)
+DataFile::Writer *DataTool::create_writer(IO::Base &out)
{
+ DataFile::Writer *writer = new DataFile::Writer(out);
if(compress)
- writer.set_compressed();
+ writer->set_compressed();
if(binary)
- writer.set_binary(true);
+ writer->set_binary(true);
if(float_size)
- writer.set_float_precision(float_size);
+ writer->set_float_precision(float_size);
+ return writer;
}