2013-06-05 9 views
8

के साथ पुरानी लाइब्रेरी का काम करना मैं एक एक्सएस शुरुआती हूं और मैं एक मौजूदा एक्सएस मॉड्यूल को बदलने की सोच रहा हूं जो 15+ वर्षीय अंतर्निहित सी लाइब्रेरी का उपयोग करता है (वास्तव में मॉड्यूल मूल रूप से केवल गोंद है यह पुस्तकालय)।पर्ल एक्सएस और पर्लियो

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

और फिर XS गोंद जहां पुस्तकालय FILE उम्मीद कर रही है करने के लिए $fh पारित: समस्या यह है कि मैं की तरह PerlIO स्ट्रिंग प्रवंचना का उपयोग करने में सक्षम होना चाहते हैं। समस्या यह है कि 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 को बदलकर स्ट्रिंग्स पर्लियो व्यवहार से छद्म-फ़ाइलहेडल प्राप्त कर सकता हूं?

उत्तर

3

पर्ल एपीआई PerlIO_exportFILE() (Implementation) प्रदान करता है जो एक PerlIO एक stdio FILE सूचक के लिए एक फ़ाइल वर्णनकर्ता के साथ संभाल बदल सकते हैं। चूंकि PerlIO::Scalar फ़ाइल डिस्क्रिप्टर के बिना "इन-मेमोरी" फ़ाइल हैंडल है, रूपांतरण सफल नहीं हो सकता है। PerlIO::Scalar हैंडल को पास करने का एकमात्र पोर्टेबल तरीका इसे अस्थायी फ़ाइल में फ़्लश करना होगा। बीएसडी कार्यान्वयन, funopen(3) जैसे कॉलबैक का समर्थन करने वाले स्टडीओ का उपयोग करने के लिए कम पोर्टेबल तरीका होगा।

संबंधित मुद्दे