new level-format, many changes to level-related stuff
[supertux.git] / src / lispreader.h
1 /* $Id$ */
2 /*
3  * lispreader.h
4  *
5  * Copyright (C) 1998-2000 Mark Probst
6  * Copyright (C) 2002 Ingo Ruhnke <grumbel@gmx.de>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public
19  * License along with this library; if not, write to the
20  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23
24 #ifndef __LISPREADER_H__
25 #define __LISPREADER_H__
26
27 #include <stdio.h>
28 #include <string>
29 #include <vector>
30
31 #define LISP_STREAM_FILE       1
32 #define LISP_STREAM_STRING     2
33 #define LISP_STREAM_ANY        3
34
35 #define LISP_TYPE_INTERNAL      -3
36 #define LISP_TYPE_PARSE_ERROR   -2
37 #define LISP_TYPE_EOF           -1
38 #define LISP_TYPE_NIL           0
39 #define LISP_TYPE_SYMBOL        1
40 #define LISP_TYPE_INTEGER       2
41 #define LISP_TYPE_STRING        3
42 #define LISP_TYPE_REAL          4
43 #define LISP_TYPE_CONS          5
44 #define LISP_TYPE_PATTERN_CONS  6
45 #define LISP_TYPE_BOOLEAN       7
46 #define LISP_TYPE_PATTERN_VAR   8
47
48 #define LISP_PATTERN_ANY        1
49 #define LISP_PATTERN_SYMBOL     2
50 #define LISP_PATTERN_STRING     3
51 #define LISP_PATTERN_INTEGER    4
52 #define LISP_PATTERN_REAL       5
53 #define LISP_PATTERN_BOOLEAN    6
54 #define LISP_PATTERN_LIST       7
55 #define LISP_PATTERN_OR         8
56
57 typedef struct
58   {
59     int type;
60
61     union
62       {
63         FILE *file;
64         struct
65           {
66             char *buf;
67             int pos;
68           }
69         string;
70         struct
71           {
72             void *data;
73             int (*next_char) (void *data);
74             void (*unget_char) (char c, void *data);
75           }
76         any;
77       } v;
78   }
79 lisp_stream_t;
80
81 typedef struct _lisp_object_t lisp_object_t;
82 struct _lisp_object_t
83   {
84     int type;
85
86     union
87       {
88         struct
89           {
90             struct _lisp_object_t *car;
91             struct _lisp_object_t *cdr;
92           }
93         cons;
94
95         char *string;
96         int integer;
97         float real;
98
99         struct
100           {
101             int type;
102             int index;
103             struct _lisp_object_t *sub;
104           }
105         pattern;
106       } v;
107   };
108
109 lisp_stream_t* lisp_stream_init_file (lisp_stream_t *stream, FILE *file);
110 lisp_stream_t* lisp_stream_init_string (lisp_stream_t *stream, char *buf);
111 lisp_stream_t* lisp_stream_init_any (lisp_stream_t *stream, void *data,
112                                      int (*next_char) (void *data),
113                                      void (*unget_char) (char c, void *data));
114
115 lisp_object_t* lisp_read (lisp_stream_t *in);
116 void lisp_free (lisp_object_t *obj);
117
118 lisp_object_t* lisp_read_from_string (const char *buf);
119
120 int lisp_compile_pattern (lisp_object_t **obj, int *num_subs);
121 int lisp_match_pattern (lisp_object_t *pattern, lisp_object_t *obj, lisp_object_t **vars, int num_subs);
122 int lisp_match_string (const char *pattern_string, lisp_object_t *obj, lisp_object_t **vars);
123
124 int lisp_type (lisp_object_t *obj);
125 int lisp_integer (lisp_object_t *obj);
126 float lisp_real (lisp_object_t *obj);
127 char* lisp_symbol (lisp_object_t *obj);
128 char* lisp_string (lisp_object_t *obj);
129 int lisp_boolean (lisp_object_t *obj);
130 lisp_object_t* lisp_car (lisp_object_t *obj);
131 lisp_object_t* lisp_cdr (lisp_object_t *obj);
132
133 lisp_object_t* lisp_cxr (lisp_object_t *obj, const char *x);
134
135 lisp_object_t* lisp_make_integer (int value);
136 lisp_object_t* lisp_make_real (float value);
137 lisp_object_t* lisp_make_symbol (const char *value);
138 lisp_object_t* lisp_make_string (const char *value);
139 lisp_object_t* lisp_make_cons (lisp_object_t *car, lisp_object_t *cdr);
140 lisp_object_t* lisp_make_boolean (int value);
141
142 int lisp_list_length (lisp_object_t *obj);
143 lisp_object_t* lisp_list_nth_cdr (lisp_object_t *obj, int index);
144 lisp_object_t* lisp_list_nth (lisp_object_t *obj, int index);
145
146 void lisp_dump (lisp_object_t *obj, FILE *out);
147
148 #define lisp_nil()           ((lisp_object_t*)0)
149
150 #define lisp_nil_p(obj)      (obj == 0)
151 #define lisp_integer_p(obj)  (lisp_type((obj)) == LISP_TYPE_INTEGER)
152 #define lisp_real_p(obj)     (lisp_type((obj)) == LISP_TYPE_REAL)
153 #define lisp_symbol_p(obj)   (lisp_type((obj)) == LISP_TYPE_SYMBOL)
154 #define lisp_string_p(obj)   (lisp_type((obj)) == LISP_TYPE_STRING)
155 #define lisp_cons_p(obj)     (lisp_type((obj)) == LISP_TYPE_CONS)
156 #define lisp_boolean_p(obj)  (lisp_type((obj)) == LISP_TYPE_BOOLEAN)
157
158 /** */
159 class LispReader
160   {
161   private:
162     lisp_object_t* lst;
163
164     lisp_object_t* search_for(const char* name);
165   public:
166     /** cur == ((pos 1 2 3) (id 12 3 4)...) */
167     LispReader (lisp_object_t* l);
168
169     bool read_int_vector (const char* name, std::vector<int>* vec);
170     bool read_char_vector (const char* name, std::vector<char>* vec);
171     bool read_string (const char* name, std::string* str);
172     bool read_int (const char* name, int* i);
173     bool read_float (const char* name, float* f);
174     bool read_bool (const char* name, bool* b);
175   };
176
177 /** */
178 class LispWriter
179   {
180   private:
181     std::vector<lisp_object_t*> lisp_objs;
182
183     void append (lisp_object_t* obj);
184     lisp_object_t* make_list3 (lisp_object_t*, lisp_object_t*, lisp_object_t*);
185     lisp_object_t* make_list2 (lisp_object_t*, lisp_object_t*);
186   public:
187     LispWriter (const char* name);
188     void write_float (const char* name, float f);
189     void write_int (const char* name, int i);
190     void write_boolean (const char* name, bool b);
191     void write_string (const char* name, const char* str);
192     void write_symbol (const char* name, const char* symname);
193     void write_lisp_obj(const char* name, lisp_object_t* lst);
194
195     /** caller is responible to free the returned lisp_object_t */
196     lisp_object_t* create_lisp ();
197   };
198
199 #endif