]> git.tdb.fi Git - libs/datafile.git/blob - source/textwriter.cpp
5212c9760488330de78807ab7e4eb97bc3727827
[libs/datafile.git] / source / textwriter.cpp
1 #include <msp/io/print.h>
2 #include <msp/strings/utils.h>
3 #include "output.h"
4 #include "statement.h"
5 #include "textwriter.h"
6
7 using namespace std;
8
9 namespace Msp {
10 namespace DataFile {
11
12 TextWriter::TextWriter(Output &o):
13         WriterMode(o),
14         float_format("%#.7g")
15 { }
16
17 void TextWriter::set_float_precision(unsigned fp)
18 {
19         float_format = format("%%#.%dg", fp/4-1);
20 }
21
22 void TextWriter::write(const Statement &st)
23 {
24         write_(st, 0);
25 }
26
27 void TextWriter::write_(const Statement &st, unsigned level)
28 {
29         string indent(level, '\t');
30
31         out.write(format("%s%s", indent, st.keyword));
32         for(ValueArray::const_iterator i = st.args.begin(); i!=st.args.end(); ++i)
33         {
34                 out.put(' ');
35                 if(i->get_signature()==StringType::signature)
36                         out.write(format("\"%s\"", c_escape(i->get<StringType::Store>(), false)));
37                 else if(i->get_signature()==BoolType::signature)
38                         out.write(i->get<BoolType::Store>() ? "true" : "false");
39                 else if(i->get_signature()==IntType::signature)
40                         out.write(lexical_cast(i->get<IntType::Store>()));
41                 else if(i->get_signature()==FloatType::signature)
42                         out.write(format(float_format, i->get<FloatType::Store>()));
43                 else if(i->get_signature()==SymbolType::signature)
44                 {
45                         string name = i->get<SymbolType::Store>().name;
46                         if(isdigit(name[0]))
47                                 out.write("\\"+name);
48                         else
49                                 out.write(name);
50                 }
51         }
52         if(!st.sub.empty())
53         {
54                 out.write(format("\n%s{\n", indent));
55                 for(list<Statement>::const_iterator i = st.sub.begin(); i!=st.sub.end(); ++i)
56                         write_(*i, level+1);
57                 out.write(format("%s}", indent));
58         }
59         out.write(";\n");
60 }
61
62 } // namespace DataFile
63 } // namespace Msp