The following commit has been merged in the master branch:
commit 7a96597253e880b1ead816637250d7bc472b77b5
Author: Guillem Jover <[email protected]>
Date:   Mon Nov 21 04:48:12 2011 +0100

    libdpkg: Do not expose the compression structs
    
    This reduces the amount of relocations on the future shared libdpkg
    library. It also makes it easier to refactor the code.

diff --git a/dpkg-deb/build.c b/dpkg-deb/build.c
index e5d5b47..4247d38 100644
--- a/dpkg-deb/build.c
+++ b/dpkg-deb/build.c
@@ -475,7 +475,7 @@ do_build(const char *const *argv)
   /* And run gzip to compress our control archive. */
   c2 = subproc_fork();
   if (!c2) {
-    compress_filter(&compressor_gzip, p1[0], gzfd, 9, _("control member"));
+    compress_filter(compressor_type_gzip, p1[0], gzfd, 9, _("control member"));
     exit(0);
   }
   close(p1[0]);
@@ -588,7 +588,8 @@ do_build(const char *const *argv)
   if (!oldformatflag) {
     char datamember[16 + 1];
 
-    sprintf(datamember, "%s%s", DATAMEMBER, compressor->extension);
+    sprintf(datamember, "%s%s", DATAMEMBER,
+            compressor_get_extension(compressor));
 
     if (lseek(gzfd, 0, SEEK_SET))
       ohshite(_("failed to rewind temporary file (%s)"), _("data member"));
diff --git a/dpkg-deb/dpkg-deb.h b/dpkg-deb/dpkg-deb.h
index 1605967..080a529 100644
--- a/dpkg-deb/dpkg-deb.h
+++ b/dpkg-deb/dpkg-deb.h
@@ -39,7 +39,7 @@ void extracthalf(const char *debar, const char *dir,
                  const char *taroption, int admininfo);
 
 extern const char* showformat;
-extern struct compressor *compressor;
+extern enum compressor_type compressor;
 extern int compress_level;
 
 #define ARCHIVEVERSION         "2.0"
diff --git a/dpkg-deb/extract.c b/dpkg-deb/extract.c
index 99362db..bb5bb28 100644
--- a/dpkg-deb/extract.c
+++ b/dpkg-deb/extract.c
@@ -118,7 +118,7 @@ extracthalf(const char *debar, const char *dir, const char 
*taroption,
   char nlc;
   int adminmember;
   bool oldformat, header_done;
-  struct compressor *decompressor = &compressor_gzip;
+  enum compressor_type decompressor = compressor_type_gzip;
 
   arfd = open(debar, O_RDONLY);
   if (arfd < 0)
@@ -190,7 +190,7 @@ extracthalf(const char *debar, const char *dir, const char 
*taroption,
            decompressor = compressor_find_by_extension(extension);
          }
 
-          if (adminmember == -1 || decompressor == NULL)
+          if (adminmember == -1 || decompressor == compressor_type_unknown)
             ohshit(_("archive '%.250s' contains not understood data member 
%.*s, giving up"),
                    debar, (int)sizeof(arh.ar_name), arh.ar_name);
         }
diff --git a/dpkg-deb/main.c b/dpkg-deb/main.c
index 88f765c..d487eb5 100644
--- a/dpkg-deb/main.c
+++ b/dpkg-deb/main.c
@@ -134,7 +134,7 @@ static const char printforhelp[] =
 
 int debugflag=0, nocheckflag=0, oldformatflag=BUILDOLDPKGFORMAT;
 int opt_verbose = 0;
-struct compressor *compressor = &compressor_gzip;
+enum compressor_type compressor = compressor_type_gzip;
 int compress_level = -1;
 
 static void
@@ -157,7 +157,7 @@ static void
 setcompresstype(const struct cmdinfo *cip, const char *value)
 {
   compressor = compressor_find_by_name(value);
-  if (compressor == NULL)
+  if (compressor == compressor_type_unknown)
     ohshit(_("unknown compression type `%s'!"), value);
 }
 
diff --git a/lib/dpkg/compress.c b/lib/dpkg/compress.c
index 5199439..cab49fe 100644
--- a/lib/dpkg/compress.c
+++ b/lib/dpkg/compress.c
@@ -73,6 +73,14 @@ fd_fd_filter(int fd_in, int fd_out, const char *desc, const 
char *file, ...)
        subproc_wait_check(pid, desc, 0);
 }
 
+struct compressor {
+       const char *name;
+       const char *extension;
+       int default_level;
+       void (*compress)(int fd_in, int fd_out, int level, const char *desc);
+       void (*decompress)(int fd_in, int fd_out, const char *desc);
+};
+
 /*
  * No compressor (pass-through).
  */
@@ -89,7 +97,7 @@ compress_none(int fd_in, int fd_out, int compress_level, 
const char *desc)
        fd_fd_copy(fd_in, fd_out, -1, _("%s: compression"), desc);
 }
 
-struct compressor compressor_none = {
+static struct compressor compressor_none = {
        .name = "none",
        .extension = "",
        .default_level = 0,
@@ -197,7 +205,7 @@ compress_gzip(int fd_in, int fd_out, int compress_level, 
const char *desc)
 }
 #endif
 
-struct compressor compressor_gzip = {
+static struct compressor compressor_gzip = {
        .name = "gzip",
        .extension = ".gz",
        .default_level = 9,
@@ -310,7 +318,7 @@ compress_bzip2(int fd_in, int fd_out, int compress_level, 
const char *desc)
 }
 #endif
 
-struct compressor compressor_bzip2 = {
+static struct compressor compressor_bzip2 = {
        .name = "bzip2",
        .extension = ".bz2",
        .default_level = 9,
@@ -337,7 +345,7 @@ compress_xz(int fd_in, int fd_out, int compress_level, 
const char *desc)
        fd_fd_filter(fd_in, fd_out, desc, XZ, combuf, NULL);
 }
 
-struct compressor compressor_xz = {
+static struct compressor compressor_xz = {
        .name = "xz",
        .extension = ".xz",
        .default_level = 6,
@@ -364,7 +372,7 @@ compress_lzma(int fd_in, int fd_out, int compress_level, 
const char *desc)
        fd_fd_filter(fd_in, fd_out, desc, XZ, combuf, "--format=lzma", NULL);
 }
 
-struct compressor compressor_lzma = {
+static struct compressor compressor_lzma = {
        .name = "lzma",
        .extension = ".lzma",
        .default_level = 6,
@@ -377,68 +385,84 @@ struct compressor compressor_lzma = {
  */
 
 static struct compressor *compressor_array[] = {
-       &compressor_none,
-       &compressor_gzip,
-       &compressor_xz,
-       &compressor_bzip2,
-       &compressor_lzma,
+       [compressor_type_none] = &compressor_none,
+       [compressor_type_gzip] = &compressor_gzip,
+       [compressor_type_xz] = &compressor_xz,
+       [compressor_type_bzip2] = &compressor_bzip2,
+       [compressor_type_lzma] = &compressor_lzma,
 };
 
-struct compressor *
+static struct compressor *
+compressor_get(enum compressor_type type)
+{
+       const enum compressor_type max_type = array_count(compressor_array);
+
+       if (type < 0 || type >= max_type)
+               internerr("compressor_type is out of range");
+
+       return compressor_array[type];
+}
+
+const char *
+compressor_get_extension(enum compressor_type type)
+{
+       return compressor_get(type)->extension;
+}
+
+enum compressor_type
 compressor_find_by_name(const char *name)
 {
        size_t i;
 
        for (i = 0; i < array_count(compressor_array); i++)
                if (strcmp(compressor_array[i]->name, name) == 0)
-                       return compressor_array[i];
+                       return i;
 
-       return NULL;
+       return compressor_type_unknown;
 }
 
-struct compressor *
+enum compressor_type
 compressor_find_by_extension(const char *extension)
 {
        size_t i;
 
        for (i = 0; i < array_count(compressor_array); i++)
                if (strcmp(compressor_array[i]->extension, extension) == 0)
-                       return compressor_array[i];
+                       return i;
 
-       return NULL;
+       return compressor_type_unknown;
 }
 
 void
-decompress_filter(struct compressor *compressor, int fd_in, int fd_out,
+decompress_filter(enum compressor_type type, int fd_in, int fd_out,
                   const char *desc_fmt, ...)
 {
+       struct compressor *compressor;
        va_list args;
        struct varbuf desc = VARBUF_INIT;
 
-       if (compressor == NULL)
-               internerr("no compressor specified");
-
        va_start(args, desc_fmt);
        varbuf_vprintf(&desc, desc_fmt, args);
        va_end(args);
 
+       compressor = compressor_get(type);
        compressor->decompress(fd_in, fd_out, desc.buf);
 }
 
 void
-compress_filter(struct compressor *compressor, int fd_in, int fd_out,
+compress_filter(enum compressor_type type, int fd_in, int fd_out,
                 int compress_level, const char *desc_fmt, ...)
 {
+       struct compressor *compressor;
        va_list args;
        struct varbuf desc = VARBUF_INIT;
 
-       if (compressor == NULL)
-               internerr("no compressor specified");
-
        va_start(args, desc_fmt);
        varbuf_vprintf(&desc, desc_fmt, args);
        va_end(args);
 
+       compressor = compressor_get(type);
+
        if (compress_level < 0)
                compress_level = compressor->default_level;
        else if (compress_level == 0)
diff --git a/lib/dpkg/compress.h b/lib/dpkg/compress.h
index 18f6573..94c4df7 100644
--- a/lib/dpkg/compress.h
+++ b/lib/dpkg/compress.h
@@ -30,27 +30,24 @@ DPKG_BEGIN_DECLS
 #define XZ             "xz"
 #define BZIP2          "bzip2"
 
-struct compressor {
-       const char *name;
-       const char *extension;
-       int default_level;
-       void (*compress)(int fd_in, int fd_out, int level, const char *desc);
-       void (*decompress)(int fd_in, int fd_out, const char *desc);
+enum compressor_type {
+       compressor_type_unknown = -1,
+       compressor_type_none,
+       compressor_type_gzip,
+       compressor_type_xz,
+       compressor_type_bzip2,
+       compressor_type_lzma,
 };
 
-struct compressor compressor_none;
-struct compressor compressor_gzip;
-struct compressor compressor_xz;
-struct compressor compressor_bzip2;
-struct compressor compressor_lzma;
+enum compressor_type compressor_find_by_name(const char *name);
+enum compressor_type compressor_find_by_extension(const char *name);
 
-struct compressor *compressor_find_by_name(const char *name);
-struct compressor *compressor_find_by_extension(const char *name);
+const char *compressor_get_extension(enum compressor_type type);
 
-void decompress_filter(struct compressor *comp, int fd_in, int fd_out,
+void decompress_filter(enum compressor_type type, int fd_in, int fd_out,
                        const char *desc, ...)
                        DPKG_ATTR_PRINTF(4);
-void compress_filter(struct compressor *comp, int fd_in, int fd_out,
+void compress_filter(enum compressor_type type, int fd_in, int fd_out,
                      int compress_level, const char *desc, ...)
                      DPKG_ATTR_PRINTF(5);
 
diff --git a/lib/dpkg/libdpkg.Versions b/lib/dpkg/libdpkg.Versions
index d38f455..675a1d5 100644
--- a/lib/dpkg/libdpkg.Versions
+++ b/lib/dpkg/libdpkg.Versions
@@ -123,12 +123,9 @@ LIBDPKG_PRIVATE {
        setcloexec;
 
        # Compression support
-       compressor_gzip;        # XXX variable, do not export
-       compressor_xz;          # XXX variable, do not export
-       compressor_bzip2;       # XXX variable, do not export
-       compressor_lzma;        # XXX variable, do not export
        compressor_find_by_name;
        compressor_find_by_extension;
+       compressor_get_extension;
        compress_filter;
        decompress_filter;
 

-- 
dpkg's main repository


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to