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;
Description of input and output buffers.
rs_result rs_scoop_read_rest(rs_job_t *job, size_t *len, void **ptr)
Read whatever data remains in the input stream.
size_t rs_scoop_total_avail(rs_job_t *job)
Return the total number of bytes available including the scoop and input buffer.
void rs_scoop_input(rs_job_t *job, size_t len)
Try to accept a from the input buffer to get LEN bytes in the scoop.
size_t avail_in
Number of bytes available at next_in.
Public header for librsync.
char * next_in
Next input byte.
rs_result
Return codes from nonblocking rsync operations.
Unexpected end of input file, perhaps due to a truncated file or dropped network connection.
Blocked waiting for more data.
rs_result rs_scoop_read(rs_job_t *job, size_t len, void **ptr)
Read LEN bytes if possible, and remove them from the input scoop.
rs_byte_t * scoop_buf
Buffer of data in the scoop.
int eof_in
True if there is no more data after this.
rs_result rs_scoop_readahead(rs_job_t *job, size_t len, void **ptr)
Read from scoop without advancing.
void rs_scoop_advance(rs_job_t *job, size_t len)
Advance the input cursor forward len bytes.
of this structure are private.