-Started to move stuff from library back to main game
[supertux.git] / src / lisp / writer.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
20 #include <config.h>
21
22 #include <iostream>
23
24 #include "writer.h"
25
26 namespace lisp
27 {
28
29 Writer::Writer(std::ostream& newout)
30   : out(newout), indent_depth(0)
31 {
32 }
33
34 Writer::~Writer()
35 {
36   if(lists.size() > 0) {
37     std::cerr << "Warning: Not all sections closed in lispwriter!\n";
38   }
39 }
40
41 void
42 Writer::write_comment(const std::string& comment)
43 {
44   out << "; " << comment << "\n";
45 }
46
47 void
48 Writer::start_list(const std::string& listname)
49 {
50   indent();
51   out << '(' << listname << '\n';
52   indent_depth += 2;
53
54   lists.push_back(listname);
55 }
56
57 void
58 Writer::end_list(const std::string& listname)
59 {
60   if(lists.size() == 0) {
61     std::cerr << "Trying to close list '" << listname 
62               << "', which is not open.\n";
63     return;
64   }
65   if(lists.back() != listname) {
66     std::cerr << "Warning: trying to close list '" << listname 
67               << "' while list '" << lists.back() << "' is open.\n";
68     return;
69   }
70   lists.pop_back();
71   
72   indent_depth -= 2;
73   indent();
74   out << ")\n";
75 }
76
77 void
78 Writer::write_int(const std::string& name, int value)
79 {
80   indent();
81   out << '(' << name << ' ' << value << ")\n";
82 }
83
84 void
85 Writer::write_float(const std::string& name, float value)
86 {
87   indent();
88   out << '(' << name << ' ' << value << ")\n";
89 }
90
91 void
92 Writer::write_string(const std::string& name, const std::string& value,
93     bool translatable)
94 {
95   indent();
96   out << '(' << name;
97   if(translatable) {
98     out << " (_ \"" << value << "\"))\n";
99   } else {
100     out << " \"" << value << "\")\n";
101   }
102 }
103
104 void
105 Writer::write_bool(const std::string& name, bool value)
106 {
107   indent();
108   out << '(' << name << ' ' << (value ? "#t" : "#f") << ")\n";
109 }
110
111 void
112 Writer::write_int_vector(const std::string& name,
113     const std::vector<int>& value)
114 {
115   indent();
116   out << '(' << name;
117   for(std::vector<int>::const_iterator i = value.begin(); i != value.end(); ++i)
118     out << " " << *i;
119   out << ")\n";
120 }
121
122 void
123 Writer::write_int_vector(const std::string& name,
124     const std::vector<unsigned int>& value)
125 {
126   indent();
127   out << '(' << name;
128   for(std::vector<unsigned int>::const_iterator i = value.begin(); i != value.end(); ++i)
129     out << " " << *i;
130   out << ")\n";
131 }
132
133 void
134 Writer::indent()
135 {
136   for(int i = 0; i<indent_depth; ++i)
137     out << ' ';
138 }
139
140 } // end of namespace lisp