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