]> git.tdb.fi Git - libs/datafile.git/blob - tool/tool.cpp
Restructure the tool and make it able to handle multiple input files
[libs/datafile.git] / tool / tool.cpp
1 #include <msp/core/getopt.h>
2 #include <msp/io/buffered.h>
3 #include <msp/io/console.h>
4 #include <msp/io/file.h>
5 #include <msp/datafile/parser.h>
6 #include <msp/datafile/statement.h>
7 #include <msp/datafile/writer.h>
8 #include "compiler.h"
9 #include "tool.h"
10
11 using namespace std;
12 using namespace Msp;
13
14 DataTool::DataTool(int argc, char **argv):
15         out_fn("-"),
16         binary(false),
17         compile(false),
18         float_size(0),
19         compress(false)
20 {
21         GetOpt getopt;
22         getopt.add_option('b', "binary", binary, GetOpt::NO_ARG);
23         getopt.add_option('c', "compile", compile, GetOpt::NO_ARG);
24         getopt.add_option('f', "float-size", float_size, GetOpt::REQUIRED_ARG);
25         getopt.add_option('o', "output", out_fn, GetOpt::REQUIRED_ARG);
26         getopt.add_option('z', "compress", compress, GetOpt::NO_ARG);
27         getopt(argc, argv);
28
29         in_fns = getopt.get_args();
30         if(in_fns.empty())
31                 in_fns.push_back("-");
32 }
33
34 int DataTool::main()
35 {
36         if(compile)
37                 do_compile();
38         else
39                 do_transfer();
40
41         return 0;
42 }
43
44 void DataTool::do_transfer()
45 {
46         IO::Base *out = open_output(out_fn);
47         DataFile::Writer writer(*out);
48         set_writer_parameters(writer);
49
50         for(vector<string>::const_iterator i=in_fns.begin(); i!=in_fns.end(); ++i)
51         {
52                 IO::Base *in = open_input(*i);
53                 DataFile::Parser parser(*in, *i);
54
55                 while(parser)
56                 {
57                         DataFile::Statement st = parser.parse();
58                         if(st.valid)
59                                 writer.write(st);
60                 }
61
62                 delete in;
63         }
64
65         delete out;
66 }
67
68 void DataTool::do_compile()
69 {
70         IO::Base *out = open_output(out_fn);
71         DataFile::Writer writer(*out);
72         set_writer_parameters(writer);
73
74         Compiler compiler(writer);
75         for(vector<string>::const_iterator i=in_fns.begin(); i!=in_fns.end(); ++i)
76         {
77                 IO::Base *in = open_input(*i);
78                 DataFile::Parser parser(*in, *i);
79                 compiler.load(parser);
80                 delete in;
81         }
82
83         delete out;
84 }
85
86 IO::Base *DataTool::open_output(const string &fn)
87 {
88         if(fn=="-")
89                 return new IO::Buffered(IO::cout);
90         else
91                 return new IO::BufferedFile(fn, IO::M_WRITE);
92 }
93
94 IO::Base *DataTool::open_input(const string &fn)
95 {
96         if(fn=="-")
97                 return new IO::Buffered(IO::cin);
98         else
99                 return new IO::BufferedFile(fn, IO::M_READ);
100 }
101
102 void DataTool::set_writer_parameters(DataFile::Writer &writer)
103 {
104         if(compress)
105                 writer.set_compressed();
106         if(binary)
107                 writer.set_binary(true);
108         if(float_size)
109                 writer.set_float_precision(float_size);
110 }