Browse Source

vcs-svn: make buffer_skip_bytes return length read

Currently there is no way to detect when input ended if it ended
early during buffer_skip_bytes.  Tell the calling program how many
bytes were actually skipped for easier debugging.

Existing callers will still ignore early EOF.

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>
maint
Jonathan Nieder 15 years ago
parent
commit
d234f54b2f
  1. 13
      vcs-svn/line_buffer.c
  2. 2
      vcs-svn/line_buffer.h
  3. 3
      vcs-svn/line_buffer.txt

13
vcs-svn/line_buffer.c

@ -120,15 +120,16 @@ void buffer_copy_bytes(struct line_buffer *buf, off_t len) @@ -120,15 +120,16 @@ void buffer_copy_bytes(struct line_buffer *buf, off_t len)
}
}

void buffer_skip_bytes(struct line_buffer *buf, off_t len)
off_t buffer_skip_bytes(struct line_buffer *buf, off_t nbytes)
{
char byte_buffer[COPY_BUFFER_LEN];
uint32_t in;
while (len > 0 && !feof(buf->infile) && !ferror(buf->infile)) {
in = len < COPY_BUFFER_LEN ? len : COPY_BUFFER_LEN;
in = fread(byte_buffer, 1, in, buf->infile);
len -= in;
off_t done = 0;
while (done < nbytes && !feof(buf->infile) && !ferror(buf->infile)) {
off_t len = nbytes - done;
size_t in = len < COPY_BUFFER_LEN ? len : COPY_BUFFER_LEN;
done += fread(byte_buffer, 1, in, buf->infile);
}
return done;
}

void buffer_reset(struct line_buffer *buf)

2
vcs-svn/line_buffer.h

@ -27,6 +27,6 @@ char *buffer_read_string(struct line_buffer *buf, uint32_t len); @@ -27,6 +27,6 @@ char *buffer_read_string(struct line_buffer *buf, uint32_t len);
int buffer_read_char(struct line_buffer *buf);
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);
void buffer_skip_bytes(struct line_buffer *buf, off_t len);
off_t buffer_skip_bytes(struct line_buffer *buf, off_t len);

#endif

3
vcs-svn/line_buffer.txt

@ -76,7 +76,8 @@ Functions @@ -76,7 +76,8 @@ Functions

`buffer_skip_bytes`::
Discards `len` bytes from the input stream (stopping early
if necessary because of an error or eof).
if necessary because of an error or eof). Return value is
the number of bytes successfully read.

`buffer_reset`::
Deallocates non-static buffers.

Loading…
Cancel
Save