我宁愿一个XS初学者,我期待到改变其采用了15+岁的底层C库大量现有的XS模块(其实模块基本上是粘合到该库).问题是我希望能够使用PerlIO字符串技巧:
open($fh, '<', \$string);
Run Code Online (Sandbox Code Playgroud)
然后传递$fh
到库所期望的XS胶水FILE
.问题是XS有:
int
_parse (entry_ref, filename, file, preserve=FALSE)
SV * entry_ref;
char * filename;
FILE * file;
boolean preserve;
Run Code Online (Sandbox Code Playgroud)
我认为它需要是:
PerlIO * file;
Run Code Online (Sandbox Code Playgroud)
这当然不起作用,因为它必须有更多.当我查看_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;
Run Code Online (Sandbox Code Playgroud)
FILE
再次与类型.现在我必须要开始的基本问题是 - 这是否可以在不改变库的情况下实现; 也就是说,我可以通过更改XS从字符串PerlIO行为中获取伪文件句柄吗?
Perl API 提供PerlIO_exportFILE()
(实现),可以将带有文件描述符的 PerlIO 句柄转换为 stdioFILE
指针。由于PerlIO::Scalar是一个没有文件描述符的“内存中”文件句柄,因此转换无法成功。传递句柄的唯一可移植方法PerlIO::Scalar
是将其刷新到临时文件。不太可移植的方法是使用支持回调的 stdio,例如 BSD 实现funopen(3)。