https://swig.svn.sourceforge.net/svnroot/swig/trunk ........ r10498 | talby | 2008-05-26 22:09:56 +0200 (Pn, 26 maj 2008) | 2 lines run test cases in the Perl set by the --with-perl5 configure option. ........ r10499 | talby | 2008-05-26 23:04:06 +0200 (Pn, 26 maj 2008) | 3 lines The perl5 minherit runtime test will work better if the classes are actually built under SWIGPERL. ........ r10503 | wsfulton | 2008-05-28 11:44:37 +0200 (Śr, 28 maj 2008) | 1 line Fix variable wrappers when using -proxy. Patch from Jan Jezabek ........ r10504 | bhy | 2008-05-28 19:27:48 +0200 (Śr, 28 maj 2008) | 2 lines Fixed SF #1971977: typo in pycontainer.swg (related to -extranative option) ........ r10506 | wsfulton | 2008-05-29 02:45:28 +0200 (Cz, 29 maj 2008) | 1 line Fix variable wrappers when using -noproxy ........ r10508 | bhy | 2008-05-30 15:53:33 +0200 (Pt, 30 maj 2008) | 1 line Fixed SF #1976978, apply the macros for primitive types to std::wstring ........ r10511 | olly | 2008-05-30 18:11:27 +0200 (Pt, 30 maj 2008) | 4 lines Fix typo in handling of /*@SWIG[...]*/ comments in the scanner. This just meant we were only actually looking for /*@SWI at the start of the comment, so was pretty harmless in practice. ........ r10515 | wsfulton | 2008-06-02 22:10:40 +0200 (Pn, 02 cze 2008) | 1 line Fix samename testcase for c# and java ........ r10516 | wsfulton | 2008-06-02 22:15:39 +0200 (Pn, 02 cze 2008) | 1 line Fix enums when using -noproxy ........ r10518 | bhy | 2008-06-07 13:20:07 +0200 (So, 07 cze 2008) | 4 lines Added a test case for keyword renaming. Now it works for Python in SWIG's -c++ mode, but in C mode it doesn't work! (you can try with make keyword_rename.ctest) ........ r10519 | bhy | 2008-06-07 15:40:51 +0200 (So, 07 cze 2008) | 1 line fixed keyword_rename.ctest tese case, caused by a mistake in Swig/naming.c ........ r10527 | mgossage | 2008-06-17 04:57:15 +0200 (Wt, 17 cze 2008) | 1 line [lua] bugfix 1938142 (bool& and bool* support) ........ r10530 | wsfulton | 2008-06-19 22:02:13 +0200 (Cz, 19 cze 2008) | 1 line Add R keyword support. Rename keywords for successful compilation of Java and C# code. More consistent keyword warnings across the different languages. ........ r10531 | wsfulton | 2008-06-19 23:15:48 +0200 (Cz, 19 cze 2008) | 1 line add complete list of R reserved words ........ r10536 | wsfulton | 2008-06-21 13:35:33 +0200 (So, 21 cze 2008) | 1 line better terminology for static types ........ r10537 | wsfulton | 2008-06-21 13:42:48 +0200 (So, 21 cze 2008) | 1 line remove raise as keyword test- it conflicts with _raise in LIBCMT on windows ........ r10539 | wsfulton | 2008-06-21 17:21:29 +0200 (So, 21 cze 2008) | 1 line Lua example warning removal fixes for vc++ ........ r10540 | wsfulton | 2008-06-21 17:23:02 +0200 (So, 21 cze 2008) | 1 line Remove some vc++ /W4 warnings ........ r10541 | wsfulton | 2008-06-21 18:04:55 +0200 (So, 21 cze 2008) | 1 line minor vc++ /W4 warning fixes ........ r10542 | wsfulton | 2008-06-21 21:07:51 +0200 (So, 21 cze 2008) | 1 line 'byte' is already used in Ruby on windows, so use another keyword ........ r10543 | wsfulton | 2008-06-21 22:45:32 +0200 (So, 21 cze 2008) | 1 line Fix crashing in the Ruby reject method in the STL wrappers ........ r10544 | wsfulton | 2008-06-21 22:48:28 +0200 (So, 21 cze 2008) | 1 line Fix crashing in the Ruby reject method in the STL wrappers ........ r10545 | wsfulton | 2008-06-21 22:49:10 +0200 (So, 21 cze 2008) | 1 line remove unnecessary variable int the char **STRING_ARRAY out typemap ........ r10546 | wsfulton | 2008-06-21 23:07:49 +0200 (So, 21 cze 2008) | 1 line Fix Ruby C++ example dependencies in dsp files ........ r10547 | wsfulton | 2008-06-22 00:25:36 +0200 (N, 22 cze 2008) | 1 line Fix unused parameter warnings in python when using gcc's -W -Wall options ........ r10548 | wsfulton | 2008-06-22 00:26:35 +0200 (N, 22 cze 2008) | 1 line Fix virtual destructor ........ r10549 | wsfulton | 2008-06-22 01:25:20 +0200 (N, 22 cze 2008) | 1 line various warning fixes ........ r10550 | wsfulton | 2008-06-22 02:09:11 +0200 (N, 22 cze 2008) | 1 line Another fix for the JVM hanging on exit problem when using directors ........ r10551 | wsfulton | 2008-06-22 02:09:51 +0200 (N, 22 cze 2008) | 1 line documentation sections update ........ r10552 | wsfulton | 2008-06-22 02:18:10 +0200 (N, 22 cze 2008) | 1 line more docs on defining macros for the thread hanging problem ........ r10558 | wsfulton | 2008-06-22 23:30:20 +0200 (N, 22 cze 2008) | 1 line fix unused parms in last commit for C code ........ r10559 | wsfulton | 2008-06-23 00:12:43 +0200 (Pn, 23 cze 2008) | 1 line Suppress unused methods warning for VC++ ........ r10560 | wsfulton | 2008-06-23 22:26:07 +0200 (Pn, 23 cze 2008) | 1 line fix partialcheck-test-suite and parallel make for r, chicken, tcl and php ........ r10561 | wsfulton | 2008-06-23 22:39:41 +0200 (Pn, 23 cze 2008) | 1 line correct message display when running the partialcheck-test-suite make target ........ r10562 | wsfulton | 2008-06-23 23:14:53 +0200 (Pn, 23 cze 2008) | 1 line fix typo ........ r10563 | olly | 2008-06-23 23:23:54 +0200 (Pn, 23 cze 2008) | 3 lines Fix bad use of Python API (untested, since I can't even compile this code on x86-64!) ........ r10564 | olly | 2008-06-24 00:58:03 +0200 (Wt, 24 cze 2008) | 3 lines [PHP] Fix segfault when wrapping a non-class function marked with %newobject (testcase char_strings). ........ r10565 | olly | 2008-06-24 02:27:34 +0200 (Wt, 24 cze 2008) | 3 lines [PHP] Fix assertion failure when handling %typemap(in,numinputs=0) (testcase ignore_parameter). ........ r10566 | olly | 2008-06-24 02:33:08 +0200 (Wt, 24 cze 2008) | 2 lines [PHP] Fix typemap_namespace.i to not try to copy a non-existent typemap. ........ r10567 | olly | 2008-06-24 02:41:07 +0200 (Wt, 24 cze 2008) | 3 lines Clean up dead and unused code in SwigToPhpType(), and rename to GetShadowReturnType(). ........ r10568 | olly | 2008-06-24 02:42:29 +0200 (Wt, 24 cze 2008) | 2 lines Fix cosmetic typo in string constant. ........ r10574 | wsfulton | 2008-06-24 22:10:28 +0200 (Wt, 24 cze 2008) | 1 line zap last entry ........ r10575 | wsfulton | 2008-06-24 22:11:46 +0200 (Wt, 24 cze 2008) | 1 line variable name changes to remove php keywords ........ r10576 | wsfulton | 2008-06-24 22:12:08 +0200 (Wt, 24 cze 2008) | 1 line variable name hiding fix ........ r10577 | wsfulton | 2008-06-24 22:12:43 +0200 (Wt, 24 cze 2008) | 1 line More info about numobjects added ........ r10578 | wsfulton | 2008-06-24 22:13:41 +0200 (Wt, 24 cze 2008) | 1 line update for 1.3.36 release ........ r10579 | wsfulton | 2008-06-24 23:48:46 +0200 (Wt, 24 cze 2008) | 1 line remove deprecated -c commandline option (runtime library generation) ........ r10580 | wsfulton | 2008-06-24 23:53:12 +0200 (Wt, 24 cze 2008) | 1 line correct comment about deprecated option ........ r10582 | wsfulton | 2008-06-25 01:00:27 +0200 (Śr, 25 cze 2008) | 1 line use rsync and ssh to upload releases to SourceForge as ftp no longer works ........ r10584 | wsfulton | 2008-06-25 01:24:48 +0200 (Śr, 25 cze 2008) | 1 line correction for 1.3.36 ........ r10588 | wsfulton | 2008-06-25 02:16:04 +0200 (Śr, 25 cze 2008) | 1 line section update ........ r10589 | wsfulton | 2008-06-25 02:16:40 +0200 (Śr, 25 cze 2008) | 1 line bump version to 1.3.37 ........ r10594 | wsfulton | 2008-06-26 20:33:06 +0200 (Cz, 26 cze 2008) | 1 line correct typo in first entry about %fragment ........ git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/branches/gsoc2008-maciekd@10606 626c5289-ae23-0410-ae9c-e8d60b6d4f22
233 lines
7.4 KiB
C
233 lines
7.4 KiB
C
/* embed2.c some more test for an embeded interpreter
|
|
|
|
This will go a bit further as it will pass values to and from the lua code.
|
|
It uses less of the SWIG code, and more of the raw lua API's
|
|
|
|
What it will do is load the wrappered lib, load runme.lua and then call some functions.
|
|
To make life easier, all the printf's have either [C] or [Lua] at the start
|
|
so you can see where they are coming from.
|
|
|
|
We will be using the luaL_dostring()/lua_dostring() function to call into lua
|
|
|
|
*/
|
|
|
|
/* 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 <lua.h>
|
|
#include <lauxlib.h>
|
|
#include <lualib.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
|
|
|
|
/* the SWIG wrappered library */
|
|
extern int luaopen_example(lua_State*L);
|
|
|
|
/* This is an example of how to call the Lua function
|
|
int add(int,int)
|
|
its very tedious, but gives you an idea of the issues involded.
|
|
(look below for a better idea)
|
|
*/
|
|
int call_add(lua_State *L,int a,int b,int* res) {
|
|
int top;
|
|
/* ok, here we go:
|
|
push a, push b, call 'add' check & return res
|
|
*/
|
|
top=lua_gettop(L); /* for later */
|
|
lua_pushstring(L, "add"); /* function name */
|
|
lua_gettable(L, LUA_GLOBALSINDEX); /* function to be called */
|
|
if (!lua_isfunction(L,-1)) {
|
|
printf("[C] error: cannot find function 'add'\n");
|
|
lua_settop(L,top); // reset
|
|
return 0;
|
|
}
|
|
lua_pushnumber(L,a);
|
|
lua_pushnumber(L,b);
|
|
if (lua_pcall(L, 2, 1, 0) != 0) /* call function with 2 arguments and 1 result */
|
|
{
|
|
printf("[C] error running function `add': %s\n",lua_tostring(L, -1));
|
|
lua_settop(L,top); // reset
|
|
return 0;
|
|
}
|
|
// check results
|
|
if (!lua_isnumber(L,-1)) {
|
|
printf("[C] error: returned value is not a number\n");
|
|
lua_settop(L,top); // reset
|
|
return 0;
|
|
}
|
|
*res=(int)lua_tonumber(L,-1);
|
|
lua_settop(L,top); /* reset stack */
|
|
return 1; // ok
|
|
}
|
|
|
|
/* This is a variargs call function for calling from C into Lua.
|
|
Original Code from Programming in Lua (PIL) by Roberto Ierusalimschy
|
|
ISBN 85-903798-1-7
|
|
http://www.lua.org/pil/25.3.html
|
|
This has been modified slightly to make it compile, and its still a bit rough.
|
|
But it gives the idea of how to make it work.
|
|
*/
|
|
int call_va (lua_State *L,const char *func, const char *sig, ...) {
|
|
va_list vl;
|
|
int narg, nres; /* number of arguments and results */
|
|
int top;
|
|
top=lua_gettop(L); /* for later */
|
|
|
|
va_start(vl, sig);
|
|
lua_getglobal(L, func); /* get function */
|
|
|
|
/* push arguments */
|
|
narg = 0;
|
|
while (*sig) { /* push arguments */
|
|
switch (*sig++) {
|
|
|
|
case 'd': /* double argument */
|
|
lua_pushnumber(L, va_arg(vl, double));
|
|
break;
|
|
|
|
case 'i': /* int argument */
|
|
lua_pushnumber(L, va_arg(vl, int));
|
|
break;
|
|
|
|
case 's': /* string argument */
|
|
lua_pushstring(L, va_arg(vl, char *));
|
|
break;
|
|
|
|
case '>':
|
|
goto endwhile;
|
|
|
|
default:
|
|
printf("invalid option (%c)\n", *(sig - 1));
|
|
goto fail;
|
|
}
|
|
narg++;
|
|
/* do we need this?*/
|
|
/* luaL_checkstack(L, 1, "too many arguments"); */
|
|
}
|
|
endwhile:
|
|
|
|
/* do the call */
|
|
nres = (int)strlen(sig); /* number of expected results */
|
|
if (lua_pcall(L, narg, nres, 0) != 0) /* do the call */
|
|
{
|
|
printf("error running function `%s': %s\n",func, lua_tostring(L, -1));
|
|
goto fail;
|
|
}
|
|
|
|
/* retrieve results */
|
|
nres = -nres; /* stack index of first result */
|
|
while (*sig) { /* get results */
|
|
switch (*sig++) {
|
|
|
|
case 'd': /* double result */
|
|
if (!lua_isnumber(L, nres)) {
|
|
printf("wrong result type\n");
|
|
goto fail;
|
|
}
|
|
*va_arg(vl, double *) = lua_tonumber(L, nres);
|
|
break;
|
|
|
|
case 'i': /* int result */
|
|
if (!lua_isnumber(L, nres)) {
|
|
printf("wrong result type\n");
|
|
goto fail;
|
|
}
|
|
*va_arg(vl, int *) = (int)lua_tonumber(L, nres);
|
|
break;
|
|
|
|
case 's': /* string result */
|
|
if (!lua_isstring(L, nres)) {
|
|
printf("wrong result type\n");
|
|
goto fail;
|
|
}
|
|
strcpy(va_arg(vl, char *),lua_tostring(L, nres));/* WARNING possible buffer overflow */
|
|
break;
|
|
|
|
default: {
|
|
printf("invalid option (%c)", *(sig - 1));
|
|
goto fail;
|
|
}
|
|
}
|
|
nres++;
|
|
}
|
|
va_end(vl);
|
|
|
|
lua_settop(L,top); /* reset stack */
|
|
return 1; /* ok */
|
|
fail:
|
|
lua_settop(L,top); /* reset stack */
|
|
return 0; /* error */
|
|
}
|
|
|
|
int main(int argc,char* argv[]) {
|
|
lua_State *L;
|
|
int ok;
|
|
int res;
|
|
char str[80];
|
|
printf("[C] Welcome to the simple embedded Lua example v2\n");
|
|
printf("[C] We are in C\n");
|
|
printf("[C] opening a Lua state & loading the libraries\n");
|
|
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] lets load the file 'runme.lua'\n");
|
|
printf("[C] any lua code in this file will be executed\n");
|
|
if (luaL_loadfile(L, "runme.lua") || 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] lets call the Lua function 'add(1,1)'\n");
|
|
printf("[C] using the C function 'call_add'\n");
|
|
ok=call_add(L,1,1,&res);
|
|
printf("[C] the function returned %d with value %d\n",ok,res);
|
|
printf("\n");
|
|
printf("[C] lets do this rather easier\n");
|
|
printf("[C] we will call the same Lua function using a generic C function 'call_va'\n");
|
|
ok=call_va(L,"add","ii>i",1,1,&res);
|
|
printf("[C] the function returned %d with value %d\n",ok,res);
|
|
printf("\n");
|
|
printf("[C] we will now use the same generic C function to call 'append(\"cat\",\"dog\")'\n");
|
|
ok=call_va(L,"append","ss>s","cat","dog",str);
|
|
printf("[C] the function returned %d with value %s\n",ok,str);
|
|
printf("\n");
|
|
printf("[C] we can also make some bad calls to ensure the code doesn't fail\n");
|
|
printf("[C] calling adds(1,2)\n");
|
|
ok=call_va(L,"adds","ii>i",1,2,&res);
|
|
printf("[C] the function returned %d with value %d\n",ok,res);
|
|
printf("[C] calling add(1,'fred')\n");
|
|
ok=call_va(L,"add","is>i",1,"fred",&res);
|
|
printf("[C] the function returned %d with value %d\n",ok,res);
|
|
printf("\n");
|
|
printf("[C] Note: no protection if you mess up the va-args, this is C\n");
|
|
printf("\n");
|
|
printf("[C] Finally we will call the wrappered gcd function gdc(6,9):\n");
|
|
printf("[C] This will pass the values to Lua, then call the wrappered function\n");
|
|
printf(" Which will get the values from Lua, call the C code \n");
|
|
printf(" and return the value to Lua and eventually back to C\n");
|
|
printf("[C] Certainly not the best way to do it :-)\n");
|
|
ok=call_va(L,"gcd","ii>i",6,9,&res);
|
|
printf("[C] the function returned %d with value %d\n",ok,res);
|
|
printf("\n");
|
|
printf("[C] all finished, closing the lua state\n");
|
|
lua_close(L);
|
|
return 0;
|
|
}
|