diff options
Diffstat (limited to 'Examples/lua/pointer')
-rw-r--r-- | Examples/lua/pointer/Makefile | 19 | ||||
-rw-r--r-- | Examples/lua/pointer/example.c | 16 | ||||
-rw-r--r-- | Examples/lua/pointer/example.i | 35 | ||||
-rw-r--r-- | Examples/lua/pointer/runme.lua | 48 |
4 files changed, 118 insertions, 0 deletions
diff --git a/Examples/lua/pointer/Makefile b/Examples/lua/pointer/Makefile new file mode 100644 index 0000000..ac0fff4 --- /dev/null +++ b/Examples/lua/pointer/Makefile @@ -0,0 +1,19 @@ +TOP = ../.. +SWIG = $(TOP)/../preinst-swig +SRCS = example.c +TARGET = example +INTERFACE = example.i +LIBS = + +all:: + $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ + TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' lua + +static:: + $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ + TARGET='mylua' INTERFACE='$(INTERFACE)' lua_static + +clean:: + $(MAKE) -f $(TOP)/Makefile lua_clean + +check: all diff --git a/Examples/lua/pointer/example.c b/Examples/lua/pointer/example.c new file mode 100644 index 0000000..b877d9a --- /dev/null +++ b/Examples/lua/pointer/example.c @@ -0,0 +1,16 @@ +/* File : example.c */ + +void add(int *x, int *y, int *result) { + *result = *x + *y; +} + +void sub(int *x, int *y, int *result) { + *result = *x - *y; +} + +int divide(int n, int d, int *r) { + int q; + q = n/d; + *r = n - q*d; + return q; +} diff --git a/Examples/lua/pointer/example.i b/Examples/lua/pointer/example.i new file mode 100644 index 0000000..d49365b --- /dev/null +++ b/Examples/lua/pointer/example.i @@ -0,0 +1,35 @@ +/* File : example.i */ +%module example + +%{ + #include <stdlib.h> +%} + +/* This example illustrates a couple of different techniques + for manipulating C pointers */ + +/* First we'll use the pointer library */ +%inline %{ +extern void add(int *x, int *y, int *result); +%} +%include cpointer.i +%pointer_functions(int, intp); + +/* Next we'll use some typemaps */ + +%include typemaps.i +extern void sub(int *INPUT, int *INPUT, int *OUTPUT); +%{ +extern void sub(int *, int *, int *); +%} + +/* Next we'll use typemaps and the %apply directive */ + +%apply int *OUTPUT { int *r }; +%inline %{ +extern int divide(int n, int d, int *r); +%} + + + + diff --git a/Examples/lua/pointer/runme.lua b/Examples/lua/pointer/runme.lua new file mode 100644 index 0000000..8deee67 --- /dev/null +++ b/Examples/lua/pointer/runme.lua @@ -0,0 +1,48 @@ +---- 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('example.so','luaopen_example') + assert(lib)() +else + -- lua 5.1 does + require('example') +end + +-- First create some objects using the pointer library. +print("Testing the pointer library") +a = example.new_intp() +b = example.new_intp() +c = example.new_intp() +example.intp_assign(a,37) +example.intp_assign(b,42) + +print(" a = "..tostring(a)) +print(" b = "..tostring(b)) +print(" c = "..tostring(c)) + +-- Call the add() function with some pointers +example.add(a,b,c) + +-- Now get the result +r = example.intp_value(c) +print(" 37 + 42 = "..r) + +-- Clean up the pointers +-- since this is C-style pointers you must clean it up +example.delete_intp(a) +example.delete_intp(b) +example.delete_intp(c) + +-- Now try the typemap library +-- This should be much easier. Now how it is no longer +-- necessary to manufacture pointers. + +print("Trying the typemap library") +r = example.sub(37,42) +print(" 37 - 42 = "..r) + +-- Now try the version with multiple return values + +print("Testing multiple return values") +q,r = example.divide(42,37) +print(" 42/37 = "..q.." remainder "..r) |