}
 }
 
-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)
 
 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
 
 
 `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.