软件

swigwin3    用于生成c的lua包装

lua5.2源代码


步骤

进入目录G:\sw\swigwin-3.0.12\Examples\lua\arrays

执行 SWIG -lua     example.i, 就会生成文件example_wrap.c

进入lua source code G:\doc\lua\lua-5.2.4.tar\lua-5.2.4\src

拷贝swig生成的几个c文件到该目录

b编写一个新的mymain.c内容如下

执行cl编译生成example.exe

执行example.exe runme.lua


代码:

===example.i

/* File : example.i */

%module example


/* in this file there are two sorting functions

and three different ways to wrap them.


See the lua code for how they are called

*/


%include <carrays.i>    // array helpers


// this declares a batch of function for manipulating C integer arrays

%array_functions(int,int)


// this adds some lua code directly into the module

// warning: you need the example. prefix if you want it added into the module

// admittedly this code is a bit tedious, but its a one off effort

%luacode {

function rt_int2(t)

-- local len=table.maxn(t) -- the len - maxn deprecated in 5.3

 local len=0; for _ in pairs(t) do len=len+1 end

 local arr=example.new_int(len)

 for i=1,len do

  example.int_setitem(arr,i-1,t[i]) -- note: C index is one less then lua index

 end

 rt_int(arr,len) -- call the fn

 -- copy back

 for i=1,len do

  t[i]=example.int_getitem(arr,i-1) -- note: C index is one less then lua index

 end

 example.delete_int(arr) -- must delete it

end

}


// this way uses the SWIG-Lua typemaps to do the conversion for us

// the %apply command states to apply this wherever the argument signature matches

%include <typemaps.i>

%apply (double *INOUT,int) {(double* arr,int len)};


%inline %{

extern void sort_int(int* arr, int len);

extern void sort_double(double* arr, int len);

%}


===runme.lua

---- importing ----

if string.sub(_VERSION,1,7)=='Lua 5.0' then

    -- lua5.0 doesnt have a nice way to do this

    lib=loadlib('example.dll','luaopen_example') or loadlib('','luaopen_example')

    assert(lib)()

else

    -- lua 5.1 does

    require('example')

end


-- a helper to print a Lua table

function print_table(t)

    print(table.concat(t,","))

end


-- a helper to print a C array

function print_array(arr,len)

    for i=0,len-1 do

        io.write(example.int_getitem(arr,i),",")

    end

    io.write("\n")

end


math.randomseed(0)  -- init random



--[[ version 1: passing a C array to the code

let's test call sort_int()

this requires a C array, so is the hardest to use]]

ARRAY_SIZE=10

arr=example.new_int(ARRAY_SIZE)

for i=0,ARRAY_SIZE-1 do

    example.int_setitem(arr,i,math.random(1000))

end

print "unsorted"

print_array(arr,ARRAY_SIZE)

rt_int(arr,ARRAY_SIZE)

print "sorted"

print_array(arr,ARRAY_SIZE)

example.delete_int(arr) -- must delete it

print ""


--[[ version 2: using %luacode to write a helper

a simpler way is to use a %luacode

which is a lua function added into the module

this can do the conversion for us

so we can just add a lua table directly

(what we do is move the lua code into the module instead)

]]

t={}

for i=1,ARRAY_SIZE do

    t[i]=math.random(1000)

end

print "unsorted"

print_table(t)

rt_int2(t) -- calls lua helper which then calls C

print "sorted"

print_table(t)

print ""


--[[ version 3: use a typemap

this is the best way

it uses the SWIG-Lua typemaps to do the work

one item of note: the typemap creates a copy, rather than edit-in-place]]

t={}

for i=1,ARRAY_SIZE do

    t[i]=math.random(1000)/10

end

print "unsorted"

print_table(t)

t=rt_double(t) -- replace t with the result

print "sorted"

print_table(t)


===mymain.c

#include <stdio.h>

#include "lua.h"

#include "lualib.h"

#include "lauxlib.h"


extern int luaopen_example(lua_State* L); // declare the wrapped module


int main(int argc, char* argv[])

{

 lua_State *L;

 if (argc<2)

 {

  printf("%s: <filename.lua>\n", argv[0]);

  return 0;

 }

 L= luaL_newstate();

 luaL_openlibs(L);

 //luaopen_base(L);       // load basic libs (eg. print)

 //luaopen_math(L);

 luaopen_example(L);    // load the wrapped module

 if (luaL_loadfile(L, argv[1])==0) // load and run the file

  lua_pcall(L, 0, 0, 0);

 else

  printf("unable to load %s\n", argv[1]);

 lua_close(L);

 return 0;

}


结果: