2012-03-25 85 views

回答

4

我已經調查Ruby和移植RUBYS代碼到Lua:

diff -Naurb swig-2.0.4.ori/Lib/lua/argcargv.i swig-2.0.4.diff/Lib/lua/argcargv.i 
--- swig-2.0.4.ori/Lib/lua/argcargv.i 1970-01-01 01:00:00.000000000 +0100 
+++ swig-2.0.4.diff/Lib/lua/argcargv.i 2012-03-25 17:36:35.000000000 +0200 
@@ -0,0 +1,58 @@ 
+/* ------------------------------------------------------------ 
+ * --- Argc & Argv --- 
+ * ------------------------------------------------------------ 
+ * 
+ * Use it as follow: 
+ * 
+ * %apply (int ARGC, char **ARGV) { (size_t argc, const char **argv) } 
+ * extern int mainApp(size_t argc, const char **argv); 
+ * 
+ * then in the lua: 
+ * 
+ * args = { "arg0", "arg1" } 
+ * mainApp(args); 
+ * 
+ * ------------------------------------------------------------ */ 
+ 
+%{ 
+SWIGINTERN int SWIG_argv_size(lua_State* L, int index) { 
+ int n=0; 
+ while(1){ 
+ lua_rawgeti(L,index,n+1); 
+ if (lua_isnil(L,-1)) 
+  break; 
+ ++n; 
+ lua_pop(L,1); 
+ } 
+ lua_pop(L,1); 
+ return n; 
+} 
+%} 
+ 
+%typemap(in) (int ARGC, char **ARGV) { 
+ if (lua_istable(L,$input)) { 
+ int i, size = SWIG_argv_size(L,$input); 
+ $1 = ($1_ltype) size; 
+ $2 = (char **) malloc((size+1)*sizeof(char *)); 
+ for (i = 0; i < size; i++) { 
+  lua_rawgeti(L,$input,i+1); 
+  if (lua_isnil(L,-1)) 
+ break; 
+  $2[i] = (char *)lua_tostring(L, -1); 
+  lua_pop(L,1); 
+ } 
+ $2[i]=NULL; 
+ } else { 
+ $1 = 0; $2 = 0; 
+ lua_pushstring(L,"Expecting argv array"); 
+ lua_error(L); 
+ } 
+} 
+ 
+%typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { 
+ $1 = lua_istable(L,$input); 
+} 
+ 
+%typemap(freearg) (int ARGC, char **ARGV) { 
+ free((char *) $2); 
+} 
+0

這完美的工作。謝謝,康拉德。你應該接受你自己的答案,也許刪除diff格式。只需在SWIG文件中複製這些代碼行就可以實現。 – Michel 2016-12-09 18:56:53