Merge pull request #132 from mniip/lua2

Some lua fixes
This commit is contained in:
jacob1 2013-05-03 12:09:35 -07:00
commit e95e8e26bf
3 changed files with 76 additions and 30 deletions

View File

@ -664,12 +664,32 @@ void luacon_hook(lua_State * l, lua_Debug * ar)
} }
} }
char *luacon_geterror(){ int luaL_tostring (lua_State *L, int n) {
char *error = (char*)lua_tostring(luacon_ci->l, -1); luaL_checkany(L, n);
if(error==NULL || !error[0]){ switch (lua_type(L, n)) {
error = "failed to execute"; 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(){ /*void luacon_close(){
lua_close(l); lua_close(l);
@ -923,27 +943,6 @@ int luatpt_setconsole(lua_State* l)
luacon_controller->HideConsole(); luacon_controller->HideConsole();
return 0; 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 luatpt_log(lua_State* l)
{ {
int args = lua_gettop(l); int args = lua_gettop(l);
@ -958,7 +957,11 @@ int luatpt_log(lua_State* l)
lua_pop(l, 2); lua_pop(l, 2);
} }
if((*luacon_currentCommand)) if((*luacon_currentCommand))
(*luacon_lastError) = text; {
if(luacon_lastError->length())
*luacon_lastError += "; ";
*luacon_lastError += text;
}
else else
luacon_ci->Log(CommandInterface::LogNotice, text.c_str()); luacon_ci->Log(CommandInterface::LogNotice, text.c_str());
return 0; return 0;

View File

@ -9,6 +9,7 @@ extern Graphics * luacon_g;
extern Renderer * luacon_ren; extern Renderer * luacon_ren;
extern bool *luacon_currentCommand; extern bool *luacon_currentCommand;
extern int luaL_tostring(lua_State* l, int n);
extern std::string *luacon_lastError; extern std::string *luacon_lastError;
extern int *lua_el_func, *lua_el_mode, *lua_gr_func; extern int *lua_el_func, *lua_el_mode, *lua_gr_func;

View File

@ -57,6 +57,7 @@ Renderer * luacon_ren;
bool *luacon_currentCommand; bool *luacon_currentCommand;
std::string *luacon_lastError; std::string *luacon_lastError;
std::string lastCode;
int *lua_el_func, *lua_el_mode, *lua_gr_func; int *lua_el_func, *lua_el_mode, *lua_gr_func;
@ -178,6 +179,8 @@ LuaScriptInterface::LuaScriptInterface(GameController * c, GameModel * m):
luacon_currentCommand = &currentCommand; luacon_currentCommand = &currentCommand;
luacon_lastError = &lastError; luacon_lastError = &lastError;
lastCode = "";
//Replace print function with our screen logging thingy //Replace print function with our screen logging thingy
lua_pushcfunction(l, luatpt_log); lua_pushcfunction(l, luatpt_log);
lua_setglobal(l, "print"); lua_setglobal(l, "print");
@ -2119,14 +2122,53 @@ int LuaScriptInterface::Command(std::string command)
} }
else else
{ {
int ret; int level = lua_gettop(l), ret;
std::string text = "";
lastError = ""; lastError = "";
currentCommand = true; currentCommand = true;
if(lastCode.length())
lastCode += "\n";
lastCode += command;
std::string tmp = "return " + lastCode;
ui::Engine::Ref().LastTick(clock()); 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(); 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; currentCommand = false;
return ret; return ret;