This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
OS/2 socket fixes.
[perl5.git] / ext / ByteLoader / ByteLoader.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4 #include "byterun.h"
5
6 static void
7 freadpv(U32 len, void *data, XPV *pv)
8 {
9     New(666, pv->xpv_pv, len, char);
10     fread(pv->xpv_pv, 1, len, (FILE*)data);
11     pv->xpv_len = len;
12     pv->xpv_cur = len - 1;
13 }
14
15 static I32
16 #ifdef PERL_OBJECT
17 byteloader_filter(CPerlObj *pPerl, int idx, SV *buf_sv, int maxlen)
18 #else
19 byteloader_filter(int idx, SV *buf_sv, int maxlen)
20 #endif
21 {
22     dTHR;
23     OP *saveroot = PL_main_root;
24     OP *savestart = PL_main_start;
25     struct bytestream bs;
26
27     bs.data = PL_rsfp;
28     bs.fgetc = (int(*) _((void*)))fgetc;
29     bs.fread = (int(*) _((char*,size_t,size_t,void*)))fread;
30     bs.freadpv = freadpv;
31
32     byterun(bs);
33
34     if (PL_in_eval) {
35         OP *o;
36
37         PL_eval_start = PL_main_start;
38
39         o = newSVOP(OP_CONST, 0, newSViv(1));
40         PL_eval_root = newLISTOP(OP_LINESEQ, 0, PL_main_root, o);
41         PL_main_root->op_next = o;
42         PL_eval_root = newUNOP(OP_LEAVEEVAL, 0, PL_eval_root);
43         o->op_next = PL_eval_root;
44     
45         PL_main_root = saveroot;
46         PL_main_start = savestart;
47     }
48
49     return 0;
50 }
51
52 MODULE = ByteLoader             PACKAGE = ByteLoader
53
54 PROTOTYPES:     ENABLE
55
56 void
57 import(...)
58   PPCODE:
59     filter_add(byteloader_filter, NULL);
60
61 void
62 unimport(...)
63   PPCODE:
64     filter_del(byteloader_filter);