使旧的库与Perl XS和PerlIO一起使用
发布时间:2020-12-15 21:50:43 所属栏目:大数据 来源:网络整理
导读:我是一个XS初学者,我正在考虑更改现有的XS模块,该模块大量使用15年历史的底层C库(实际上该模块基本上只是这个库的粘合剂).问题是我希望能够使用PerlIO字符串技巧: open($fh,'',$string); 然后将$fh传递给库需要FILE的XS胶水.问题是XS有: int_parse (entry
我是一个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).
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |