2013-06-05 14 views
8

Tôi là một người mới bắt đầu sử dụng XS và tôi đang tìm cách thay đổi mô-đun XS hiện có sử dụng thư viện C cũ hơn 15 năm. thư viện này). Vấn đề là tôi muốn để có thể sử dụng PerlIO chuỗi lừa đảo như:Làm cho một thư viện cũ hoạt động với Perl XS và PerlIO

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

và sau đó vượt qua $fh để keo XS nơi thư viện được mong đợi FILE. Vấn đề là các XS có:

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

và tôi cho rằng nó cần phải được:

PerlIO * file; 

này không làm việc tất nhiên là phải có nhiều điều hơn thế. Khi tôi nhìn vào _parse mã trong thư viện, nó kết thúc trong:

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; 

với FILE loại một lần nữa. Bây giờ câu hỏi cơ bản tôi phải bắt đầu là - điều này thậm chí có thể được mà không thay đổi thư viện; có nghĩa là, tôi có thể nhận được pseudo-filehandle từ chuỗi hành vi PerlIO chỉ bằng cách thay đổi XS?

Trả lời

3

API Perl cung cấp PerlIO_exportFILE() (Implementation) mà có thể chuyển đổi một PerlIO xử lý với một bộ mô tả tập tin vào một stdio FILE con trỏ. Vì PerlIO::Scalar là một bộ xử lý "trong bộ nhớ" mà không có một bộ mô tả tập tin, việc chuyển đổi không thể thành công. Cách di động duy nhất để vượt qua xử lý PerlIO::Scalar sẽ là xóa nó sang tệp tạm thời. Cách ít di động hơn là sử dụng một stdio hỗ trợ gọi lại, như việc triển khai BSD, funopen(3).

Các vấn đề liên quan