72 assert(len > job->scoop_avail);
74 if (job->scoop_alloc < len) {
78 for (newsize = 64; newsize < len; newsize <<= 1) ;
79 newbuf = rs_alloc(newsize,
"scoop buffer");
81 memcpy(newbuf, job->scoop_next, job->scoop_avail);
84 job->
scoop_buf = job->scoop_next = newbuf;
85 rs_trace(
"resized scoop buffer to " FMT_SIZE
" bytes from " FMT_SIZE
"",
86 newsize, job->scoop_alloc);
87 job->scoop_alloc = newsize;
88 }
else if (job->
scoop_buf != job->scoop_next) {
90 rs_trace(
"moving scoop " FMT_SIZE
" bytes to reuse " FMT_SIZE
" bytes",
91 job->scoop_avail, (
size_t)(job->scoop_next - job->
scoop_buf));
92 memmove(job->
scoop_buf, job->scoop_next, job->scoop_avail);
97 tocopy = len - job->scoop_avail;
100 assert(tocopy + job->scoop_avail <= job->scoop_alloc);
102 memcpy(job->scoop_next + job->scoop_avail, stream->
next_in, tocopy);
103 rs_trace(
"accepted " FMT_SIZE
" bytes from input to scoop", tocopy);
104 job->scoop_avail += tocopy;
124 if (job->scoop_avail) {
126 rs_trace(
"advance over " FMT_SIZE
" bytes from scoop", len);
127 assert(len <= job->scoop_avail);
128 job->scoop_avail -= len;
129 job->scoop_next += len;
131 rs_trace(
"advance over " FMT_SIZE
" bytes from input buffer", len);
132 assert(len <= stream->avail_in);
153 if (!job->scoop_avail && stream->
avail_in >= len) {
156 rs_trace(
"got " FMT_SIZE
" bytes direct from input", len);
158 }
else if (job->scoop_avail < len && stream->
avail_in) {
160 rs_trace(
"scoop has less than " FMT_SIZE
" bytes, scooping from "
161 FMT_SIZE
" input bytes", len, stream->
avail_in);
164 if (job->scoop_avail >= len) {
166 rs_trace(
"scoop has at least " FMT_SIZE
" bytes, this is enough",
168 *ptr = job->scoop_next;
170 }
else if (stream->
eof_in) {
172 rs_trace(
"reached end of input stream");
176 rs_trace(
"blocked with insufficient input data");
216 *len = job->scoop_avail + stream->
avail_in;
229 return job->scoop_avail + job->stream->
avail_in;