2013-06-05 45 views
8

我更喜歡XS初學者,我正在考慮更改現有的使用15年以上底層C庫的XS模塊(實際上,該模塊基本上只是粘合到這個庫)。問題是,我想能夠使用PerlIO的串掛羊頭賣狗肉,如:使用Perl XS和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; 

這並不當然作爲工作必須有比這更給它。

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類型又說:當我看到在圖書館_parse代碼,它結束了。現在我必須從最基本的問題開始 - 這甚至可以不改變圖書館;也就是說,我可以通過更改XS從字符串PerlIO行爲獲得僞文件句柄嗎?

回答

3

Perl API提供了PerlIO_exportFILE()Implementation),它可以將一個帶有文件描述符的PerlIO句柄轉換成指針stdio FILE。由於PerlIO::Scalar是沒有文件描述符的「內存中」文件句柄,因此轉換無法成功。通過​​3210句柄的唯一便攜方式是將其刷新爲臨時文件。不便攜的方式是使用支持回調的stdio,如BSD實現funopen(3)