Inline::Cで学ぶperlguts(その8)

ハッシュリファレンスを使わないと引数が多くなってしまうので、
前回に引き続き、調べたことをメモ。

use v5.14;
use strict;
use warnings;
use Data::Dumper;

use Inline C => q{
    #include <stdio.h>

    SV * hoge(SV *params)
    {
        if ( SvROK(params) == 0 ) {
            printf( "error!\n" );
            return newSViv( -1 );
        }

        IV foo = 0, bar = 0;
        HV *hv = (HV *)SvRV( params );
        SV **pp = NULL;

        pp = hv_fetch( hv, "foo", strlen("foo"), 0 );
        if ( pp ) {
            foo = SvIV( *pp );
        }
        else {
            printf( "foo not exist!\n" );
            return newSViv( -1 );
        }

        pp = hv_fetch( hv, "bar", strlen("bar"), 0 );
        if ( pp ) {
            bar = SvIV( *pp );
        }
        else {
            printf( "bar not exist!\n" );
            return newSViv( -1 );
        }

        return newSViv( foo * bar );
    }
};

say "Error pattern!";
say hoge( +{} );
say "=-=-=-=-=-=-=-=-=-=";
say "OK pattern!";
say hoge( +{
    foo => 2,
    bar => 3
} );

実行するとこんな感じ。

$ perl aaa.pl
Error pattern!
foo not exist!
-1
=-=-=-=-=-=-=-=-=-=
OK pattern!
6

ハッシュリファレンスでいくつかの値を入力して、
一応、有無のチェックを行って、処理した結果を返している。

実際は、Inline-Cで定義している関数はオープンにしないので、
もっとラフに書く予定。

おしまい!

Leave a Comment