fix cr/lfs and remove trailing whitespaces...
[supertux.git] / src / lisp / writer.cpp
index 8b5bc18..5792c47 100644 (file)
@@ -1,7 +1,7 @@
 //  $Id$
 //
-//  SuperTux -  A Jump'n Run
-//  Copyright (C) 2004 Matthias Braun <matze@braunis.de
+//  SuperTux
+//  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
 //
 //  This program is free software; you can redistribute it and/or
 //  modify it under the terms of the GNU General Public License
@@ -23,7 +23,7 @@
 
 #include "writer.hpp"
 #include "physfs/physfs_stream.hpp"
-#include "msg.hpp"
+#include "log.hpp"
 
 namespace lisp
 {
@@ -34,7 +34,7 @@ Writer::Writer(const std::string& filename)
   out_owned = true;
   indent_depth = 0;
 }
-  
+
 Writer::Writer(std::ostream* newout)
 {
   out = newout;
@@ -45,7 +45,7 @@ Writer::Writer(std::ostream* newout)
 Writer::~Writer()
 {
   if(lists.size() > 0) {
-    msg_warning << "Not all sections closed in lispwriter" << std::endl;
+    log_warning << "Not all sections closed in lispwriter" << std::endl;
   }
   if(out_owned)
     delete out;
@@ -58,10 +58,15 @@ Writer::write_comment(const std::string& comment)
 }
 
 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);
@@ -71,15 +76,15 @@ void
 Writer::end_list(const std::string& listname)
 {
   if(lists.size() == 0) {
-    msg_warning << "Trying to close list '" << listname << "', which is not open" << std::endl;
+    log_warning << "Trying to close list '" << listname << "', which is not open" << std::endl;
     return;
   }
   if(lists.back() != listname) {
-    msg_warning << "trying to close list '" << listname << "' while list '" << lists.back() << "' is open" << std::endl;
+    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";
@@ -106,9 +111,13 @@ Writer::write_string(const std::string& name, const std::string& value,
   indent();
   *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";
   }
 }
 
@@ -153,6 +162,21 @@ Writer::write_float_vector(const std::string& name,
 }
 
 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<indent_depth; ++i)