[RFC/PATCH 2/4] libdpkg: Refactor generic I/O code into backend-specific functions
Move read and write code from buffer_read and buffer_write to new
functions for each buffer type.
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
lib/dpkg/buffer.c | 140 +++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 108 insertions(+), 32 deletions(-)
diff --git a/lib/dpkg/buffer.c b/lib/dpkg/buffer.c
index d348c6e..def6c58 100644
--- a/lib/dpkg/buffer.c
+++ b/lib/dpkg/buffer.c
@@ -37,11 +37,82 @@
#include <dpkg/md5.h>
#include <dpkg/buffer.h>
+/*
+ * Fixed-length memory area.
+ */
+
+static off_t
+write_buf(struct buffer_data *data, const void *buf, off_t length)
+{
+ memcpy(data->arg.ptr, buf, length);
+ data->arg.ptr += length;
+ return length;
+}
+
+/*
+ * Variable-length memory area.
+ */
+
+static off_t
+write_vbuf(struct buffer_data *data, const void *buf, off_t length)
+{
+ varbufaddbuf((struct varbuf *)data->arg.ptr, buf, length);
+ return length;
+}
+
+/*
+ * Unix file output.
+ */
+
+static off_t
+write_fd(struct buffer_data *data, const void *buf, off_t length)
+{
+ return write(data->arg.i, buf, length);
+}
+
+/*
+ * Data sink.
+ */
+
+static off_t
+write_null(struct buffer_data *data, const void *buf, off_t length)
+{
+ return length;
+}
+
+/*
+ * Standard C output.
+ */
+
+static off_t
+write_stream(struct buffer_data *data, const void *buf, off_t length)
+{
+ off_t ret = fwrite(buf, 1, length, (FILE *)data->arg.ptr);
+
+ if (feof((FILE *)data->arg.ptr))
+ return -1;
+ if (ferror((FILE *)data->arg.ptr))
+ return -1;
+ return ret;
+}
+
+/*
+ * MD5 hash accumulator.
+ */
+
struct buffer_write_md5ctx {
struct MD5Context ctx;
char *hash;
};
+static off_t
+write_md5(struct buffer_data *data, const void *buf, off_t length)
+{
+ MD5Update(&(((struct buffer_write_md5ctx *)data->arg.ptr)->ctx),
+ buf, length);
+ return length;
+}
+
static void
buffer_md5_init(struct buffer_data *data)
{
@@ -72,6 +143,35 @@ buffer_md5_done(struct buffer_data *data)
free(ctx);
}
+/*
+ * Unix file input.
+ */
+
+static off_t
+read_fd(struct buffer_data *data, void *buf, off_t length)
+{
+ return read(data->arg.i, buf, length);
+}
+
+/*
+ * Standard C input.
+ */
+
+static off_t
+read_stream(struct buffer_data *data, void *buf, off_t length)
+{
+ off_t ret = fread(buf, 1, length, (FILE *)data->arg.ptr);
+
+ if (feof((FILE *)data->arg.ptr))
+ return ret;
+ if (ferror((FILE *)data->arg.ptr))
+ return -1;
+}
+
+/*
+ * Generic input and output.
+ */
+
off_t
buffer_init(struct buffer_data *read_data, struct buffer_data *write_data)
{
@@ -97,61 +197,37 @@ buffer_done(struct buffer_data *read_data, struct buffer_data *write_data)
off_t
buffer_write(struct buffer_data *data, const void *buf, off_t length)
{
- off_t ret = length;
-
switch (data->type) {
case BUFFER_WRITE_BUF:
- memcpy(data->arg.ptr, buf, length);
- data->arg.ptr += length;
- break;
+ return write_buf(data, buf, length);
case BUFFER_WRITE_VBUF:
- varbufaddbuf((struct varbuf *)data->arg.ptr, buf, length);
- break;
+ return write_vbuf(data, buf, length);
case BUFFER_WRITE_FD:
- ret = write(data->arg.i, buf, length);
- break;
+ return write_fd(data, buf, length);
case BUFFER_WRITE_NULL:
- break;
+ return write_null(data, buf, length);
case BUFFER_WRITE_STREAM:
- ret = fwrite(buf, 1, length, (FILE *)data->arg.ptr);
- if (feof((FILE *)data->arg.ptr))
- return -1;
- if (ferror((FILE *)data->arg.ptr))
- return -1;
- break;
+ return write_stream(data, buf, length);
case BUFFER_WRITE_MD5:
- MD5Update(&(((struct buffer_write_md5ctx *)data->arg.ptr)->ctx), buf, length);
- break;
+ return write_md5(data, buf, length);
default:
internerr("unknown data type '%i' in buffer_write",
data->type);
}
-
- return ret;
}
off_t
buffer_read(struct buffer_data *data, void *buf, off_t length)
{
- off_t ret;
-
switch (data->type) {
case BUFFER_READ_FD:
- ret = read(data->arg.i, buf, length);
- break;
+ return read_fd(data, buf, length);
case BUFFER_READ_STREAM:
- ret = fread(buf, 1, length, (FILE *)data->arg.ptr);
- if (feof((FILE *)data->arg.ptr))
- return ret;
- if (ferror((FILE *)data->arg.ptr))
- return -1;
- break;
+ return read_stream(data, buf, length);
default:
internerr("unknown data type '%i' in buffer_read\n",
data->type);
}
-
- return ret;
}
#define buffer_copy_TYPE(name, type1, name1, type2, name2) \
--
1.7.0.3
Reply to: