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