Code

vcs-svn: teach line_buffer to handle multiple input files
[git.git] / vcs-svn / line_buffer.c
index e7bc230fcbf5dc021e8a5e8aa6f9ec66ce06ad6d..806932b32187bece9076131c69e8f80ae0c3a58a 100644 (file)
@@ -8,20 +8,16 @@
 #include "strbuf.h"
 
 #define COPY_BUFFER_LEN 4096
-static struct line_buffer buf_ = LINE_BUFFER_INIT;
-static struct line_buffer *buf;
 
-int buffer_init(const char *filename)
+int buffer_init(struct line_buffer *buf, const char *filename)
 {
-       buf = &buf_;
-
        buf->infile = filename ? fopen(filename, "r") : stdin;
        if (!buf->infile)
                return -1;
        return 0;
 }
 
-int buffer_deinit(void)
+int buffer_deinit(struct line_buffer *buf)
 {
        int err;
        if (buf->infile == stdin)
@@ -32,7 +28,7 @@ int buffer_deinit(void)
 }
 
 /* Read a line without trailing newline. */
-char *buffer_read_line(void)
+char *buffer_read_line(struct line_buffer *buf)
 {
        char *end;
        if (!fgets(buf->line_buffer, sizeof(buf->line_buffer), buf->infile))
@@ -53,14 +49,14 @@ char *buffer_read_line(void)
        return buf->line_buffer;
 }
 
-char *buffer_read_string(uint32_t len)
+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_copy_bytes(uint32_t len)
+void buffer_copy_bytes(struct line_buffer *buf, uint32_t len)
 {
        char byte_buffer[COPY_BUFFER_LEN];
        uint32_t in;
@@ -70,13 +66,13 @@ void buffer_copy_bytes(uint32_t len)
                len -= in;
                fwrite(byte_buffer, 1, in, stdout);
                if (ferror(stdout)) {
-                       buffer_skip_bytes(len);
+                       buffer_skip_bytes(buf, len);
                        return;
                }
        }
 }
 
-void buffer_skip_bytes(uint32_t len)
+void buffer_skip_bytes(struct line_buffer *buf, uint32_t len)
 {
        char byte_buffer[COPY_BUFFER_LEN];
        uint32_t in;
@@ -87,7 +83,7 @@ void buffer_skip_bytes(uint32_t len)
        }
 }
 
-void buffer_reset(void)
+void buffer_reset(struct line_buffer *buf)
 {
        strbuf_release(&buf->blob_buffer);
 }