[PATCH 06/16] vcs-svn: Improve support for reading large files
- From
Jonathan Nieder <jrnieder@gmail.com>
- Date
- Oct 11, 2010, 02:46 UTC
- Message-ID
- <20101011024624.GF1553@burratino>
- In-Reply-To
- <20101011023435.GA706@burratino>
Tweak the line_buffer API to permit seeking and cat-ing segments longer than 4 GiB. This would be particularly useful for applying deltas that remove a large segment from the middle of a file.
Callers would still have to be updated to take advantage of this.
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> --- Since off_t is a signed type, on systems with 32-bit file offsets, this might make things worse. Is that worth worrying about?
vcs-svn/line_buffer.c | 8 ++++---- vcs-svn/line_buffer.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/vcs-svn/line_buffer.c b/vcs-svn/line_buffer.c index 999368b..fd1d3c3 100644 --- a/vcs-svn/line_buffer.c +++ b/vcs-svn/line_buffer.c @@ -56,7 +56,7 @@ char *buffer_read_string(struct line_buffer *buf, uint32_t len) return ferror(buf->infile) ? NULL : buf->blob_buffer.buf; } -void buffer_copy_bytes(struct line_buffer *buf, uint32_t len) +void buffer_copy_bytes(struct line_buffer *buf, off_t len) { char byte_buffer[COPY_BUFFER_LEN]; uint32_t in; @@ -72,12 +72,12 @@ void buffer_copy_bytes(struct line_buffer *buf, uint32_t len) } } -uint32_t buffer_skip_bytes(struct line_buffer *buf, uint32_t nbytes) +off_t buffer_skip_bytes(struct line_buffer *buf, off_t nbytes) { - uint32_t done = 0; + off_t done = 0; while (done < nbytes && !feof(buf->infile) && !ferror(buf->infile)) { char byte_buffer[COPY_BUFFER_LEN]; - uint32_t len = nbytes - done; + off_t len = nbytes - done; uint32_t in = len < COPY_BUFFER_LEN ? len : COPY_BUFFER_LEN; done += fread(byte_buffer, 1, in, buf->infile); } diff --git a/vcs-svn/line_buffer.h b/vcs-svn/line_buffer.h index 2796ba7..2849faa 100644 --- a/vcs-svn/line_buffer.h +++ b/vcs-svn/line_buffer.h @@ -16,8 +16,8 @@ int buffer_init(struct line_buffer *buf, const char *filename); int buffer_deinit(struct line_buffer *buf); char *buffer_read_line(struct line_buffer *buf); char *buffer_read_string(struct line_buffer *buf, uint32_t len); -void buffer_copy_bytes(struct line_buffer *buf, uint32_t len); -uint32_t buffer_skip_bytes(struct line_buffer *buf, uint32_t len); +void buffer_copy_bytes(struct line_buffer *buf, off_t len); +off_t buffer_skip_bytes(struct line_buffer *buf, off_t len); void buffer_reset(struct line_buffer *buf); #endif
-- 1.7.2.3