8

私はむしろ XS の初心者であり、15 年以上前の基になる C ライブラリを大量に使用する既存の XS モジュールを変更することを検討しています (実際、モジュールは基本的にこのライブラリに接着されています)。問題は、次のような PerlIO 文字列トリックを使用できるようにしたいということです。

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

$fh次に、ライブラリが予期している XS グルーに渡しFILEます。問題は、XS には次のようなものがあることです。

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

そして、私はそれが必要であると仮定します:

PerlIO *  file;

それ以上のことが必要なので、これはもちろん機能しません。_parseライブラリのコードを見ると、次のようになります。

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;

FILE再び型で。今私が始めなければならない基本的な質問は - これはライブラリを変更しなくても可能ですか?つまり、XS を変更するだけで、文字列 PerlIO の動作から疑似ファイルハンドルを取得できますか?

4

1 に答える 1

3

Perl API は、ファイル記述子を持つ PerlIO ハンドルを stdioポインターに変換できるPerlIO_exportFILE()(実装) を提供します。PerlIO::Scalarはファイル記述子のない「メモリ内」ファイル ハンドルであるため、変換は成功しませんFILE。ハンドルを渡す唯一の移植可能な方法は、ハンドルを一時ファイルにフラッシュすることです。移植性の低い方法は、BSD 実装のfunopen(3)など、コールバックをサポートする stdio を使用することです。PerlIO::Scalar

于 2013-06-09T20:57:39.303 に答える