関数の異常を示すために、状態変数を別に用意するよりも、単に`undef'
値や空リストを返したい場合があります。 rpcb_gettime() 関数を、そ
のような場合にあてはめてみましょう。この関数がうまくいったときには、時刻
を返し、問題があったときには、 `undef' 値を返すようにしてみましょう。
次の Perl コードでは、 $timep の値が `u' か有効な時刻のどちら
かになることになります。
$timep = rpcb_gettime( "localhost" );
次の XSUB では、関数型に void を用いて、RETVAL 変数を作らないよう
にし、 CODE: ブロックを使って、必要なコードはすべて用意しているこ
とをコンパイラに示しています。 sv_newmortal() の呼び出しで返却値
を `undef' で初期化し、これをデフォルトの返却値としています。
void
rpcb_gettime(host)
char * host
CODE:
{
time_t timep;
bool_t x;
ST(0) = sv_newmortal();
if( rpcb_gettime( host, &timep ) )
sv_setnv( ST(0), (double)timep);
}
次の例では必要となったときに、明示的に `undef' 値を返却値として設定 する方法を示します。
void
rpcb_gettime(host)
char * host
CODE:
{
time_t timep;
bool_t x;
ST(0) = sv_newmortal();
if( rpcb_gettime( host, &timep ) ){
sv_setnv( ST(0), (double)timep);
}
else{
ST(0) = &sv_undef;
}
}
空リストを返すには、 PPCODE: ブロックを使ったうえで、スタック上に
返却値を積まないでおきます。
void
rpcb_gettime(host)
char * host
PPCODE:
{
time_t timep;
if( rpcb_gettime( host, &timep ) )
PUSHs(sv_2mortal(newSVnv(timep)));
else{
/* スタックに何も積まないので、 */
/* 暗黙のうちに空リストが返される。 */
}
}
Go to the first, previous, next, last section, table of contents.