2013-06-05 16 views
8

私はむしろXSの初心者です。15歳以上のC言語ライブラリを使用している既存のXSモジュールを大きく変更しようとしています。このライブラリ)。Perl XSとPerlIOで古いライブラリを使用する

open($fh, '<', \$string); 

、その後、ライブラリはFILEを期待しているXS接着剤に$fhを渡す:問題は、私は同じようPerlIOを文字列の策略を使用できるようにしたいと思いますということです。問題は、XSが持っているということです。

int 
_parse (entry_ref, filename, file, preserve=FALSE) 
    SV * entry_ref; 
    char * filename; 
    FILE * file; 
    boolean preserve; 

を、私はそれが必要であることを前提としています

PerlIO * file; 

よりもそれによりがなければならないので、これは当然のことながら動作しません。再びFILEタイプで

AST * bt_parse_entry (FILE * infile, 
         char * filename, 
         btshort options, 
         boolean * status) 
{ 
    AST *   entry_ast = NULL; 
    static int * err_counts = NULL; 
    static FILE * prev_file = NULL; 

:私は図書館で_parseコードを見たとき、それはで終わります。今私が始めなければならない基本的な質問は、ライブラリを変更することなくこれを可能にすることです。つまり、XSを変更するだけで、PerlIOの文字列から疑似ファイルハンドルを取得できますか?

答えて

3

Perl APIは、ファイルディスクリプタ付きPerlIOハンドルをstdio FILEポインタに変換できるPerlIO_exportFILE()Implementation)を提供します。 PerlIO::Scalarはファイルディスクリプタのない「メモリ内の」ファイルハンドルなので、変換は成功できません。​​3210ハンドルを渡す唯一の移植可能な方法は、それを一時ファイルにフラッシュすることです。移植性の低い方法は、BSD実装のようなコールバックをサポートするstdio(funopen(3))を使用することです。

関連する問題