- fixed some crashes where there was an invalid tile number
[supertux.git] / src / lispwriter.cpp
1 //  $Id$
2 //
3 //  SuperTux -  A Jump'n Run
4 //  Copyright (C) 2004 Matthias Braun <matze@braunis.de
5 //
6 //  This program is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU General Public License
8 //  as published by the Free Software Foundation; either version 2
9 //  of the License, or (at your option) any later version.
10 //
11 //  This program is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 //  GNU General Public License for more details.
15 //
16 //  You should have received a copy of the GNU General Public License
17 //  along with this program; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 #include "lispwriter.h"
20 #include <iostream>
21
22 LispWriter::LispWriter(std::ostream& newout)
23   : out(newout), indent_depth(0)
24 {
25 }
26
27 LispWriter::~LispWriter()
28 {
29   if(lists.size() > 0) {
30     std::cerr << "Warning: Not all sections closed in lispwriter!\n";
31   }
32 }
33
34 void
35 LispWriter::write_comment(const std::string& comment)
36 {
37   out << "; " << comment << "\n";
38 }
39
40 void
41 LispWriter::start_list(const std::string& listname)
42 {
43   indent();
44   out << '(' << listname << '\n';
45   indent_depth += 2;
46
47   lists.push_back(listname);
48 }
49
50 void
51 LispWriter::end_list(const std::string& listname)
52 {
53   if(lists.size() == 0) {
54     std::cerr << "Trying to close list '" << listname 
55               << "', which is not open.\n";
56     return;
57   }
58   if(lists.back() != listname) {
59     std::cerr << "Warning: trying to close list '" << listname 
60               << "' while list '" << lists.back() << "' is open.\n";
61     return;
62   }
63   lists.pop_back();
64   
65   indent_depth -= 2;
66   indent();
67   out << ")\n";
68 }
69
70 void
71 LispWriter::write_int(const std::string& name, int value)
72 {
73   indent();
74   out << '(' << name << ' ' << value << ")\n";
75 }
76
77 void
78 LispWriter::write_float(const std::string& name, float value)
79 {
80   indent();
81   out << '(' << name << ' ' << value << ")\n";
82 }
83
84 void
85 LispWriter::write_string(const std::string& name, const std::string& value)
86 {
87   indent();
88   out << '(' << name << " \"" << value << "\")\n";
89 }
90
91 void
92 LispWriter::write_bool(const std::string& name, bool value)
93 {
94   indent();
95   out << '(' << name << ' ' << (value ? "#t" : "#f") << ")\n";
96 }
97
98 void
99 LispWriter::write_int_vector(const std::string& name,
100     const std::vector<int>& value)
101 {
102   indent();
103   out << '(' << name;
104   for(std::vector<int>::const_iterator i = value.begin(); i != value.end(); ++i)
105     out << " " << *i;
106   out << ")\n";
107 }
108
109 void
110 LispWriter::write_int_vector(const std::string& name,
111     const std::vector<unsigned int>& value)
112 {
113   indent();
114   out << '(' << name;
115   for(std::vector<unsigned int>::const_iterator i = value.begin(); i != value.end(); ++i)
116     out << " " << *i;
117   out << ")\n";
118 }
119
120 void
121 LispWriter::indent()
122 {
123   for(int i = 0; i<indent_depth; ++i)
124     out << ' ';
125 }
126