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