update swig on windows
This commit is contained in:
25
winx64/bin/swigwin-4.0.0/Examples/lua/embed3/Makefile
Normal file
25
winx64/bin/swigwin-4.0.0/Examples/lua/embed3/Makefile
Normal file
@@ -0,0 +1,25 @@
|
||||
TOP = ../..
|
||||
SWIGEXE = $(TOP)/../swig
|
||||
SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib
|
||||
TARGET = embed3
|
||||
SRCS = example.cpp
|
||||
INTERFACE = example.i
|
||||
LUA_INTERP = embed3.cpp
|
||||
|
||||
# this is a little different to normal as we have our own special interpreter
|
||||
# which we want to static link
|
||||
# we also need the external runtime, so we can get access to certain internals of SWIG
|
||||
check: build
|
||||
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' TARGET='$(TARGET)' lua_embed_run
|
||||
|
||||
build:
|
||||
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' \
|
||||
SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \
|
||||
lua_externalhdr
|
||||
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \
|
||||
SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \
|
||||
SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='example.i' LUA_INTERP='$(LUA_INTERP)' lua_static_cpp
|
||||
|
||||
clean:
|
||||
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' lua_clean
|
||||
rm -f swigluarun.h $(TARGET)
|
||||
153
winx64/bin/swigwin-4.0.0/Examples/lua/embed3/embed3.cpp
Normal file
153
winx64/bin/swigwin-4.0.0/Examples/lua/embed3/embed3.cpp
Normal file
@@ -0,0 +1,153 @@
|
||||
/* embed3.cpp A C++ embedded interpreter
|
||||
|
||||
This will register a C++ class with Lua, and then call a Lua function
|
||||
passing C++ objects to this function.
|
||||
|
||||
*/
|
||||
|
||||
/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
|
||||
#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
|
||||
# define _CRT_SECURE_NO_DEPRECATE
|
||||
#endif
|
||||
|
||||
/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */
|
||||
#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE)
|
||||
# define _SCL_SECURE_NO_DEPRECATE
|
||||
#endif
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
extern "C" {
|
||||
#include <lua.h>
|
||||
#include <lauxlib.h>
|
||||
#include <lualib.h>
|
||||
}
|
||||
|
||||
#if LUA_VERSION_NUM > 501
|
||||
#define lua_open luaL_newstate
|
||||
#endif
|
||||
|
||||
/* The SWIG external runtime is generated by using.
|
||||
swig -lua -externalruntime swigluarun.h
|
||||
It contains useful function used by SWIG in its wrapper
|
||||
SWIG_TypeQuery() SWIG_NewPointerObj()
|
||||
*/
|
||||
#include "swigluarun.h" // the SWIG external runtime
|
||||
|
||||
/* the SWIG wrapped library */
|
||||
extern "C" int luaopen_example(lua_State*L);
|
||||
|
||||
// the code itself
|
||||
#include "example.h"
|
||||
|
||||
// this code pushes a C++ pointer as well as the SWIG type onto the Lua stack
|
||||
bool push_pointer(lua_State*L, void* ptr, const char* type_name, int owned = 0) {
|
||||
// task 1: get the object 'type' which is registered with SWIG
|
||||
// you need to call SWIG_TypeQuery() with the class name
|
||||
// (normally, just look in the wrapper file to get this)
|
||||
swig_type_info * pTypeInfo = SWIG_TypeQuery(L, type_name);
|
||||
if (pTypeInfo == 0)
|
||||
return false; // error
|
||||
// task 2: push the pointer to the Lua stack
|
||||
// this requires a pointer & the type
|
||||
// the last param specifies if Lua is responsible for deleting the object
|
||||
SWIG_NewPointerObj(L, ptr, pTypeInfo, owned);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* This is an example of how to call the Lua function
|
||||
void onEvent(Event e)
|
||||
its very tedious, but gives you an idea of the issues involed.
|
||||
*/
|
||||
int call_onEvent(lua_State *L, Event e) {
|
||||
int top;
|
||||
/* ok, here we go:
|
||||
push a, push b, call 'add' check & return res
|
||||
*/
|
||||
top = lua_gettop(L); /* for later */
|
||||
lua_getglobal(L, "onEvent"); /* function to be called */
|
||||
if (!lua_isfunction(L, -1)) {
|
||||
printf("[C++] error: cannot find function 'OnEvent'\n");
|
||||
lua_settop(L, top); // reset
|
||||
return 0;
|
||||
}
|
||||
// push the event object
|
||||
push_pointer(L, &e, "Event *", 0);
|
||||
if (lua_pcall(L, 1, 0, 0) != 0) /* call function with 1 arguments and no result */
|
||||
{
|
||||
printf("[C++] error running function `OnEvent': %s\n", lua_tostring(L, -1));
|
||||
lua_settop(L, top); // reset
|
||||
return 0;
|
||||
}
|
||||
lua_settop(L, top); /* reset stack */
|
||||
return 1; // ok
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
printf("[C++] Welcome to the simple embedded Lua example v3\n");
|
||||
printf("[C++] We are in C++\n");
|
||||
printf("[C++] opening a Lua state & loading the libraries\n");
|
||||
lua_State *L = lua_open();
|
||||
luaopen_base(L);
|
||||
luaopen_string(L);
|
||||
luaopen_math(L);
|
||||
printf("[C++] now loading the SWIG wrappered library\n");
|
||||
luaopen_example(L);
|
||||
printf("[C++] all looks ok\n");
|
||||
printf("\n");
|
||||
printf("[C++] let's create an Engine and pass a pointer to Lua\n");
|
||||
Engine engine;
|
||||
/* this code will pass a pointer into lua, but C++ still owns the object
|
||||
this is a little tedious, to do, but let's do it
|
||||
we need to pass the pointer (obviously), the type name
|
||||
and a flag which states if Lua should delete the pointer once its finished with it
|
||||
The type name is a class name string which is registered with SWIG
|
||||
(normally, just look in the wrapper file to get this)
|
||||
in this case we don't want Lua to delete the pointer so the ownership flag is 0
|
||||
*/
|
||||
push_pointer(L,&engine,"Engine *",0);
|
||||
lua_setglobal(L, "pEngine"); // set as global variable
|
||||
|
||||
if (argc != 2 || argv[1] == NULL || strlen(argv[1]) == 0) {
|
||||
printf("[C++] ERROR: no lua file given on command line\n");
|
||||
exit(3);
|
||||
}
|
||||
printf("[C++] now let's load the file '%s'\n", argv[1]);
|
||||
printf("[C++] any lua code in this file will be executed\n");
|
||||
if (luaL_loadfile(L, argv[1]) || lua_pcall(L, 0, 0, 0)) {
|
||||
printf("[C++] ERROR: cannot run lua file: %s",lua_tostring(L, -1));
|
||||
exit(3);
|
||||
}
|
||||
printf("[C++] We are now back in C++, all looks ok\n");
|
||||
printf("\n");
|
||||
|
||||
printf("[C++] Let's call the Lua function onEvent(e)\n");
|
||||
printf("[C++] We will give it different events, as we wish\n");
|
||||
printf("[C++] Starting with STARTUP\n");
|
||||
Event ev;
|
||||
ev.mType = Event::STARTUP;
|
||||
call_onEvent(L, ev);
|
||||
printf("[C++] ok\n");
|
||||
printf("[C++] now we will try MOUSEPRESS,KEYPRESS,MOUSEPRESS\n");
|
||||
ev.mType = Event::MOUSEPRESS;
|
||||
call_onEvent(L, ev);
|
||||
ev.mType = Event::KEYPRESS;
|
||||
call_onEvent(L, ev);
|
||||
ev.mType = Event::MOUSEPRESS;
|
||||
call_onEvent(L, ev);
|
||||
printf("[C++] ok\n");
|
||||
printf("[C++] Finally we will SHUTDOWN\n");
|
||||
ev.mType = Event::SHUTDOWN;
|
||||
call_onEvent(L, ev);
|
||||
printf("[C++] ok\n");
|
||||
|
||||
printf("\n");
|
||||
printf("[C++] all finished, closing the lua state\n");
|
||||
lua_close(L);
|
||||
return 0;
|
||||
}
|
||||
25
winx64/bin/swigwin-4.0.0/Examples/lua/embed3/example.cpp
Normal file
25
winx64/bin/swigwin-4.0.0/Examples/lua/embed3/example.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
/* File : example.cpp */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "example.h"
|
||||
|
||||
void Engine::start()
|
||||
{
|
||||
printf("[C++] Engine::start()\n");
|
||||
}
|
||||
|
||||
void Engine::stop()
|
||||
{
|
||||
printf("[C++] Engine::stop()\n");
|
||||
}
|
||||
|
||||
void Engine::accelerate(float f)
|
||||
{
|
||||
printf("[C++] Engine::accelerate(%f)\n",f);
|
||||
}
|
||||
|
||||
void Engine::decelerate(float f)
|
||||
{
|
||||
printf("[C++] Engine::decelerate(%f)\n",f);
|
||||
}
|
||||
|
||||
24
winx64/bin/swigwin-4.0.0/Examples/lua/embed3/example.h
Normal file
24
winx64/bin/swigwin-4.0.0/Examples/lua/embed3/example.h
Normal file
@@ -0,0 +1,24 @@
|
||||
/* File : example.h */
|
||||
|
||||
/* This is some kind of engine of some kind
|
||||
we will give it some dummy methods for Lua to call*/
|
||||
|
||||
class Engine
|
||||
{
|
||||
public:
|
||||
void start();
|
||||
void stop();
|
||||
void accelerate(float f);
|
||||
void decelerate(float f);
|
||||
};
|
||||
|
||||
|
||||
/* We also want to pass some events to Lua, so let's have a few classes
|
||||
to do this.
|
||||
*/
|
||||
class Event
|
||||
{
|
||||
public:
|
||||
enum {STARTUP,KEYPRESS,MOUSEPRESS,SHUTDOWN} mType;
|
||||
// etc
|
||||
};
|
||||
8
winx64/bin/swigwin-4.0.0/Examples/lua/embed3/example.i
Normal file
8
winx64/bin/swigwin-4.0.0/Examples/lua/embed3/example.i
Normal file
@@ -0,0 +1,8 @@
|
||||
/* File : example.i */
|
||||
%module example
|
||||
|
||||
%{
|
||||
#include "example.h"
|
||||
%}
|
||||
|
||||
%include "example.h"
|
||||
35
winx64/bin/swigwin-4.0.0/Examples/lua/embed3/runme.lua
Normal file
35
winx64/bin/swigwin-4.0.0/Examples/lua/embed3/runme.lua
Normal file
@@ -0,0 +1,35 @@
|
||||
print "[lua] This is runme.lua"
|
||||
-- test program for embedded lua
|
||||
-- we do not need to load the library, as it was already in the interpreter
|
||||
-- but let's check anyway
|
||||
|
||||
assert(type(example)=='table',"Don't appear to have loaded the example module. Do not run this file directly, run the embed3 executable")
|
||||
|
||||
print "[lua] looking to see if we have a pointer to the engine"
|
||||
if type(pEngine)=="userdata" then
|
||||
print "[lua] looks good"
|
||||
else
|
||||
print "[lua] nope, no signs of it"
|
||||
end
|
||||
|
||||
|
||||
-- the embedded program expects a function void onEvent(Event)
|
||||
-- this is it
|
||||
|
||||
function onEvent(e)
|
||||
print("[Lua] onEvent with event",e.mType)
|
||||
-- let's do something with the Engine
|
||||
-- nothing clever, but ...
|
||||
if e.mType==example.Event_STARTUP then
|
||||
pEngine:start()
|
||||
elseif e.mType==example.Event_KEYPRESS then
|
||||
pEngine:accelerate(0.4)
|
||||
elseif e.mType==example.Event_MOUSEPRESS then
|
||||
pEngine:decelerate(0.4)
|
||||
elseif e.mType==example.Event_SHUTDOWN then
|
||||
pEngine:stop()
|
||||
else
|
||||
error("unknown event type")
|
||||
end
|
||||
print("[Lua] ending onEvent")
|
||||
end
|
||||
Reference in New Issue
Block a user