vcs-svn: make buffer_copy_bytes return length read

Currently buffer_copy_bytes does not report to its caller whether
it encountered an early end of file.

Add a return value representing the number of bytes read (but not
the number of bytes copied).  This way all three unusual conditions
can be distinguished: input error with buffer_ferror, output error
with ferror(outfile), early end of input by checking the return
value.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: David Barr <david.barr@cordelta.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
This commit is contained in:
Jonathan Nieder 2010-12-28 04:26:17 -06:00
parent d234f54b2f
commit 26557fc1b3
2 changed files with 11 additions and 10 deletions

View File

@ -104,20 +104,20 @@ void buffer_read_binary(struct line_buffer *buf,
strbuf_fread(sb, size, buf->infile); strbuf_fread(sb, size, buf->infile);
} }
void buffer_copy_bytes(struct line_buffer *buf, off_t len) off_t buffer_copy_bytes(struct line_buffer *buf, off_t nbytes)
{ {
char byte_buffer[COPY_BUFFER_LEN]; char byte_buffer[COPY_BUFFER_LEN];
uint32_t in; off_t done = 0;
while (len > 0 && !feof(buf->infile) && !ferror(buf->infile)) { while (done < nbytes && !feof(buf->infile) && !ferror(buf->infile)) {
in = len < COPY_BUFFER_LEN ? len : COPY_BUFFER_LEN; off_t len = nbytes - done;
size_t in = len < COPY_BUFFER_LEN ? len : COPY_BUFFER_LEN;
in = fread(byte_buffer, 1, in, buf->infile); in = fread(byte_buffer, 1, in, buf->infile);
len -= in; done += in;
fwrite(byte_buffer, 1, in, stdout); fwrite(byte_buffer, 1, in, stdout);
if (ferror(stdout)) { if (ferror(stdout))
buffer_skip_bytes(buf, len); return done + buffer_skip_bytes(buf, nbytes - done);
return;
}
} }
return done;
} }
off_t buffer_skip_bytes(struct line_buffer *buf, off_t nbytes) off_t buffer_skip_bytes(struct line_buffer *buf, off_t nbytes)

View File

@ -26,7 +26,8 @@ char *buffer_read_line(struct line_buffer *buf);
char *buffer_read_string(struct line_buffer *buf, uint32_t len); char *buffer_read_string(struct line_buffer *buf, uint32_t len);
int buffer_read_char(struct line_buffer *buf); int buffer_read_char(struct line_buffer *buf);
void buffer_read_binary(struct line_buffer *buf, struct strbuf *sb, uint32_t len); void buffer_read_binary(struct line_buffer *buf, struct strbuf *sb, uint32_t len);
void buffer_copy_bytes(struct line_buffer *buf, off_t len); /* Returns number of bytes read (not necessarily written). */
off_t buffer_copy_bytes(struct line_buffer *buf, off_t len);
off_t buffer_skip_bytes(struct line_buffer *buf, off_t len); off_t buffer_skip_bytes(struct line_buffer *buf, off_t len);
#endif #endif