これから、XSUB でどのように Perl の変数 $host
をアクセスするかを
示します。 perl_get_sv()
という関数が、内部的に `SV' (スカラ
変数) といわれている変数へのポインタを得るために使用されます。変数の名前
には、パッケージ名 RPC が付け加えられますので、 perl_get_sv()
で
$host がどのパッケージにあるかがわかります。パッケージ名がないときには、
perl_get_sv()
では、パッケージ main
で変数を探すことになり
ます。それから、`SV' の内容への char*
ポインタを取得するため、
マクロ SvPVX()
を使って `SV' の被参照を行ないます。
void rpcb_gettime() PPCODE: { char *host; SV *hostsv; time_t timep; hostsv = perl_get_sv( "RPC::host", FALSE ); if( hostsv != NULL ){ host = SvPVX( hostsv ); if( rpcb_gettime( host, &timep ) ) PUSHs(sv_2mortal(newSVnv(timep))); } }
この XSUB を呼ぶためには、次のような Perl コードを使います。
$RPC::host = "localhost"; $timep = rpcb_gettime();
上記の例では、`SV' に C の char*
が入っていましたが、Perl の
スカラ変数には、数値やリファレンスも入れることができます。`SV' に C
の int
が入っているときには、`SV' の被参照にマクロ
SvIVX()
を使い、C の double
が入っているときには、
SvNVX()
を使います。
`SV' が Perl のリファレンスのときには、`SV' の被参照にマクロ
SvRV()
が使えます。結果は実際の Perl の変数を指す別の `SV'と
なります。これは、 SvPVX()
、 SvNVX()
、 SvIVX()
で
被参照することができます。次の XSUB では、 SvRV()
を使っています。
void rpcb_gettime() PPCODE: { char *host; SV *rv; SV *hostsv; time_t timep; rv = perl_get_sv( "RPC::host", FALSE ); if( rv != NULL ){ hostsv = SvRV( rv ); host = SvPVX( hostsv ); if( rpcb_gettime( host, &timep ) ) PUSHs(sv_2mortal(newSVnv(timep))); } }
次の Perl コードは、 $MY::host
へのリファレンスとなる、変数
$RPC::host を生成します。変数 $MY::host には、使用するホスト
名が入っています。
$MY::host = "localhost"; $RPC::host = \$MY::host; $timep = rpcb_gettime();
perl_get_sv()
の第 2 引数は、上の例に示したように、通常は
`FALSE' にします。この引数を `TRUE' とすると、変数が存在しない
ときに、生成するようになります。空の `SV' かも知れないものを扱うた
めに段階を踏むのでなければ、 `TRUE' は使用すべきではありません。
XSUB では、Per の配列値、ハッシュ値、コード値をアクセスするために、
perl_get_av()
、 perl_get_hv()
、 perl_get_cv()
を
使うことができます。
Go to the first, previous, next, last section, table of contents.