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

前端之家收集整理的这篇文章主要介绍了使旧的库与Perl XS和PerlIO一起使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是一个XS初学者,我正在考虑更改现有的XS模块,该模块大量使用15年历史的底层C库(实际上该模块基本上只是这个库的粘合剂).问题是我希望能够使用PerlIO字符串技巧:
open($fh,'<',\$string);

然后将$fh传递给库需要FILE的XS胶水.问题是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行为中获取文件句柄吗?

解决方法

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

猜你在找的Perl相关文章