tcc 学習:call_lua51_Gen モジュール作成

2017-05-10 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-05-08)の記事「tcc 学習:既存 DLL を呼び出す DLL の作成」に続いて、
tcc の学習。

今回は、call_Lua51 の作成に関して学習。


これまでの学習から、

(1)“tiny_impdef”コマンドで、
  「lua51.dll」から「lua51.def」を作る。


(2)call_Lua51_Gen モジュールを tcc コードで作る:
// ----- call_Lua51_Gen.c -----
#include <windows.h>
#define DLLExport __declspec ( dllexport )

// -- lua51.dll 内 関数

void* luaL_newstate( void );
void luaL_openlibs( void* L );

int luaL_loadfilex( void* L, const char* fname, const char* mode );
int lua_pcall( void* L, int nargs, int nresults, int msgh );

void lua_getfield( void* L, int i , const char* name );
void lua_pushlightuserdata( void* L, void* p );
char* lua_pushstring( void* L, const char* s );

char* lua_tolstring( void* L, int index, size_t* len );
void lua_settop( void* L, int m ); // m == -(n) - 1
void lua_close( void* L );

//----------------
void* L; int z; char* SV; char buf[1025];

DLLExport char* call_Lua( char* PG, char* FN, void* IT, char* ST ){

L = luaL_newstate();
luaL_openlibs( L );

z = luaL_loadfilex( L, PG, "bt" );
z = lua_pcall( L, 0, 0, 0 ); // 1度実行

lua_getfield( L, -10002, FN );
lua_pushlightuserdata( L, IT );
lua_pushstring( L, ST );

lua_pcall( L, 2, 1, 0 ); // 引数 2 個, 戻り値 1 個

SV = lua_tolstring( L, -1, &z ); // 戻り値
strcpy( buf, SV );

lua_settop( L, -2 ); // lua_pop(L,1); 戻り値を pop
lua_close( L );

return buf;

}
これに対して、
tcc  -shared  call_Lua51_Gen.c  lua51.def
コマンドで、「call_Lua51_Gen.dll」を生成。


(3)今作った call_Lua51_Gen を使うメインプログラムを作る:
今回は、取り敢えず“GSL Shell”を使った。
----- call_call_Lua51_Gen_dll.gsl -----
lua = ffi.load( 'call_Lua51_Gen' ) -- call_Lua51 モジュール
ffi.cdef[[
char* call_Lua( char* PG, char* FN, void* IT, char* ST );
]]
charA = |s| ffi.cast( 'char*', s )
Int32 = |s| ffi.cast( 'int32_t', s )
voidA = |s| ffi.cast( 'void*', s ); NULL=voidA(0)

function printf( f, s, ... )
f = f or io.stdout
f:write(s:format(...))
end
-- 以下 Lua5.1 で実行するコード:( 'Lua51_Gen.lua'(下記)必要
-------------------------- 「lfs.dll」「time.lua」も必要
ss1=[[ print('Lua5.1---')
ffi.cdef[[ int rand(void);
double sqrt(double); ]]
ss2=[[
print( ffi.C.rand() ) -- 乱数生成
print( ffi.C.sqrt(3.0) ) -- 平方根算出
print( math.sin(1.0) )
require'lfs'; print( lfs.currentdir() )
t=require'time'; print(t.time())
print(IT[2])
DT=DblA(IT[5]); print(DT[3])
IT[0]=999; SV='ok!'
]]
ST=ss1..']]'..ss2 -- 上記2つの文字列結合 -----

---------------------- インタフェースデータ:
DT=ffi.new('double[5]', 1.1, 2.2, 3.3, 4.4, 5.5 )
IT=ffi.new('int32_t[6]',1,2,3,4,5,0)
IT[5]=Int32(voidA(DT))
-----------------------------------------

SV = lua.call_Lua(charA('Lua51_Gen.lua'),charA('Exec'),voidA(IT),charA(ST))
----------------------------- 中で実行!!!
-----------------------------------------
print( ffi.string(SV) ) -- 戻り値:文字列
print( IT[0] ) ----------- Lua5.1 実行結果
これで行ける。

実行には、
先月(2017-04-17)の記事「call_Lua 似非モジュール:Lua51 汎用・決定版
で作った「Lua51_Gen.lua」も必要。


本日はここまで。


tcc ( Tiny C Compiler ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170330
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク