gpt4 book ai didi

perl - 使用 Perl XS 和 PerlIO 使旧库工作

转载 作者:行者123 更新时间:2023-12-04 08:44:50 25 4
gpt4 key购买 nike

我是一个 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 行为中获取伪文件句柄吗?

最佳答案

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

关于perl - 使用 Perl XS 和 PerlIO 使旧库工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16935660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com