2013-06-05 24 views
8

ile eski bir kütüphane çalışması yapmak Daha ziyade bir XS başlangıççıyım ve 15 + yaşındaki temel C kütüphanesini kullanan mevcut bir XS modülünü ağır bir şekilde değiştirmeyi düşünüyorum (aslında modül temelde sadece bu kütüphane). Kütüphane FILE bekliyor XS tutkal için $fh geçmesi ardındanPerl XS ve Perlio

open($fh, '<', \$string); 

ve: Sorun gibi PerlIO dize hile kullanabilmek için istiyorum olmasıdır. Sorun XS olmasıdır:

int 
_parse (entry_ref, filename, file, preserve=FALSE) 
    SV * entry_ref; 
    char * filename; 
    FILE * file; 
    boolean preserve; 

ve bunu olması gerektiğini varsayalım: bundan daha fazla olması gerekir gibi bu tabii çalışmıyor

PerlIO * file; 

. Yine

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; 

ile FILE türleri: Ben kütüphanede _parse koduna baktığımızda, bu kadar biter. Şimdi başlamak zorunda olduğum temel soru şu: kütüphaneyi değiştirmeden bile bu mümkün; Yani, sadece XS değiştirerek dizeleri PerlIO davranışından sözde-filehandle alabilir miyim?

cevap

3

Perl API'sı, bir Perlio tanıtıcısını bir dosya tanıtıcısıyla bir stdio FILE işaretçisine dönüştürebilen PerlIO_exportFILE() (Implementation) sağlar. PerlIO::Scalar dosya tanıtıcısı olmayan bir "bellek içi" dosya tanıtıcısı olduğundan, dönüştürme başarılı olamaz. PerlIO::Scalar tanıtıcısını geçirmenin tek taşınabilir yolu, dosyayı geçici bir dosyaya akıtmak olacaktır. Daha az taşınabilir yol BSD uygulaması, funopen(3) gibi geri aramaları destekleyen bir stdio kullanmak olacaktır.