Sync with 1.7.4.3
[gitweb.git] / vcs-svn / line_buffer.c
index 661b007092247add3d7d5121345a999b8af53f7b..c39038723ed4a90f99f70a694eae58ba488556b6 100644 (file)
@@ -17,6 +17,22 @@ int buffer_init(struct line_buffer *buf, const char *filename)
        return 0;
 }
 
+int buffer_fdinit(struct line_buffer *buf, int fd)
+{
+       buf->infile = fdopen(fd, "r");
+       if (!buf->infile)
+               return -1;
+       return 0;
+}
+
+int buffer_tmpfile_init(struct line_buffer *buf)
+{
+       buf->infile = tmpfile();
+       if (!buf->infile)
+               return -1;
+       return 0;
+}
+
 int buffer_deinit(struct line_buffer *buf)
 {
        int err;
@@ -27,6 +43,32 @@ int buffer_deinit(struct line_buffer *buf)
        return err;
 }
 
+FILE *buffer_tmpfile_rewind(struct line_buffer *buf)
+{
+       rewind(buf->infile);
+       return buf->infile;
+}
+
+long buffer_tmpfile_prepare_to_read(struct line_buffer *buf)
+{
+       long pos = ftell(buf->infile);
+       if (pos < 0)
+               return error("ftell error: %s", strerror(errno));
+       if (fseek(buf->infile, 0, SEEK_SET))
+               return error("seek error: %s", strerror(errno));
+       return pos;
+}
+
+int buffer_ferror(struct line_buffer *buf)
+{
+       return ferror(buf->infile);
+}
+
+int buffer_read_char(struct line_buffer *buf)
+{
+       return fgetc(buf->infile);
+}
+
 /* Read a line without trailing newline. */
 char *buffer_read_line(struct line_buffer *buf)
 {
@@ -49,47 +91,40 @@ char *buffer_read_line(struct line_buffer *buf)
        return buf->line_buffer;
 }
 
-char *buffer_read_string(struct line_buffer *buf, uint32_t len)
-{
-       strbuf_reset(&buf->blob_buffer);
-       strbuf_fread(&buf->blob_buffer, len, buf->infile);
-       return ferror(buf->infile) ? NULL : buf->blob_buffer.buf;
-}
-
 void buffer_read_binary(struct line_buffer *buf,
                                struct strbuf *sb, uint32_t size)
 {
        strbuf_fread(sb, size, buf->infile);
 }
 
-void buffer_copy_bytes(struct line_buffer *buf, uint32_t len)
+off_t buffer_copy_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;
+       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;
                in = fread(byte_buffer, 1, in, buf->infile);
-               len -= in;
+               done += in;
                fwrite(byte_buffer, 1, in, stdout);
-               if (ferror(stdout)) {
-                       buffer_skip_bytes(buf, len);
-                       return;
-               }
+               if (ferror(stdout))
+                       return done + buffer_skip_bytes(buf, nbytes - done);
        }
+       return done;
 }
 
-void buffer_skip_bytes(struct line_buffer *buf, uint32_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)
 {
-       strbuf_release(&buf->blob_buffer);
 }