forgot some files
[supertux.git] / src / scripting / serialize.cpp
1 #include "serialize.hpp"
2
3 #include <memory>
4 #include <assert.h>
5 #include "lisp/lisp.hpp"
6 #include "lisp/list_iterator.hpp"
7 #include "lisp/parser.hpp"
8 #include "lisp/writer.hpp"
9
10 namespace Scripting
11 {
12
13 void load_squirrel_table(HSQUIRRELVM v, int table_idx, const lisp::Lisp* lisp)
14 {
15   using namespace lisp;
16  
17   lisp::ListIterator iter(lisp);
18   while(iter.next()) {
19     const std::string& token = iter.item();
20     sq_pushstring(v, token.c_str(), token.size());
21
22     const lisp::Lisp* value = iter.value();
23     switch(value->get_type()) {
24       case Lisp::TYPE_CONS:
25         sq_newtable(v);
26         //load_squirrel_table(v, sq_gettop(v), *iter);
27         break;
28       case Lisp::TYPE_INTEGER:
29         sq_pushinteger(v, value->get_int());
30         break;
31       case Lisp::TYPE_REAL:
32         sq_pushfloat(v, value->get_float());
33         break;
34       case Lisp::TYPE_STRING:
35         sq_pushstring(v, value->get_string().c_str(), -1);
36         break;
37       case Lisp::TYPE_BOOLEAN:
38         sq_pushbool(v, value->get_bool());
39         break;
40       case Lisp::TYPE_SYMBOL:
41         std::cerr << "Unexpected symbol in lisp file...";
42         sq_pushnull(v);
43         break;
44       default:
45         assert(false);
46         break;
47     }
48     if(table_idx < 0) {
49       sq_createslot(v, table_idx - 2);
50     } else {
51       sq_createslot(v, table_idx);
52     }
53   }
54 }
55
56 void save_squirrel_table(HSQUIRRELVM v, int table_idx, lisp::Writer& writer)
57 {
58   // offset because of sq_pushnull
59   if(table_idx < 0)
60     table_idx--;
61   
62   //iterator table
63   sq_pushnull(v);
64   while(SQ_SUCCEEDED(sq_next(v, table_idx))) {
65     if(sq_gettype(v, -2) != OT_STRING) {
66       std::cerr << "Table contains non-string key\n";
67       continue;
68     }
69     const char* key;
70     sq_getstring(v, -2, &key);
71
72     switch(sq_gettype(v, -1)) {
73       case OT_INTEGER: {
74         int val;
75         sq_getinteger(v, -1, &val);
76         writer.write_int(key, val);
77         break;
78       }
79       case OT_FLOAT: {
80         float val;
81         sq_getfloat(v, -1, &val);
82         writer.write_float(key, val);
83         break;
84       }
85       case OT_BOOL: {
86         SQBool val;
87         sq_getbool(v, -1, &val);
88         writer.write_bool(key, val);
89         break;
90       }
91       case OT_STRING: {
92         const char* str;
93         sq_getstring(v, -1, &str);
94         writer.write_string(key, str);
95         break;
96       }
97       case OT_TABLE: {
98         writer.start_list(key);
99         save_squirrel_table(v, -1, writer);
100         writer.end_list(key);
101         break;
102       }
103       case OT_CLOSURE:
104         break; // ignore
105       case OT_NATIVECLOSURE:
106         break;
107       default:
108         std::cerr << "Can't serialize key '" << key << "' in table.\n";
109         break;
110     }
111     sq_pop(v, 2);
112   }
113   sq_pop(v, 1);
114 }
115
116 }
117