Skip processing a file if the file to be opened is '-'
[p5sagit/p5-mst-13.2.git] / ext / ByteLoader / ByteLoader.xs
index 98053c7..c9d7d16 100644 (file)
@@ -1,35 +1,40 @@
+#define PERL_NO_GET_CONTEXT
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
+#include "byterun.h"
 
-#include "byterun.c"
-
-/* defgv must be accessed differently under threaded perl */
-/* DEFSV et al are in 5.004_56 */
-#ifndef DEFSV
-#define DEFSV          GvSV(defgv)
+#ifdef NEED_FGETC_PROTOTYPE
+extern int fgetc();
+#endif
+#ifdef NEED_FREAD_PROTOTYPE
+extern int fread();
 #endif
 
+static void
+freadpv(U32 len, void *data, XPV *pv)
+{
+    dTHX;
+    New(666, pv->xpv_pv, len, char);
+    PerlIO_read((PerlIO*)data, (void*)pv->xpv_pv, len);
+    pv->xpv_len = len;
+    pv->xpv_cur = len - 1;
+}
+
 static I32
-#ifdef PERL_OBJECT
-byteloader_filter(CPerlObj *pPerl, int idx, SV *buf_sv, int maxlen)
-#else
-byteloader_filter(int idx, SV *buf_sv, int maxlen)
-#endif
+byteloader_filter(pTHXo_ int idx, SV *buf_sv, int maxlen)
 {
+    dTHR;
     OP *saveroot = PL_main_root;
     OP *savestart = PL_main_start;
-
-#ifdef INDIRECT_BGET_MACROS
-    struct bytesream bs;
+    struct bytestream bs;
 
     bs.data = PL_rsfp;
-    bs.fgetc = (int(*) _((void*)))fgetc;
-    bs.fread = (int(*) _((char*,size_t,size_t,void*)))fread;
-    bs.freadpv = freadpv;
-#else
-    byterun(PL_rsfp);
-#endif
+    bs.pfgetc = (int(*) (void*))fgetc;
+    bs.pfread = (int(*) (char*,size_t,size_t,void*))fread;
+    bs.pfreadpv = freadpv;
+
+    byterun(aTHXo_ bs);
 
     if (PL_in_eval) {
         OP *o;