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);
49 *start = '\0'; /* Avoid call to memmove. */
51 SvCUR_set(data->datasv, len);
54 /* Attempt to read more data. */
56 result = FILTER_READ (data->idx + 1, data->datasv, BYTELOADER_BUFFER);
58 start = SvPV (data->datasv, len);
59 } while (result > 0 && len < wanted);
60 /* Loop while not (EOF || error) and short reads */
62 /* If not enough data read, truncate copy */
68 memcpy (buf, start + data->next_out, wanted);
69 data->next_out += wanted;
76 byteloader_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
78 OP *saveroot = PL_main_root;
79 OP *savestart = PL_main_start;
80 struct byteloader_state bstate;
81 struct byteloader_fdata data;
87 data.datasv = FILTER_DATA(idx);
90 bstate.bs_fdata = &data;
91 bstate.bs_obj_list = Null(void**);
92 bstate.bs_obj_list_fill = -1;
93 bstate.bs_sv = Nullsv;
94 bstate.bs_iv_overflows = 0;
97 if (byterun(aTHX_ &bstate)
98 && (len = SvCUR(data.datasv) - (STRLEN)data.next_out))
100 PerlIO_seek(PL_rsfp, -len, SEEK_CUR);
103 filter_del(byteloader_filter);
108 PL_eval_start = PL_main_start;
110 o = newSVOP(OP_CONST, 0, newSViv(1));
111 PL_eval_root = newLISTOP(OP_LINESEQ, 0, PL_main_root, o);
112 PL_main_root->op_next = o;
113 PL_eval_root = newUNOP(OP_LEAVEEVAL, 0, PL_eval_root);
114 o->op_next = PL_eval_root;
116 PL_main_root = saveroot;
117 PL_main_start = savestart;
123 MODULE = ByteLoader PACKAGE = ByteLoader
128 import(package="ByteLoader", ...)
131 SV *sv = newSVpvn ("", 0);
134 croak ("Could not allocate ByteLoader buffers");
135 filter_add(byteloader_filter, sv);