commit
e95e8e26bf
@ -664,12 +664,32 @@ void luacon_hook(lua_State * l, lua_Debug * ar)
|
||||
}
|
||||
}
|
||||
|
||||
char *luacon_geterror(){
|
||||
char *error = (char*)lua_tostring(luacon_ci->l, -1);
|
||||
if(error==NULL || !error[0]){
|
||||
error = "failed to execute";
|
||||
int luaL_tostring (lua_State *L, int n) {
|
||||
luaL_checkany(L, n);
|
||||
switch (lua_type(L, n)) {
|
||||
case LUA_TNUMBER:
|
||||
lua_pushstring(L, lua_tostring(L, n));
|
||||
break;
|
||||
case LUA_TSTRING:
|
||||
lua_pushvalue(L, n);
|
||||
break;
|
||||
case LUA_TBOOLEAN:
|
||||
lua_pushstring(L, (lua_toboolean(L, n) ? "true" : "false"));
|
||||
break;
|
||||
case LUA_TNIL:
|
||||
lua_pushliteral(L, "nil");
|
||||
break;
|
||||
default:
|
||||
lua_pushfstring(L, "%s: %p", luaL_typename(L, n), lua_topointer(L, n));
|
||||
break;
|
||||
}
|
||||
return error;
|
||||
return 1;
|
||||
}
|
||||
char *luacon_geterror(){
|
||||
luaL_tostring(luacon_ci->l, -1);
|
||||
char* err = (char*)luaL_optstring(luacon_ci->l, -1, "failed to execute");
|
||||
lua_pop(luacon_ci->l, 1);
|
||||
return err;
|
||||
}
|
||||
/*void luacon_close(){
|
||||
lua_close(l);
|
||||
@ -923,27 +943,6 @@ int luatpt_setconsole(lua_State* l)
|
||||
luacon_controller->HideConsole();
|
||||
return 0;
|
||||
}
|
||||
static int luaL_tostring (lua_State *L, int n) {
|
||||
luaL_checkany(L, n);
|
||||
switch (lua_type(L, n)) {
|
||||
case LUA_TNUMBER:
|
||||
lua_pushstring(L, lua_tostring(L, n));
|
||||
break;
|
||||
case LUA_TSTRING:
|
||||
lua_pushvalue(L, n);
|
||||
break;
|
||||
case LUA_TBOOLEAN:
|
||||
lua_pushstring(L, (lua_toboolean(L, n) ? "true" : "false"));
|
||||
break;
|
||||
case LUA_TNIL:
|
||||
lua_pushliteral(L, "nil");
|
||||
break;
|
||||
default:
|
||||
lua_pushfstring(L, "%s: %p", luaL_typename(L, n), lua_topointer(L, n));
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
int luatpt_log(lua_State* l)
|
||||
{
|
||||
int args = lua_gettop(l);
|
||||
@ -958,7 +957,11 @@ int luatpt_log(lua_State* l)
|
||||
lua_pop(l, 2);
|
||||
}
|
||||
if((*luacon_currentCommand))
|
||||
(*luacon_lastError) = text;
|
||||
{
|
||||
if(luacon_lastError->length())
|
||||
*luacon_lastError += "; ";
|
||||
*luacon_lastError += text;
|
||||
}
|
||||
else
|
||||
luacon_ci->Log(CommandInterface::LogNotice, text.c_str());
|
||||
return 0;
|
||||
|
@ -9,6 +9,7 @@ extern Graphics * luacon_g;
|
||||
extern Renderer * luacon_ren;
|
||||
|
||||
extern bool *luacon_currentCommand;
|
||||
extern int luaL_tostring(lua_State* l, int n);
|
||||
extern std::string *luacon_lastError;
|
||||
|
||||
extern int *lua_el_func, *lua_el_mode, *lua_gr_func;
|
||||
|
@ -57,6 +57,7 @@ Renderer * luacon_ren;
|
||||
|
||||
bool *luacon_currentCommand;
|
||||
std::string *luacon_lastError;
|
||||
std::string lastCode;
|
||||
|
||||
int *lua_el_func, *lua_el_mode, *lua_gr_func;
|
||||
|
||||
@ -178,6 +179,8 @@ LuaScriptInterface::LuaScriptInterface(GameController * c, GameModel * m):
|
||||
luacon_currentCommand = ¤tCommand;
|
||||
luacon_lastError = &lastError;
|
||||
|
||||
lastCode = "";
|
||||
|
||||
//Replace print function with our screen logging thingy
|
||||
lua_pushcfunction(l, luatpt_log);
|
||||
lua_setglobal(l, "print");
|
||||
@ -2119,14 +2122,53 @@ int LuaScriptInterface::Command(std::string command)
|
||||
}
|
||||
else
|
||||
{
|
||||
int ret;
|
||||
int level = lua_gettop(l), ret;
|
||||
std::string text = "";
|
||||
lastError = "";
|
||||
currentCommand = true;
|
||||
if(lastCode.length())
|
||||
lastCode += "\n";
|
||||
lastCode += command;
|
||||
std::string tmp = "return " + lastCode;
|
||||
ui::Engine::Ref().LastTick(clock());
|
||||
if((ret = luaL_dostring(l, command.c_str())))
|
||||
luaL_loadbuffer(l, tmp.c_str(), tmp.length(), "@console");
|
||||
if(lua_type(l, -1) != LUA_TFUNCTION)
|
||||
{
|
||||
lua_pop(l, 1);
|
||||
luaL_loadbuffer(l, lastCode.c_str(), lastCode.length(), "@console");
|
||||
}
|
||||
if(lua_type(l, -1) != LUA_TFUNCTION)
|
||||
{
|
||||
lastError = luacon_geterror();
|
||||
//Log(LogError, lastError);
|
||||
if(std::string(lastError).find("near '<eof>'")!=-1) //the idea stolen from lua-5.1.5/lua.c
|
||||
lastError = ">";
|
||||
else
|
||||
lastCode = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
lastCode = "";
|
||||
ret = lua_pcall(l, 0, LUA_MULTRET, 0);
|
||||
if(ret)
|
||||
lastError = luacon_geterror();
|
||||
else
|
||||
{
|
||||
for(level++;level<=lua_gettop(l);level++)
|
||||
{
|
||||
luaL_tostring(l, level);
|
||||
if(text.length())
|
||||
text += ", " + std::string(luaL_optstring(l, -1, ""));
|
||||
else
|
||||
text = std::string(luaL_optstring(l, -1, ""));
|
||||
lua_pop(l, 1);
|
||||
}
|
||||
if(text.length())
|
||||
if(lastError.length())
|
||||
lastError += "; " + text;
|
||||
else
|
||||
lastError = text;
|
||||
|
||||
}
|
||||
}
|
||||
currentCommand = false;
|
||||
return ret;
|
||||
|
Loading…
Reference in New Issue
Block a user