我是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)。