我是一个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).