使旧的库与Perl XS和PerlIO一起使用

时间:2013-06-05 08:59:58

标签: perl xs perl-io

我是一名XS初学者,我正在考虑更改现有的XS模块,该模块大量使用15年以上的底层C库(实际上该模块基本上只是这个库的粘合剂)。问题是我希望能够使用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行为中获取伪文件句柄吗?

1 个答案:

答案 0 :(得分:3)

Perl API提供PerlIO_exportFILE()Implementation),它可以将带有文件描述符的PerlIO句柄转换为stdio FILE指针。由于PerlIO::Scalar是&#34;内存中&#34;没有文件描述符的文件句柄转换不能成功。传递PerlIO::Scalar句柄的唯一可移植方法是将其刷新到临时文件。使用支持回调的stdio(如BSD实现,funopen(3))的可移植性较低。