X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Flisp%2Flisp.hpp;h=099e13b82baeec50e427dca8d4832031e24f4b19;hb=47c58b6b5d40807eee7bd37fa2fd5d2188a333fd;hp=fa4bda554c1cb12a63f9bc2ec5c79bd2adc4cb31;hpb=5b7f9214cb929399f1a855ef5807018a9447d510;p=supertux.git diff --git a/src/lisp/lisp.hpp b/src/lisp/lisp.hpp index fa4bda554..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,19 +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) @@ -61,6 +76,7 @@ public: val = v.integer; return true; } + bool get(int& val) const { if(type != TYPE_INTEGER) @@ -68,11 +84,18 @@ public: val = v.integer; return true; } + + int get_int() const + { + 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; @@ -80,6 +103,13 @@ public: val = v.real; return true; } + + float get_float() const + { + assert(type == TYPE_REAL); + return v.real; + } + bool get(bool& val) const { if(type != TYPE_BOOLEAN) @@ -88,13 +118,19 @@ public: return true; } - /** conveniance functions which traverse the list until a child with a + bool get_bool() const + { + assert(type == TYPE_BOOLEAN); + return v.boolean; + } + + /** 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 @@ -112,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()) @@ -128,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 @@ -148,8 +184,8 @@ private: { struct { - Lisp* car; - Lisp* cdr; + const Lisp* car; + const Lisp* cdr; } cons; char* string; @@ -162,4 +198,3 @@ private: } // end of namespace lisp #endif -