supertux is using physfs now, this simplifies the code and generalises file handling
[supertux.git] / src / lisp / writer.cpp
index e4a810a..ff70ce1 100644 (file)
 #include <iostream>
 
 #include "writer.h"
+#include "physfs/physfs_stream.h"
 
 namespace lisp
 {
 
-Writer::Writer(std::ostream& newout)
-  : out(newout), indent_depth(0)
+Writer::Writer(const std::string& filename)
 {
+  out = new OFileStream(filename);
+  out_owned = true;
+  indent_depth = 0;
+}
+  
+Writer::Writer(std::ostream* newout)
+{
+  out = newout;
+  out_owned = false;
+  indent_depth = 0;
 }
 
 Writer::~Writer()
@@ -36,19 +46,21 @@ Writer::~Writer()
   if(lists.size() > 0) {
     std::cerr << "Warning: Not all sections closed in lispwriter!\n";
   }
+  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)
 {
   indent();
-  out << '(' << listname << '\n';
+  *out << '(' << listname << '\n';
   indent_depth += 2;
 
   lists.push_back(listname);
@@ -71,21 +83,21 @@ Writer::end_list(const std::string& listname)
   
   indent_depth -= 2;
   indent();
-  out << ")\n";
+  *out << ")\n";
 }
 
 void
 Writer::write_int(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)
 {
   indent();
-  out << '(' << name << ' ' << value << ")\n";
+  *out << '(' << name << ' ' << value << ")\n";
 }
 
 void
@@ -93,11 +105,11 @@ Writer::write_string(const std::string& name, const std::string& value,
     bool translatable)
 {
   indent();
-  out << '(' << name;
+  *out << '(' << name;
   if(translatable) {
-    out << " (_ \"" << value << "\"))\n";
+    *out << " (_ \"" << value << "\"))\n";
   } else {
-    out << " \"" << value << "\")\n";
+    *out << " \"" << value << "\")\n";
   }
 }
 
@@ -105,7 +117,7 @@ void
 Writer::write_bool(const std::string& name, bool value)
 {
   indent();
-  out << '(' << name << ' ' << (value ? "#t" : "#f") << ")\n";
+  *out << '(' << name << ' ' << (value ? "#t" : "#f") << ")\n";
 }
 
 void
@@ -113,10 +125,10 @@ Writer::write_int_vector(const std::string& name,
     const std::vector<int>& value)
 {
   indent();
-  out << '(' << name;
+  *out << '(' << name;
   for(std::vector<int>::const_iterator i = value.begin(); i != value.end(); ++i)
-    out << " " << *i;
-  out << ")\n";
+    *out << " " << *i;
+  *out << ")\n";
 }
 
 void
@@ -124,17 +136,17 @@ Writer::write_int_vector(const std::string& name,
     const std::vector<unsigned int>& value)
 {
   indent();
-  out << '(' << name;
+  *out << '(' << name;
   for(std::vector<unsigned int>::const_iterator i = value.begin(); i != value.end(); ++i)
-    out << " " << *i;
-  out << ")\n";
+    *out << " " << *i;
+  *out << ")\n";
 }
 
 void
 Writer::indent()
 {
   for(int i = 0; i<indent_depth; ++i)
-    out << ' ';
+    *out << ' ';
 }
 
 } // end of namespace lisp