1 #include "serialize.hpp"
5 #include "lisp/lisp.hpp"
6 #include "lisp/list_iterator.hpp"
7 #include "lisp/parser.hpp"
8 #include "lisp/writer.hpp"
13 void load_squirrel_table(HSQUIRRELVM v, int table_idx, const lisp::Lisp* lisp)
17 lisp::ListIterator iter(lisp);
19 const std::string& token = iter.item();
20 sq_pushstring(v, token.c_str(), token.size());
22 const lisp::Lisp* value = iter.value();
23 switch(value->get_type()) {
26 //load_squirrel_table(v, sq_gettop(v), *iter);
28 case Lisp::TYPE_INTEGER:
29 sq_pushinteger(v, value->get_int());
32 sq_pushfloat(v, value->get_float());
34 case Lisp::TYPE_STRING:
35 sq_pushstring(v, value->get_string().c_str(), -1);
37 case Lisp::TYPE_BOOLEAN:
38 sq_pushbool(v, value->get_bool());
40 case Lisp::TYPE_SYMBOL:
41 std::cerr << "Unexpected symbol in lisp file...";
49 sq_createslot(v, table_idx - 2);
51 sq_createslot(v, table_idx);
56 void save_squirrel_table(HSQUIRRELVM v, int table_idx, lisp::Writer& writer)
58 // offset because of sq_pushnull
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";
70 sq_getstring(v, -2, &key);
72 switch(sq_gettype(v, -1)) {
75 sq_getinteger(v, -1, &val);
76 writer.write_int(key, val);
81 sq_getfloat(v, -1, &val);
82 writer.write_float(key, val);
87 sq_getbool(v, -1, &val);
88 writer.write_bool(key, val);
93 sq_getstring(v, -1, &str);
94 writer.write_string(key, str);
98 writer.start_list(key);
99 save_squirrel_table(v, -1, writer);
100 writer.end_list(key);
105 case OT_NATIVECLOSURE:
108 std::cerr << "Can't serialize key '" << key << "' in table.\n";