6 /* Something arbitary for a buffer size */
7 #define BYTELOADER_BUFFER 8096
10 bl_getc(struct byteloader_fdata *data)
13 if (SvCUR(data->datasv) <= (STRLEN)data->next_out) {
15 /* Run out of buffered data, so attempt to read some more */
16 *(SvPV_nolen (data->datasv)) = '\0';
17 SvCUR_set (data->datasv, 0);
19 result = FILTER_READ (data->idx + 1, data->datasv, BYTELOADER_BUFFER);
21 /* Filter returned error, or we got EOF and no data, then return EOF.
22 Not sure if filter is allowed to return EOF and add data simultaneously
23 Think not, but will bullet proof against it. */
24 if (result < 0 || SvCUR(data->datasv) == 0)
26 /* Else there must be at least one byte present, which is good enough */
29 return *((U8 *) SvPV_nolen (data->datasv) + data->next_out++);
33 bl_read(struct byteloader_fdata *data, char *buf, size_t size, size_t n)
38 size_t wanted = size * n;
40 start = SvPV (data->datasv, len);
41 if (len < (data->next_out + wanted)) {
44 /* Shuffle data to start of buffer */
45 len -= data->next_out;
47 memmove (start, start + data->next_out, len + 1);
48 SvCUR_set (data->datasv, len);
50 *start = '\0'; /* Avoid call to memmove. */
51 SvCUR_set (data->datasv, 0);
55 /* Attempt to read more data. */
57 result = FILTER_READ (data->idx + 1, data->datasv, BYTELOADER_BUFFER);
59 start = SvPV (data->datasv, len);
60 } while (result > 0 && len < wanted);
61 /* Loop while not (EOF || error) and short reads */
63 /* If not enough data read, truncate copy */
69 memcpy (buf, start + data->next_out, wanted);
70 data->next_out += wanted;
77 byteloader_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
79 OP *saveroot = PL_main_root;
80 OP *savestart = PL_main_start;
81 struct byteloader_state bstate;
82 struct byteloader_fdata data;
86 data.datasv = FILTER_DATA(idx);
89 bstate.bs_fdata = &data;
90 bstate.bs_obj_list = Null(void**);
91 bstate.bs_obj_list_fill = -1;
92 bstate.bs_sv = Nullsv;
93 bstate.bs_iv_overflows = 0;
96 if (byterun(aTHX_ &bstate)
97 && (len = SvCUR(data.datasv) - (STRLEN)data.next_out))
99 PerlIO_seek(PL_rsfp, -len, SEEK_CUR);
102 filter_del(byteloader_filter);
107 PL_eval_start = PL_main_start;
109 o = newSVOP(OP_CONST, 0, newSViv(1));
110 PL_eval_root = newLISTOP(OP_LINESEQ, 0, PL_main_root, o);
111 PL_main_root->op_next = o;
112 PL_eval_root = newUNOP(OP_LEAVEEVAL, 0, PL_eval_root);
113 o->op_next = PL_eval_root;
115 PL_main_root = saveroot;
116 PL_main_start = savestart;
122 MODULE = ByteLoader PACKAGE = ByteLoader
127 import(package="ByteLoader", ...)
130 SV *sv = newSVpvn ("", 0);
133 croak ("Could not allocate ByteLoader buffers");
134 filter_add(byteloader_filter, sv);