【问题标题】:Making an old library work with Perl XS and PerlIO使用 Perl XS 和 PerlIO 使旧库工作
【发布时间】:2013-05-31 21:37:54
【问题描述】:

我是一个 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 xs perl-io


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2012-06-21
      • 1970-01-01
      • 2015-03-21
      相关资源
      最近更新 更多