X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Flisp%2Flisp.hpp;h=099e13b82baeec50e427dca8d4832031e24f4b19;hb=47c58b6b5d40807eee7bd37fa2fd5d2188a333fd;hp=fb8dd88128d89b526b4d36425a63fd50c56d194a;hpb=1486ceaaf9dd7a9d2d7e3654550b9a2768df2a56;p=supertux.git diff --git a/src/lisp/lisp.hpp b/src/lisp/lisp.hpp index fb8dd8812..099e13b82 100644 --- a/src/lisp/lisp.hpp +++ b/src/lisp/lisp.hpp @@ -1,8 +1,7 @@ // $Id$ // -// TuxKart - a fun racing game with go-kart -// Copyright (C) 2004 Matthias Braun -// code in this file based on lispreader from Mark Probst +// SuperTux +// Copyright (C) 2006 Matthias Braun // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -17,11 +16,13 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + #ifndef __LISPREADER_H__ #define __LISPREADER_H__ #include #include +#include namespace lisp { @@ -30,7 +31,7 @@ class Lisp { public: ~Lisp(); - + enum LispType { TYPE_CONS, TYPE_SYMBOL, @@ -41,27 +42,33 @@ public: }; LispType get_type() const - { return type; } + { return type; } - Lisp* get_car() const + const Lisp* get_car() const { return v.cons.car; } - Lisp* get_cdr() const + const Lisp* get_cdr() const { return v.cons.cdr; } - + bool get(std::string& val) const - { + { if(type != TYPE_STRING && type != TYPE_SYMBOL) return false; val = v.string; return true; } - + + std::string get_symbol() const + { + assert(type == TYPE_SYMBOL); + return v.string; + } + std::string get_string() const { assert(type == TYPE_STRING); return v.string; } - + bool get(unsigned int& val) const { if(type != TYPE_INTEGER) @@ -69,7 +76,7 @@ public: val = v.integer; return true; } - + bool get(int& val) const { if(type != TYPE_INTEGER) @@ -83,12 +90,12 @@ public: assert(type == TYPE_INTEGER); return v.integer; } - + bool get(float& val) const { if(type != TYPE_REAL) { if(type == TYPE_INTEGER) { - val = v.integer; + val = (float) v.integer; return true; } return false; @@ -117,13 +124,13 @@ public: return v.boolean; } - /** conveniance functions which traverse the list until a child with a + /** convenience functions which traverse the list until a child with a * specified name is found. The value part is then interpreted in a specific * way. The functions return true, if a child was found and could be * interpreted correctly, otherwise false is returned and the variable value * is not changed. * (Please note that searching the lisp structure is O(n) so these functions - * are no good idea for performance critical areas) + * are not a good idea for performance critical areas) */ template bool get(const char* name, T& val) const @@ -141,14 +148,14 @@ public: } template - bool get_vector(const char* name, std::vector& vec) const + bool get(const char* name, std::vector& vec) const { vec.clear(); - + const Lisp* child = get_lisp(name); if(!child) return false; - + for( ; child != 0; child = child->get_cdr()) { T val; if(!child->get_car()) @@ -157,12 +164,12 @@ public: vec.push_back(val); } } - + return true; } - - Lisp* get_lisp(const char* name) const; - Lisp* get_lisp(const std::string& name) const + + const Lisp* get_lisp(const char* name) const; + const Lisp* get_lisp(const std::string& name) const { return get_lisp(name.c_str()); } // for debugging @@ -177,8 +184,8 @@ private: { struct { - Lisp* car; - Lisp* cdr; + const Lisp* car; + const Lisp* cdr; } cons; char* string; @@ -191,4 +198,3 @@ private: } // end of namespace lisp #endif -