void ConsoleImpl::execute(const std::string& str_) { std::string str = str_; //"return (" + str_ + ")"; int i = str.length(); const char* buffer = str.c_str(); HSQUIRRELVM vm = script_manager->get_vm(); int oldtop=sq_gettop(vm); try { int retval = 1; if(i>0){ if(SQ_SUCCEEDED(sq_compilebuffer(vm,buffer,i,_SC("interactive console"),SQTrue))){ sq_pushroottable(vm); if(SQ_SUCCEEDED(sq_call(vm,1, retval, true))) { if (sq_gettype(vm, -1) != OT_NULL) console << squirrel2string(vm, -1) << std::endl; } } } } catch(std::exception& e) { std::cerr << "Couldn't execute command '" << str_ << "': " << e.what() << "\n"; } sq_settop(vm,oldtop); }
SQInteger println(HSQUIRRELVM v) { ConsoleLog << squirrel2string(v, -1) << std::endl; sq_pop(v, 1); return 0; }
SQInteger display(HSQUIRRELVM v) { ConsoleLog << squirrel2string(v, -1); sq_pop(v, 1); return 0; }
void ConsoleImpl::eval_command_line() { if (!command_line.empty() && (history.empty() || history.back() != command_line)) { history.push_back(command_line); history_position = history.size(); } console << ">" << command_line << std::endl; if (command_line == "quit" || command_line == "exit") { console.deactive(); } else if (command_line == "help") { console << "This is a script console, can enter stuff in here that will then be evaluated.\n" << "Type 'quit' to exit the console." << std::endl; } else if (command_line == "reset") { GameSession::current()->set_sector("levels/newformat2.wst"); } else if (command_line == "show") { HSQUIRRELVM v = script_manager->get_vm(); int size = sq_getsize(v, -1); console << size << " elements on the root table" << std::endl; sq_pushroottable(v); //push your table/array here sq_pushnull(v); //null iterator while(SQ_SUCCEEDED(sq_next(v,-2))) { //here -1 is the value and -2 is the key const SQChar *s; if (SQ_SUCCEEDED(sq_getstring(v,-2, &s))) { console << s << " -> " << squirrel2string(v, -1) << std::endl; } else { console << "Unknown key type for element" << std::endl; } sq_pop(v,2); //pops key and val before the nex iteration } sq_pop(v, 1); } else { execute(command_line); maybe_newline(); } command_line = ""; cursor_pos = 0; }
std::string squirrel2string(HSQUIRRELVM v, SQInteger i) { std::ostringstream os; switch(sq_gettype(v, i)) { case OT_NULL: os << "<null>"; break; case OT_BOOL: { SQBool p; if (SQ_SUCCEEDED(sq_getbool(v, i, &p))) { if (p) os << "true"; else os << "false"; } break; } case OT_INTEGER: { SQInteger val; sq_getinteger(v, i, &val); os << val; break; } case OT_FLOAT: { SQFloat val; sq_getfloat(v, i, &val); os << val; break; } case OT_STRING: { const SQChar* val; sq_getstring(v, i, &val); os << "\"" << val << "\""; break; } case OT_TABLE: { bool first = true; os << "{"; sq_pushnull(v); //null iterator while(SQ_SUCCEEDED(sq_next(v,i-1))) { if (!first) { os << ", "; } first = false; //here -1 is the value and -2 is the key os << squirrel2string(v, -2) << " => " << squirrel2string(v, -1); sq_pop(v,2); //pops key and val before the nex iteration } sq_pop(v, 1); os << "}"; break; } case OT_ARRAY: { bool first = true; os << "["; sq_pushnull(v); //null iterator while(SQ_SUCCEEDED(sq_next(v,i-1))) { if (!first) { os << ", "; } first = false; //here -1 is the value and -2 is the key // we ignore the key, since that is just the index in an array os << squirrel2string(v, -1); sq_pop(v,2); //pops key and val before the nex iteration } sq_pop(v, 1); os << "]"; break; } case OT_USERDATA: os << "<userdata>"; break; case OT_CLOSURE: os << "<closure>"; break; case OT_NATIVECLOSURE: os << "<native closure>"; break; case OT_GENERATOR: os << "<generator>"; break; case OT_USERPOINTER: os << "userpointer"; break; case OT_THREAD: os << "<thread>"; break; case OT_CLASS: os << "<class>"; break; case OT_INSTANCE: os << "<instance>"; break; case OT_WEAKREF: os << "<weakref>"; break; default: os << "<unknown>"; break; } return os.str(); }