source: Plugins/luaScripting/ScriptConnector.cpp @ 1

Revision 1, 3.3 KB checked in by art, 13 years ago (diff)
Line 
1/***************************************************************************
2 *                                                                         *
3 *   (c) Art Tevs, MPI Informatik Saarbruecken                             *
4 *       mailto: <tevs@mpi-sb.mpg.de>                                      *
5 *                                                                         *
6 *   This program is free software; you can redistribute it and/or modify  *
7 *   it under the terms of the GNU General Public License as published by  *
8 *   the Free Software Foundation; either version 2 of the License, or     *
9 *   (at your option) any later version.                                   *
10 *                                                                         *
11 ***************************************************************************/
12
13
14//----------------------------------------------------------------------------------
15// Includes
16//----------------------------------------------------------------------------------
17#include "ScriptConnector.h"
18#include "Script.h"
19
20//----------------------------------------------------------------------------------
21LuaScriptConnector::LuaScriptConnector() : ScriptConnector("LuaScriptConnector")
22{
23        initialize();
24}
25
26//----------------------------------------------------------------------------------
27void LuaScriptConnector::OnRegisterFunction(const std::string& name, const ScriptFunctor& func)
28{
29        // check if a function already registered
30        if (std::find(mRegistered.begin(), mRegistered.end(), name) != mRegistered.end()) return;
31       
32        // register the function by lua
33        lua_pushstring(LuaScript::State, name.c_str());
34        lua_pushcclosure(LuaScript::State, callFunc, 1);
35        lua_setglobal(LuaScript::State, name.c_str());
36
37        // take this function into the list
38        mRegistered.push_back(name);
39}
40
41//----------------------------------------------------------------------------------
42void LuaScriptConnector::OnRemoveFunction(const std::string& name)
43{
44        // check if a function already registered
45        if (std::find(mRegistered.begin(), mRegistered.end(), name) == mRegistered.end()) return;
46
47        // remove the function from the list
48        mRegistered.erase(std::find(mRegistered.begin(), mRegistered.end(), name));
49}
50
51//----------------------------------------------------------------------------------
52int LuaScriptConnector::callFunc(lua_State* L)
53{
54
55        // THIS IS A HACK! I DO NOT KNOW HOW TO DO IT BETTER!
56        lua_getupvalue(L, -(lua_gettop(L) + 1), 1);
57       
58        // prepare the vector with argument for the registered function
59        std::vector<std::string> values;
60        std::vector<std::string> args;
61
62        // read out the whole stack
63        while (lua_gettop(L) > 0){
64                const char* str = lua_popstring(L);
65                values.push_back(std::string(str));
66        }
67
68        // check that the size is valid
69        if (values.size() == 0) return 0;
70
71        // get the function name and copy the arguments
72        std::string funcName = values[0];
73        args.push_back(funcName);       
74        for (int32 i = (int32)values.size() - 1; i > 0; i--){
75                args.push_back(values[i]);
76        }
77       
78        // call the function from the script engine
79        ScriptResult res = Engine::sScriptEngine()->call(funcName, args);
80
81        // push the result on the stack
82        if (res.size()){
83                lua_pushstring(L, (res.get<std::string>(0)).c_str());
84                lua_error(L);
85                return 1;
86        }
87
88        // clear the stack
89        lua_pop(L, lua_gettop(L));
90       
91        // return the number of results
92        return 0;       
93}
94
Note: See TracBrowser for help on using the repository browser.