X-Git-Url: http://git.tdb.fi/?p=libs%2Fdatafile.git;a=blobdiff_plain;f=source%2Ftextwriter.cpp;h=c870ba0c20d7888f19725761924171c6b01662d9;hp=68111c0d3038c9b6b4b0f1f0a70df6b436d0c167;hb=cac0716e8c12088ba833cb28809f5a7b8430a68d;hpb=27630d44298cb67e075c166f4421288cc8ca117e diff --git a/source/textwriter.cpp b/source/textwriter.cpp index 68111c0..c870ba0 100644 --- a/source/textwriter.cpp +++ b/source/textwriter.cpp @@ -1,10 +1,6 @@ -/* $Id$ - -This file is part of libmspdatafile -Copyright © 2006 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - +#include +#include +#include "output.h" #include "statement.h" #include "textwriter.h" @@ -13,10 +9,16 @@ using namespace std; namespace Msp { namespace DataFile { -TextWriter::TextWriter(ostream &o): - WriterMode(o) +TextWriter::TextWriter(Output &o): + WriterMode(o), + float_format("%#.7g") { } +void TextWriter::set_float_precision(unsigned fp) +{ + float_format = format("%%#.%dg", fp/4-1); +} + void TextWriter::write(const Statement &st) { write_(st, 0); @@ -26,25 +28,35 @@ void TextWriter::write_(const Statement &st, unsigned level) { string indent(level, '\t'); - out<get_type()==STRING) - out<<'\"'<get_raw()<<'\"'; - else if(i->get_type()==BOOLEAN) - out<<(i->get() ? "true" : "false"); - else - out<get_raw(); + out.put(' '); + if(i->get_signature()==StringType::signature) + out.write(format("\"%s\"", c_escape(i->get(), false))); + else if(i->get_signature()==BoolType::signature) + out.write(i->get() ? "true" : "false"); + else if(i->get_signature()==IntType::signature) + out.write(lexical_cast(i->get())); + else if(i->get_signature()==FloatType::signature) + out.write(format(float_format, i->get())); + else if(i->get_signature()==SymbolType::signature) + { + string name = i->get().name; + if(isdigit(name[0])) + out.write("\\"+name); + else + out.write(name); + } } if(!st.sub.empty()) { - out<<'\n'<::const_iterator i=st.sub.begin(); i!=st.sub.end(); ++i) + out.write(format("\n%s{\n", indent)); + for(list::const_iterator i = st.sub.begin(); i!=st.sub.end(); ++i) write_(*i, level+1); - out<