[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[PATCH 02/15] libdpkg: factor out common gzip, bzip2 code



If only C had templates!  Without function templates, macros
like these two will have to do.

This patch refactors the callers for zlib and libbz2 library
functions to share some code, in preparation for some small
changes that apply to both.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 lib/dpkg/compression.c |  165 +++++++++++++++++++++---------------------------
 1 files changed, 71 insertions(+), 94 deletions(-)

diff --git a/lib/dpkg/compression.c b/lib/dpkg/compression.c
index f7444af..22e1af7 100644
--- a/lib/dpkg/compression.c
+++ b/lib/dpkg/compression.c
@@ -36,6 +36,67 @@ fd_fd_filter(int fd_in, int fd_out,
   ohshite(_("%s: failed to exec '%s %s'"), desc, cmd, args);
 }
 
+#define DECOMPRESS(format, zFile, zdopen, zread, zerror, ERR_ERRNO, \
+                   fd_in, fd_out, desc) do \
+{ \
+  char buffer[4096]; \
+  int actualread; \
+  zFile zfile = zdopen(fd_in, "r"); \
+  \
+  while ((actualread = zread(zfile, buffer, sizeof(buffer))) > 0) { \
+    if (actualread < 0) { \
+      int err = 0; \
+      const char *errmsg = zerror(zfile, &err); \
+      if (err == ERR_ERRNO) { \
+        if (errno == EINTR) \
+          continue; \
+        errmsg = strerror(errno); \
+      } \
+      ohshite(_("%s: internal " format " error: `%s'"), desc, errmsg); \
+    } \
+    write(fd_out, buffer, actualread); \
+  } \
+  exit(0); \
+} while(0)
+
+#define COMPRESS(format, zFile, zdopen, zwrite, zclose, zerror, ERR_ERRNO, \
+                 fd_in, fd_out, compression, desc) do \
+{ \
+  char combuf[6]; \
+  int actualread, actualwrite; \
+  char buffer[4096]; \
+  zFile zfile; \
+  \
+  strncpy(combuf, "w9", sizeof(combuf)); \
+  combuf[1] = compression; \
+  zfile = zdopen(1, combuf); \
+  while ((actualread = read(0, buffer, sizeof(buffer))) > 0) { \
+    if (actualread < 0) { \
+      if (errno == EINTR) \
+        continue; \
+      ohshite(_("%s: internal " format " error: read: `%s'"), \
+              desc, strerror(errno)); \
+    } \
+    actualwrite = zwrite(zfile, buffer, actualread); \
+    if (actualwrite < 0) { \
+      int err = 0; \
+      const char *errmsg = zerror(zfile, &err); \
+      if (err == ERR_ERRNO) { \
+        if (errno == EINTR) \
+          continue; \
+        errmsg = strerror(errno); \
+      } \
+      ohshite(_("%s: internal " format " error: write: `%s'"), \
+              desc, errmsg); \
+    } \
+    if (actualwrite != actualread) \
+      ohshite(_("%s: internal " format " error: read(%i) != write(%i)"), \
+              desc, actualread, actualwrite); \
+  } \
+  zclose(zfile); \
+  exit(0); \
+} while(0)
+
 void decompress_cat(enum compress_type type, int fd_in, int fd_out, char *desc, ...) {
   va_list al;
   struct varbuf v = VARBUF_INIT;
@@ -47,47 +108,16 @@ void decompress_cat(enum compress_type type, int fd_in, int fd_out, char *desc,
   switch(type) {
     case compress_type_gzip:
 #ifdef WITH_ZLIB
-      {
-        char buffer[4096];
-        int actualread;
-        gzFile gzfile = gzdopen(fd_in, "r");
-        while ((actualread= gzread(gzfile,buffer,sizeof(buffer))) > 0) {
-          if (actualread < 0 ) {
-            int err = 0;
-            const char *errmsg = gzerror(gzfile, &err);
-            if (err == Z_ERRNO) {
-              if (errno == EINTR) continue;
-              errmsg= strerror(errno);
-            }
-          ohshite(_("%s: internal gzip error: `%s'"), v.buf, errmsg);
-          }
-          write(fd_out,buffer,actualread);
-        }
-      }
-      exit(0);
+      DECOMPRESS("gzip", gzFile, gzdopen, gzread, gzerror, Z_ERRNO,
+                 fd_in, fd_out, v.buf);
 #else
       fd_fd_filter(fd_in, fd_out, GZIP, "gzip", "-dc", v.buf);
 #endif
     case compress_type_bzip2:
 #ifdef WITH_BZ2
-      {   
-        char buffer[4096];
-        int actualread;
-        BZFILE *bzfile = BZ2_bzdopen(fd_in, "r");
-        while ((actualread= BZ2_bzread(bzfile,buffer,sizeof(buffer))) > 0) {
-          if (actualread < 0 ) {
-            int err = 0;
-            const char *errmsg = BZ2_bzerror(bzfile, &err);
-            if (err == BZ_IO_ERROR) {
-              if (errno == EINTR) continue;
-              errmsg= strerror(errno);
-            }
-          ohshite(_("%s: internal bzip2 error: `%s'"), v.buf, errmsg);
-          }
-          write(fd_out,buffer,actualread);
-        }
-      }
-      exit(0);
+      DECOMPRESS("bzip2", BZFILE *, BZ2_bzdopen, BZ2_bzread,
+                 BZ2_bzerror, BZ_IO_ERROR,
+                 fd_in, fd_out, v.buf);
 #else
       fd_fd_filter(fd_in, fd_out, BZIP2, "bzip2", "-dc", v.buf);
 #endif
@@ -116,35 +146,8 @@ void compress_cat(enum compress_type type, int fd_in, int fd_out, const char *co
   switch(type) {
     case compress_type_gzip:
 #ifdef WITH_ZLIB
-      {
-        char combuf[6];
-        int actualread, actualwrite;
-        char buffer[4096];
-        gzFile gzfile;
-        strncpy(combuf, "w9", sizeof(combuf));
-        combuf[1]= *compression;
-        gzfile = gzdopen(1, combuf);
-        while((actualread = read(0,buffer,sizeof(buffer))) > 0) {
-          if (actualread < 0 ) {
-            if (errno == EINTR) continue;
-            ohshite(_("%s: internal gzip error: read: `%s'"), v.buf, strerror(errno));
-          }
-          actualwrite= gzwrite(gzfile,buffer,actualread);
-          if (actualwrite < 0 ) {
-            int err = 0;
-            const char *errmsg = gzerror(gzfile, &err);
-            if (err == Z_ERRNO) {
-              if (errno == EINTR) continue;
-            errmsg= strerror(errno);
-            }
-            ohshite(_("%s: internal gzip error: write: `%s'"), v.buf, errmsg);
-          }
-          if (actualwrite != actualread)
-            ohshite(_("%s: internal gzip error: read(%i) != write(%i)"), v.buf, actualread, actualwrite);
-        }
-        gzclose(gzfile);
-        exit(0);
-      }
+      COMPRESS("gzip", gzFile, gzdopen, gzwrite, gzclose, gzerror, Z_ERRNO,
+               fd_in, fd_out, *compression, v.buf);
 #else
       {
         char combuf[6];
@@ -155,35 +158,9 @@ void compress_cat(enum compress_type type, int fd_in, int fd_out, const char *co
 #endif
     case compress_type_bzip2:
 #ifdef WITH_BZ2
-      {
-        char combuf[6];
-        int actualread, actualwrite;
-        char buffer[4096];
-        BZFILE *bzfile;
-        strncpy(combuf, "w9", sizeof(combuf));
-        combuf[1]= *compression;
-        bzfile = BZ2_bzdopen(1, combuf);
-        while((actualread = read(0,buffer,sizeof(buffer))) > 0) {
-          if (actualread < 0 ) {
-            if (errno == EINTR) continue;
-            ohshite(_("%s: internal bzip2 error: read: `%s'"), v.buf, strerror(errno));
-          }
-          actualwrite= BZ2_bzwrite(bzfile,buffer,actualread);
-          if (actualwrite < 0 ) {
-            int err = 0;
-            const char *errmsg = BZ2_bzerror(bzfile, &err);
-            if (err == BZ_IO_ERROR) {
-              if (errno == EINTR) continue;
-              errmsg= strerror(errno);
-            }
-            ohshite(_("%s: internal bzip2 error: write: `%s'"), v.buf, errmsg);
-          }
-          if (actualwrite != actualread)
-            ohshite(_("%s: internal bzip2 error: read(%i) != write(%i)"), v.buf, actualread, actualwrite);
-        }
-        BZ2_bzclose(bzfile);
-        exit(0);
-      }
+      COMPRESS("bzip2", BZFILE *, BZ2_bzdopen, BZ2_bzwrite, BZ2_bzclose,
+               BZ2_bzerror, BZ_IO_ERROR,
+               fd_in, fd_out, *compression, v.buf);
 #else
       {
         char combuf[6];
-- 
1.6.5.rc1.199.g596ec


Reply to: