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