Dump UVs as UVs in Data::Dumper.
[p5sagit/p5-mst-13.2.git] / ext / ByteLoader / ByteLoader.xs
index dd300be..7c3746b 100644 (file)
@@ -1,23 +1,38 @@
+#define PERL_NO_GET_CONTEXT
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
 #include "byterun.h"
 
+static int
+xgetc(PerlIO *io)
+{
+    dTHX;
+    return PerlIO_getc(io);
+}
+
+static int
+xfread(char *buf, size_t size, size_t n, PerlIO *io)
+{
+    dTHX;
+    int i = PerlIO_read(io, buf, n * size);
+    if (i > 0)
+       i /= size;
+    return i;
+}
+
 static void
 freadpv(U32 len, void *data, XPV *pv)
 {
+    dTHX;
     New(666, pv->xpv_pv, len, char);
-    fread(pv->xpv_pv, 1, len, (FILE*)data);
+    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;
@@ -25,11 +40,11 @@ byteloader_filter(int idx, SV *buf_sv, int maxlen)
     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;
+    bs.pfgetc = (int(*) (void*))xgetc;
+    bs.pfread = (int(*) (char*,size_t,size_t,void*))xfread;
+    bs.pfreadpv = freadpv;
 
-    byterun(bs);
+    byterun(aTHXo_ bs);
 
     if (PL_in_eval) {
         OP *o;