让旧的库适配Perl XS和PerlIO

8

我是一名XS初学者,目前正在研究修改一个使用了15年以上C库的现有XS模块(实际上,该模块基本上只是将这个库粘合在一起)。问题是,我希望能够像下面这样使用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行为的伪文件句柄?

1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接