3

Perl XS は初めてで、C 関数を Perl サブルーチンに変換しようとしています。

次のC関数があります

void parse(struct parser *result, const char *string, size_t len);

このparse関数は、へのポインタstruct parser、文字列、および文字列の長さを受け入れます。struct parserは次のように定義されています。

struct parser {
    char *data;
    long  a;
    long  b;
    long  c;
};

関数はその結果をresult引数に格納します。

この関数を Perl XS に変換したいと考えています。私がやっていることは次のようなものです:

struct parser *result
parse_xs (string)
    const char* string
PREINIT:
    long len = strlen(string);
CODE:
    struct parser par;
    parse(&par,s,len);
    RETVAL = par;
OUTPUT:
    RETVAL  

parse_xsこのようなPerlコードで実行するように上記のコードを変更するにはどうすればよいですか

my $result = parse_xs();

print $result->data; # will print the data field from the struct.

はC 関数$resultの結果です。parse

4

2 に答える 2

2

C 構造体を Perl オブジェクトとして使用できます。次のページを参照してください (このページは日本語ですが、ソースコードは理解できるかもしれません)。

http://d.hatena.ne.jp/perlcodesample/20140807/1407291461

// creat struct as pointer
Point* point = (Point*)malloc(sizeof(Point));
point->x = x;
point->y = y;


// Convert pointer to size_t
size_t point_iv = PTR2IV(point);

// Convert size_t to SV*
SV* point_sv = sv_2mortal(newSViv(point_iv));

// Create reference to SV*
SV* point_svrv = sv_2mortal(newRV_inc(point_sv));

// Create Object
SV* point_obj = sv_bless(point_svrv, gv_stashpv(class_name, 1));
于 2014-08-06T07:06:00.023 に答える