これから、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.