Now the growings animation looks pretty cool :)
[supertux.git] / src / lispreader.h
index 5dde3b1..3c3ba73 100644 (file)
@@ -28,6 +28,8 @@
 #include <zlib.h>
 #include <string>
 #include <vector>
+#include <exception>
+#include "exceptions.h"
 
 #define LISP_STREAM_FILE       1
 #define LISP_STREAM_STRING     2
 #define LISP_PATTERN_LIST       7
 #define LISP_PATTERN_OR         8
 
+// Exception
+class LispReaderException : public SuperTuxException
+{
+  public:
+    LispReaderException(const char* _message = "lispreader error", const char* _file = "", const unsigned int _line = 0)
+      : SuperTuxException(_message, _file, _line) { };
+};
+
 typedef struct
   {
     int type;
@@ -107,7 +117,6 @@ struct _lisp_object_t
       } v;
   };
 
-lisp_stream_t* lisp_stream_init_gzfile (lisp_stream_t *stream, gzFile file);
 lisp_stream_t* lisp_stream_init_file (lisp_stream_t *stream, FILE *file);
 lisp_stream_t* lisp_stream_init_string (lisp_stream_t *stream, char *buf);
 lisp_stream_t* lisp_stream_init_any (lisp_stream_t *stream, void *data,
@@ -115,7 +124,7 @@ lisp_stream_t* lisp_stream_init_any (lisp_stream_t *stream, void *data,
                                      void (*unget_char) (char c, void *data));
 
 lisp_object_t* lisp_read (lisp_stream_t *in);
-lisp_object_t* lisp_read_from_file(const char* filename);
+lisp_object_t* lisp_read_from_file(const std::string& filename);
 void lisp_free (lisp_object_t *obj);
 
 lisp_object_t* lisp_read_from_string (const char *buf);
@@ -160,43 +169,34 @@ void lisp_dump (lisp_object_t *obj, FILE *out);
 
 /** */
 class LispReader
-  {
-  private:
-    lisp_object_t* lst;
-
-    lisp_object_t* search_for(const char* name);
-  public:
-    /** cur == ((pos 1 2 3) (id 12 3 4)...) */
-    LispReader (lisp_object_t* l);
-
-    bool read_int_vector (const char* name, std::vector<int>* vec);
-    bool read_char_vector (const char* name, std::vector<char>* vec);
-    bool read_string (const char* name, std::string* str);
-    bool read_int (const char* name, int* i);
-    bool read_float (const char* name, float* f);
-    bool read_bool (const char* name, bool* b);
-  };
-
-/** */
-class LispWriter
-  {
-  private:
-    std::vector<lisp_object_t*> lisp_objs;
-
-    void append (lisp_object_t* obj);
-    lisp_object_t* make_list3 (lisp_object_t*, lisp_object_t*, lisp_object_t*);
-    lisp_object_t* make_list2 (lisp_object_t*, lisp_object_t*);
-  public:
-    LispWriter (const char* name);
-    void write_float (const char* name, float f);
-    void write_int (const char* name, int i);
-    void write_boolean (const char* name, bool b);
-    void write_string (const char* name, const char* str);
-    void write_symbol (const char* name, const char* symname);
-    void write_lisp_obj(const char* name, lisp_object_t* lst);
-
-    /** caller is responible to free the returned lisp_object_t */
-    lisp_object_t* create_lisp ();
-  };
+{
+private:
+  lisp_object_t* owner;
+  lisp_object_t* lst;
+
+  lisp_object_t* search_for(const char* name);
+  
+public:
+  /** cur == ((pos 1 2 3) (id 12 3 4)...) */
+  LispReader(lisp_object_t* l);
+  ~LispReader();
+
+  bool read_int_vector(const char* name, std::vector<int>& vec);
+  bool read_int_vector(const char* name, std::vector<unsigned int>& vec);
+  bool read_char_vector(const char* name, std::vector<char>& vec);
+  bool read_string_vector(const char* name, std::vector<std::string>& vec);
+  bool read_string(const char* name, std::string& str);
+  bool read_int(const char* name, int& i);
+  bool read_float(const char* name, float& f);
+  bool read_bool(const char* name, bool& b);
+  bool read_lisp(const char* name, lisp_object_t*& b);
+  LispReader* read_lisp(const char* name);
+
+  static LispReader* load(const std::string& filename,
+      const std::string& toplevellist);
+
+  lisp_object_t* get_lisp();
+};
 
 #endif
+