X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Flisp%2Fwriter.cpp;h=63c5aa78101eaaa75252d9436c742faae1f34ed6;hb=c01aff7fe4229fe6677993dca8a3b075e7752382;hp=e4a810af33a202a9b16563accba88045889677c0;hpb=c0093d25093395cb62fc2526ab42be65a9f015b8;p=supertux.git diff --git a/src/lisp/writer.cpp b/src/lisp/writer.cpp index e4a810af3..63c5aa781 100644 --- a/src/lisp/writer.cpp +++ b/src/lisp/writer.cpp @@ -1,12 +1,10 @@ -// $Id$ +// SuperTux +// Copyright (C) 2006 Matthias Braun // -// SuperTux - A Jump'n Run -// Copyright (C) 2004 Matthias Braun . -#include +#include "lisp/writer.hpp" -#include +#include "physfs/ofile_stream.hpp" +#include "util/log.hpp" -#include "writer.h" +namespace lisp { -namespace lisp +Writer::Writer(const std::string& filename) : + out(), + out_owned(), + indent_depth(), + lists() { + out = new OFileStream(filename); + out_owned = true; + indent_depth = 0; + out->precision(10); +} -Writer::Writer(std::ostream& newout) - : out(newout), indent_depth(0) +Writer::Writer(std::ostream* newout) : + out(), + out_owned(), + indent_depth(), + lists() { + out = newout; + out_owned = false; + indent_depth = 0; + out->precision(10); } Writer::~Writer() { if(lists.size() > 0) { - std::cerr << "Warning: Not all sections closed in lispwriter!\n"; + log_warning << "Not all sections closed in lispwriter" << std::endl; } + if(out_owned) + delete out; } void Writer::write_comment(const std::string& comment) { - out << "; " << comment << "\n"; + *out << "; " << comment << "\n"; } void -Writer::start_list(const std::string& listname) +Writer::start_list(const std::string& listname, bool string) { indent(); - out << '(' << listname << '\n'; + *out << '('; + if(string) + write_escaped_string(listname); + else + *out << listname; + *out << '\n'; indent_depth += 2; lists.push_back(listname); @@ -58,83 +79,126 @@ void Writer::end_list(const std::string& listname) { if(lists.size() == 0) { - std::cerr << "Trying to close list '" << listname - << "', which is not open.\n"; + log_warning << "Trying to close list '" << listname << "', which is not open" << std::endl; return; } if(lists.back() != listname) { - std::cerr << "Warning: trying to close list '" << listname - << "' while list '" << lists.back() << "' is open.\n"; + log_warning << "trying to close list '" << listname << "' while list '" << lists.back() << "' is open" << std::endl; return; } lists.pop_back(); - + indent_depth -= 2; indent(); - out << ")\n"; + *out << ")\n"; } void -Writer::write_int(const std::string& name, int value) +Writer::write(const std::string& name, int value) { indent(); - out << '(' << name << ' ' << value << ")\n"; + *out << '(' << name << ' ' << value << ")\n"; } void -Writer::write_float(const std::string& name, float value) +Writer::write(const std::string& name, float value) { indent(); - out << '(' << name << ' ' << value << ")\n"; + *out << '(' << name << ' ' << value << ")\n"; } void -Writer::write_string(const std::string& name, const std::string& value, - bool translatable) +Writer::write(const std::string& name, const std::string& value, + bool translatable) { indent(); - out << '(' << name; + *out << '(' << name; if(translatable) { - out << " (_ \"" << value << "\"))\n"; + *out << " (_ "; + write_escaped_string(value); + *out << "))\n"; } else { - out << " \"" << value << "\")\n"; + *out << " "; + write_escaped_string(value); + *out << ")\n"; } } void -Writer::write_bool(const std::string& name, bool value) +Writer::write(const std::string& name, bool value) { indent(); - out << '(' << name << ' ' << (value ? "#t" : "#f") << ")\n"; + *out << '(' << name << ' ' << (value ? "#t" : "#f") << ")\n"; } void -Writer::write_int_vector(const std::string& name, - const std::vector& value) +Writer::write(const std::string& name, + const std::vector& value) { indent(); - out << '(' << name; + *out << '(' << name; for(std::vector::const_iterator i = value.begin(); i != value.end(); ++i) - out << " " << *i; - out << ")\n"; + *out << " " << *i; + *out << ")\n"; } void -Writer::write_int_vector(const std::string& name, - const std::vector& value) +Writer::write(const std::string& name, + const std::vector& value) { indent(); - out << '(' << name; + *out << '(' << name; for(std::vector::const_iterator i = value.begin(); i != value.end(); ++i) - out << " " << *i; - out << ")\n"; + *out << " " << *i; + *out << ")\n"; +} + +void +Writer::write(const std::string& name, + const std::vector& value) +{ + indent(); + *out << '(' << name; + for(std::vector::const_iterator i = value.begin(); i != value.end(); ++i) + *out << " " << *i; + *out << ")\n"; +} + +void +Writer::write(const std::string& name, + const std::vector& value) +{ + indent(); + *out << '(' << name; + for(std::vector::const_iterator i = value.begin(); i != value.end(); ++i) { + *out << " "; + write_escaped_string(*i); + } + *out << ")\n"; +} + +void +Writer::write_escaped_string(const std::string& str) +{ + *out << '"'; + for(const char* c = str.c_str(); *c != 0; ++c) { + if(*c == '\"') + *out << "\\\""; + else if(*c == '\\') + *out << "\\\\"; + else + *out << *c; + } + *out << '"'; } void Writer::indent() { for(int i = 0; i