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), input error or early end of input by checking the return value. Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> --- Intuitive? vcs-svn/line_buffer.c | 18 +++++++++--------- vcs-svn/line_buffer.h | 3 ++- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/vcs-svn/line_buffer.c b/vcs-svn/line_buffer.c index 58e076f..36f177c 100644 --- a/vcs-svn/line_buffer.c +++ b/vcs-svn/line_buffer.c @@ -71,19 +71,19 @@ char *buffer_read_string(uint32_t len) return ferror(infile) ? NULL : s; } -void buffer_copy_bytes(uint32_t len) +uint32_t buffer_copy_bytes(uint32_t nbytes) { - uint32_t in; - while (len > 0 && !feof(infile) && !ferror(infile)) { - in = len < COPY_BUFFER_LEN ? len : COPY_BUFFER_LEN; + uint32_t done = 0; + while (done < nbytes && !feof(infile) && !ferror(infile)) { + uint32_t len = nbytes - done; + uint32_t in = len < COPY_BUFFER_LEN ? len : COPY_BUFFER_LEN; in = fread(byte_buffer, 1, in, infile); - len -= in; + done += in; fwrite(byte_buffer, 1, in, stdout); - if (ferror(stdout)) { - buffer_skip_bytes(len); - return; - } + if (ferror(stdout)) + return done + buffer_skip_bytes(nbytes - done); } + return done; } uint32_t buffer_skip_bytes(uint32_t nbytes) diff --git a/vcs-svn/line_buffer.h b/vcs-svn/line_buffer.h index b9dd929..7766636 100644 --- a/vcs-svn/line_buffer.h +++ b/vcs-svn/line_buffer.h @@ -6,7 +6,8 @@ int buffer_deinit(void); int buffer_ferror(void); char *buffer_read_line(void); char *buffer_read_string(uint32_t len); -void buffer_copy_bytes(uint32_t len); +/* Returns number of bytes read (not necessarily written). */ +uint32_t buffer_copy_bytes(uint32_t len); uint32_t buffer_skip_bytes(uint32_t len); void buffer_reset(void); -- 1.7.2.3.554.gc9b5c.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html