74 assert(len > job->scoop_avail);
76 if (job->scoop_alloc < len) {
80 for (newsize = 64; newsize < len; newsize <<= 1) ;
81 newbuf = rs_alloc(newsize,
"scoop buffer");
83 memcpy(newbuf, job->scoop_next, job->scoop_avail);
86 job->
scoop_buf = job->scoop_next = newbuf;
87 rs_trace(
"resized scoop buffer to " FMT_SIZE
" bytes from " FMT_SIZE
"",
88 newsize, job->scoop_alloc);
89 job->scoop_alloc = newsize;
90 }
else if (job->
scoop_buf != job->scoop_next) {
92 rs_trace(
"moving scoop " FMT_SIZE
" bytes to reuse " FMT_SIZE
" bytes",
93 job->scoop_avail, (
size_t)(job->scoop_next - job->
scoop_buf));
94 memmove(job->
scoop_buf, job->scoop_next, job->scoop_avail);
99 tocopy = len - job->scoop_avail;
102 assert(tocopy + job->scoop_avail <= job->scoop_alloc);
104 memcpy(job->scoop_next + job->scoop_avail, stream->
next_in, tocopy);
105 rs_trace(
"accepted " FMT_SIZE
" bytes from input to scoop", tocopy);
106 job->scoop_avail += tocopy;
126 if (job->scoop_avail) {
128 rs_trace(
"advance over " FMT_SIZE
" bytes from scoop", len);
129 assert(len <= job->scoop_avail);
130 job->scoop_avail -= len;
131 job->scoop_next += len;
133 rs_trace(
"advance over " FMT_SIZE
" bytes from input buffer", len);
134 assert(len <= stream->avail_in);
155 if (!job->scoop_avail && stream->
avail_in >= len) {
158 rs_trace(
"got " FMT_SIZE
" bytes direct from input", len);
160 }
else if (job->scoop_avail < len && stream->
avail_in) {
162 rs_trace(
"scoop has less than " FMT_SIZE
" bytes, scooping from "
163 FMT_SIZE
" input bytes", len, stream->
avail_in);
166 if (job->scoop_avail >= len) {
168 rs_trace(
"scoop has at least " FMT_SIZE
" bytes, this is enough",
170 *ptr = job->scoop_next;
172 }
else if (stream->
eof_in) {
174 rs_trace(
"reached end of input stream");
178 rs_trace(
"blocked with insufficient input data");
212 *len = job->scoop_avail + stream->
avail_in;
225 return job->scoop_avail + job->stream->
avail_in;