From d0381c8141464aeb4f1c6d933ebea841b8e0eaf2 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Tue, 20 Sep 2005 20:00:56 +0000 Subject: [PATCH] New Lua examples - Mark Gossage patch #1295168 git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7471 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Examples/lua/constants/Makefile | 19 +++++++++++++ Examples/lua/constants/example.i | 27 ++++++++++++++++++ Examples/lua/constants/runme.lua | 35 +++++++++++++++++++++++ Examples/lua/functest/Makefile | 19 +++++++++++++ Examples/lua/functest/example.c | 25 +++++++++++++++++ Examples/lua/functest/example.i | 11 ++++++++ Examples/lua/functest/runme.lua | 20 +++++++++++++ Examples/lua/import.lua | 42 ++++++++++++++++++++++++++++ Examples/lua/pointer/Makefile | 19 +++++++++++++ Examples/lua/pointer/example.c | 16 +++++++++++ Examples/lua/pointer/example.i | 28 +++++++++++++++++++ Examples/lua/pointer/runme.lua | 48 ++++++++++++++++++++++++++++++++ 12 files changed, 309 insertions(+) create mode 100644 Examples/lua/constants/Makefile create mode 100644 Examples/lua/constants/example.i create mode 100644 Examples/lua/constants/runme.lua create mode 100644 Examples/lua/functest/Makefile create mode 100644 Examples/lua/functest/example.c create mode 100644 Examples/lua/functest/example.i create mode 100644 Examples/lua/functest/runme.lua create mode 100644 Examples/lua/import.lua create mode 100644 Examples/lua/pointer/Makefile create mode 100644 Examples/lua/pointer/example.c create mode 100644 Examples/lua/pointer/example.i create mode 100644 Examples/lua/pointer/runme.lua diff --git a/Examples/lua/constants/Makefile b/Examples/lua/constants/Makefile new file mode 100644 index 000000000..ac98b617b --- /dev/null +++ b/Examples/lua/constants/Makefile @@ -0,0 +1,19 @@ +TOP = ../.. +SWIG = $(TOP)/../swig +CXXSRCS = +TARGET = example +INTERFACE = example.i +LIBS = + +all:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' lua + +static:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + TARGET='mylua' INTERFACE='$(INTERFACE)' lua_static + +clean:: + $(MAKE) -f $(TOP)/Makefile lua_clean + +check: all \ No newline at end of file diff --git a/Examples/lua/constants/example.i b/Examples/lua/constants/example.i new file mode 100644 index 000000000..4f7b1a4d7 --- /dev/null +++ b/Examples/lua/constants/example.i @@ -0,0 +1,27 @@ +/* File : example.i */ +%module example + +/* A few preprocessor macros */ + +#define ICONST 42 +#define FCONST 2.1828 +#define CCONST 'x' +#define CCONST2 '\n' +#define SCONST "Hello World" +#define SCONST2 "\"Hello World\"" + +/* This should work just fine */ +#define EXPR ICONST + 3*(FCONST) + +/* This shouldn't do anything */ +#define EXTERN extern + +/* Neither should this (BAR isn't defined) */ +#define FOO (ICONST + BAR) + +/* The following directives also produce constants */ + +%constant int iconst = 37; +%constant double fconst = 3.14; + + diff --git a/Examples/lua/constants/runme.lua b/Examples/lua/constants/runme.lua new file mode 100644 index 000000000..b3b8d3e8a --- /dev/null +++ b/Examples/lua/constants/runme.lua @@ -0,0 +1,35 @@ +-- file: example.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','Example_Init') or loadlib('example.so','Example_Init') + assert(lib)() +else + -- lua 5.1 does + require('example') +end + +print("ICONST = "..example.ICONST.." (should be 42)") +print("FCONST = "..example.FCONST.." (should be 2.1828)") +print("CCONST = "..example.CCONST.." (should be 'x')") +print("CCONST2 = "..example.CCONST2.." (this should be on a new line)") +print("SCONST = "..example.SCONST.." (should be 'Hello World')") +print("SCONST2 = "..example.SCONST2.." (should be '\"Hello World\"')") +print("EXPR = "..example.EXPR.." (should be 48.5484)") +print("iconst = "..example.iconst.." (should be 37)") +print("fconst = "..example.fconst.." (should be 3.14)") + +-- helper to check that a fn failed +function checkfail(fn) + if pcall(fn)==true then + print("that shouldn't happen, it worked") + else + print("function failed as expected") + end +end + +-- these should fail +-- example.EXTERN is a nil value, so concatentatin will make it fail +checkfail(function() print("EXTERN = "..example.EXTERN) end) +checkfail(function() print("FOO = "..example.FOO) end) diff --git a/Examples/lua/functest/Makefile b/Examples/lua/functest/Makefile new file mode 100644 index 000000000..81e4a4e05 --- /dev/null +++ b/Examples/lua/functest/Makefile @@ -0,0 +1,19 @@ +TOP = ../.. +SWIG = $(TOP)/../swig +CXXSRCS = example.c +TARGET = example +INTERFACE = example.i +LIBS = + +all:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' lua + +static:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + TARGET='mylua' INTERFACE='$(INTERFACE)' lua_static + +clean:: + $(MAKE) -f $(TOP)/Makefile lua_clean + +check: all diff --git a/Examples/lua/functest/example.c b/Examples/lua/functest/example.c new file mode 100644 index 000000000..8eb647f66 --- /dev/null +++ b/Examples/lua/functest/example.c @@ -0,0 +1,25 @@ +/* File : example.c */ + +/* A global variable */ +double Foo = 3.0; + +int add1(int x, int y) +{ + return x+y; +} + +void add2(int x, int *y, int *z) +{ + *z = x+*y; +} + +int add3(int x, int y, int *z) +{ + *z = x-y; + return x+y; +} + +void add4(int x, int *y) +{ + *y += x; +} diff --git a/Examples/lua/functest/example.i b/Examples/lua/functest/example.i new file mode 100644 index 000000000..24729d4b5 --- /dev/null +++ b/Examples/lua/functest/example.i @@ -0,0 +1,11 @@ +/* File : example.i */ +%module example + +%include "typemaps.i" // you must have this for the typemaps for ptrs +// basic function testing +// +extern int add1(int x, int y); // return x+y -- basic function test +extern void add2(int x, int *INPUT, int *OUTPUT); // *z = x+*y -- argin and argout test +extern int add3(int x, int y, int *OUTPUT); // return x+y, *z=x-y -- returning 2 values +extern void add4(int x, int *INOUT); // *y += x -- INOUT dual purpose variable + diff --git a/Examples/lua/functest/runme.lua b/Examples/lua/functest/runme.lua new file mode 100644 index 000000000..1ea11489d --- /dev/null +++ b/Examples/lua/functest/runme.lua @@ -0,0 +1,20 @@ +---- 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','Example_Init') or loadlib('example.so','Example_Init') + assert(lib)() +else + -- lua 5.1 does + require('example') +end + + +x,y = 42,105 +print("add1 - simple arg passing and single return value -- ") +print(example.add1(x,y)) +print("add2 - pointer arg passing and single return value through pointer arg -- ") +print(example.add2(x,y)) +print("add3 - simple arg passing and double return value through return and ptr arg -- ") +print(example.add3(x,y)) +print("add4 - dual use arg and return value -- ") +print(example.add4(x,y)) diff --git a/Examples/lua/import.lua b/Examples/lua/import.lua new file mode 100644 index 000000000..b2a40b017 --- /dev/null +++ b/Examples/lua/import.lua @@ -0,0 +1,42 @@ +-- import +-- the lua 5.0 loading mechanism is rather poor & relies upon the loadlib() fn +-- the lua 5.1 loading mechanism is simplicity itself +-- for now we need a bridge which will use the correct verion + +function import_5_0(module) + -- imports the file into the program + -- for a module 'example' + -- this must load 'example.dll' or 'example.so' + -- and look for the fn 'Example_Init()' (note the capitalisation) + if rawget(_G,module)~=nil then return end -- module appears to be loaded + + -- capitialising the first letter + local c=string.upper(string.sub(module,1,1)) + local fnname=c..string.sub(module,2).."_Init" + + local suffix,lib + -- note: as there seems to be no way in lua to determine the platform + -- we will try loading all possible names + -- providing one works, we can load + for _,suffix in pairs{".dll",".so"} do + lib=loadlib(module..suffix,fnname) + if lib then -- found + break + end + end + assert(lib,"error loading module:"..module) + + lib() -- execute the function: initalising the lib + local m=rawget(_G,module) -- gets the module object + assert(m~=nil,"no module table found") +end + +function import_5_1(module) + require(module) +end + +if string.sub(_VERSION,1,7)=='Lua 5.0' then + import=import_5_0 +else + import=import_5_1 +end \ No newline at end of file diff --git a/Examples/lua/pointer/Makefile b/Examples/lua/pointer/Makefile new file mode 100644 index 000000000..1e3c71304 --- /dev/null +++ b/Examples/lua/pointer/Makefile @@ -0,0 +1,19 @@ +TOP = ../.. +SWIG = $(TOP)/../swig +CXXSRCS = example.c +TARGET = example +INTERFACE = example.i +LIBS = + +all:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' lua + +static:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + TARGET='mylua' INTERFACE='$(INTERFACE)' lua_static + +clean:: + $(MAKE) -f $(TOP)/Makefile lua_clean + +check: all \ No newline at end of file diff --git a/Examples/lua/pointer/example.c b/Examples/lua/pointer/example.c new file mode 100644 index 000000000..b877d9a5b --- /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 000000000..c6b4f2c19 --- /dev/null +++ b/Examples/lua/pointer/example.i @@ -0,0 +1,28 @@ +/* File : example.i */ +%module example + +%{ + #include +%} + +/* This example illustrates a couple of different techniques + for manipulating C pointers */ + +/* First we'll use the pointer library */ +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); + +/* Next we'll use typemaps and the %apply directive */ + +%apply int *OUTPUT { int *r }; +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 000000000..722c54b94 --- /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','Example_Init') or loadlib('example.so','Example_Init') + 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)