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"
9 #include "squirrel_error.hpp"
14 void load_squirrel_table(HSQUIRRELVM vm, int table_idx, const lisp::Lisp* lisp)
21 lisp::ListIterator iter(lisp);
23 const std::string& token = iter.item();
24 sq_pushstring(vm, token.c_str(), token.size());
26 const lisp::Lisp* value = iter.value();
27 switch(value->get_type()) {
30 load_squirrel_table(vm, sq_gettop(vm), iter.lisp());
32 case Lisp::TYPE_INTEGER:
33 sq_pushinteger(vm, value->get_int());
36 sq_pushfloat(vm, value->get_float());
38 case Lisp::TYPE_STRING:
39 sq_pushstring(vm, value->get_string().c_str(), -1);
41 case Lisp::TYPE_BOOLEAN:
42 sq_pushbool(vm, value->get_bool() ? SQTrue : SQFalse);
44 case Lisp::TYPE_SYMBOL:
45 std::cerr << "Unexpected symbol in lisp file...";
53 if(SQ_FAILED(sq_createslot(vm, table_idx)))
54 throw Scripting::SquirrelError(vm, "Couldn't create new index");
58 void save_squirrel_table(HSQUIRRELVM vm, int table_idx, lisp::Writer& writer)
60 // offset because of sq_pushnull
66 while(SQ_SUCCEEDED(sq_next(vm, table_idx))) {
67 if(sq_gettype(vm, -2) != OT_STRING) {
68 std::cerr << "Table contains non-string key\n";
72 sq_getstring(vm, -2, &key);
74 switch(sq_gettype(vm, -1)) {
77 sq_getinteger(vm, -1, &val);
78 writer.write_int(key, val);
83 sq_getfloat(vm, -1, &val);
84 writer.write_float(key, val);
89 sq_getbool(vm, -1, &val);
90 writer.write_bool(key, val);
95 sq_getstring(vm, -1, &str);
96 writer.write_string(key, str);
100 writer.start_list(key, true);
101 save_squirrel_table(vm, -1, writer);
102 writer.end_list(key);
107 case OT_NATIVECLOSURE:
110 std::cerr << "Can't serialize key '" << key << "' in table.\n";