From 1205ca0f3ba6bc078f40edb3d7e26ff98e411720 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Fri, 5 Apr 2019 12:13:12 +0200 Subject: [PATCH] Move compressors to utility library - Remove compressor registration interface. Doesn't work in a static library, since all the files containing no exported members are optimized away at link time. - Repack as seperate utility library. Signed-off-by: David Oberhollenzer --- include/{ => comp}/compressor.h | 8 ------ include/pkgwriter.h | 2 +- lib/Makemodule.am | 21 ++++++++++++++- lib/comp/compressor.c | 39 +++++++++++++++++++++++++++ lib/comp/internal.h | 11 ++++++++ {main/compressors => lib/comp}/lzma.c | 6 ++--- {main/compressors => lib/comp}/none.c | 6 ++--- {main/compressors => lib/comp}/zlib.c | 6 ++--- main/Makemodule.am | 27 +++++-------------- main/cmd/pack/pack.h | 2 +- main/compressor.c | 32 ---------------------- main/pkgreader.c | 2 +- 12 files changed, 86 insertions(+), 76 deletions(-) rename include/{ => comp}/compressor.h (79%) create mode 100644 lib/comp/compressor.c create mode 100644 lib/comp/internal.h rename {main/compressors => lib/comp}/lzma.c (97%) rename {main/compressors => lib/comp}/none.c (95%) rename {main/compressors => lib/comp}/zlib.c (97%) delete mode 100644 main/compressor.c diff --git a/include/compressor.h b/include/comp/compressor.h similarity index 79% rename from include/compressor.h rename to include/comp/compressor.h index 9ee032c..51eb044 100644 --- a/include/compressor.h +++ b/include/comp/compressor.h @@ -29,16 +29,8 @@ typedef struct compressor_t { compressor_stream_t *(*uncompression_stream)(struct compressor_t *cmp); } compressor_t; -void compressor_register(compressor_t *compressor); - compressor_t *compressor_by_name(const char *name); compressor_t *compressor_by_id(PKG_COMPRESSION id); -#define REGISTER_COMPRESSOR(compressor) \ - static void __attribute__((constructor)) register_##compressor(void) \ - { \ - compressor_register((compressor_t *)&compressor); \ - } - #endif /* COMPRESSOR_H */ diff --git a/include/pkgwriter.h b/include/pkgwriter.h index 8018e7b..d7d9705 100644 --- a/include/pkgwriter.h +++ b/include/pkgwriter.h @@ -4,8 +4,8 @@ #include +#include "comp/compressor.h" #include "pkgformat.h" -#include "compressor.h" typedef struct pkg_writer_t pkg_writer_t; diff --git a/lib/Makemodule.am b/lib/Makemodule.am index e8e4da1..1d182c4 100644 --- a/lib/Makemodule.am +++ b/lib/Makemodule.am @@ -9,4 +9,23 @@ libfilelist_a_SOURCES = lib/filelist/dump_toc.c lib/filelist/image_entry.c libfilelist_a_SOURCES += lib/filelist/image_entry_sort.c libfilelist_a_SOURCES += include/filelist/image_entry.h -noinst_LIBRARIES += libutil.a libfilelist.a +libcomp_a_SOURCES = lib/comp/compressor.c lib/comp/none.c +libcomp_a_SOURCES += include/comp/compressor.h lib/comp/internal.h +libcomp_a_CFLAGS = $(AM_CFLAGS) +libcomp_a_CPPFLAGS = $(AM_CPPFLAGS) + +if WITH_ZLIB +libcomp_a_SOURCES += lib/comp/zlib.c + +libcomp_a_CFLAGS += $(ZLIB_CFLAGS) +libcomp_a_CPPFLAGS += -DWITH_ZLIB +endif + +if WITH_LZMA +libcomp_a_SOURCES += lib/comp/lzma.c + +libcomp_a_CFLAGS += $(XZ_CFLAGS) +libcomp_a_CPPFLAGS += -DWITH_LZMA +endif + +noinst_LIBRARIES += libutil.a libfilelist.a libcomp.a diff --git a/lib/comp/compressor.c b/lib/comp/compressor.c new file mode 100644 index 0000000..da7ad91 --- /dev/null +++ b/lib/comp/compressor.c @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: ISC */ +#include + +#include "internal.h" + +static compressor_t *compressors[] = { + [PKG_COMPRESSION_NONE] = &comp_none, +#ifdef WITH_ZLIB + [PKG_COMPRESSION_ZLIB] = &comp_zlib, +#endif +#ifdef WITH_LZMA + [PKG_COMPRESSION_LZMA] = &comp_lzma, +#endif +}; + +compressor_t *compressor_by_name(const char *name) +{ + size_t i; + + for (i = 0; i < sizeof(compressors) / sizeof(compressors[0]); ++i) { + if (compressors[i] == NULL) + continue; + if (strcmp(compressors[i]->name, name) == 0) + return compressors[i]; + } + + return NULL; +} + +compressor_t *compressor_by_id(PKG_COMPRESSION id) +{ + if ((int)id < 0) + return NULL; + + if ((size_t)id >= sizeof(compressors) / sizeof(compressors[0])) + return NULL; + + return compressors[id]; +} diff --git a/lib/comp/internal.h b/lib/comp/internal.h new file mode 100644 index 0000000..9d89432 --- /dev/null +++ b/lib/comp/internal.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: ISC */ +#ifndef INTERNAL_H +#define INTERNAL_H + +#include "comp/compressor.h" + +extern compressor_t comp_lzma; +extern compressor_t comp_none; +extern compressor_t comp_zlib; + +#endif /* INTERNAL_H */ diff --git a/main/compressors/lzma.c b/lib/comp/lzma.c similarity index 97% rename from main/compressors/lzma.c rename to lib/comp/lzma.c index 8902abe..d4efad1 100644 --- a/main/compressors/lzma.c +++ b/lib/comp/lzma.c @@ -5,7 +5,7 @@ #include #include -#include "compressor.h" +#include "internal.h" #define CHUNK_SIZE 16384 @@ -160,11 +160,9 @@ static compressor_stream_t *lzma_uncompress(compressor_t *cmp) return create_stream(false); } -static compressor_t lzma = { +compressor_t comp_lzma = { .name = "lzma", .id = PKG_COMPRESSION_LZMA, .compression_stream = lzma_compress, .uncompression_stream = lzma_uncompress, }; - -REGISTER_COMPRESSOR(lzma) diff --git a/main/compressors/none.c b/lib/comp/none.c similarity index 95% rename from main/compressors/none.c rename to lib/comp/none.c index b72513c..eb1341c 100644 --- a/main/compressors/none.c +++ b/lib/comp/none.c @@ -4,7 +4,7 @@ #include #include -#include "compressor.h" +#include "internal.h" #define CHUNK_SIZE 16384 @@ -81,11 +81,9 @@ static compressor_stream_t *create_dummy_stream(compressor_t *cmp) return base; } -static compressor_t none = { +compressor_t comp_none = { .name = "none", .id = PKG_COMPRESSION_NONE, .compression_stream = create_dummy_stream, .uncompression_stream = create_dummy_stream, }; - -REGISTER_COMPRESSOR(none) diff --git a/main/compressors/zlib.c b/lib/comp/zlib.c similarity index 97% rename from main/compressors/zlib.c rename to lib/comp/zlib.c index 8a69078..8e63796 100644 --- a/main/compressors/zlib.c +++ b/lib/comp/zlib.c @@ -5,7 +5,7 @@ #include #include -#include "compressor.h" +#include "internal.h" #define CHUNK_SIZE 16384 @@ -159,11 +159,9 @@ static compressor_stream_t *zlib_uncompress(compressor_t *cmp) return create_stream(false); } -static compressor_t zlib = { +compressor_t comp_zlib = { .name = "zlib", .id = PKG_COMPRESSION_ZLIB, .compression_stream = zlib_compress, .uncompression_stream = zlib_uncompress, }; - -REGISTER_COMPRESSOR(zlib) diff --git a/main/Makemodule.am b/main/Makemodule.am index 1a8ba41..c3a62a3 100644 --- a/main/Makemodule.am +++ b/main/Makemodule.am @@ -1,13 +1,12 @@ pkg_SOURCES = include/pkgformat.h include/pkgreader.h include/pkgio.h -pkg_SOURCES += include/compressor.h include/command.h include/pkgwriter.h -pkg_SOURCES += include/depgraph.h -pkg_SOURCES += main/pkg.c main/compressor.c main/command.c main/pkgreader.c +pkg_SOURCES += include/command.h include/pkgwriter.h include/depgraph.h +pkg_SOURCES += main/pkg.c main/command.c main/pkgreader.c pkg_SOURCES += main/pkgwriter.c main/pkgio_rd_image_entry.c main/pkg_unpack.c pkg_SOURCES += main/depgraph/collect.c main/depgraph/pkglist.c pkg_SOURCES += main/depgraph/tsort.c pkg_CFLAGS = $(AM_CFLAGS) -pkg_LDADD = libutil.a libfilelist.a +pkg_LDADD = libutil.a libfilelist.a libcomp.a ##### commands ##### @@ -40,24 +39,12 @@ pkg_SOURCES += main/cmd/unpack.c pkg_SOURCES += main/cmd/help.c ##### compressors ##### - -# dummy compressor -pkg_SOURCES += main/compressors/none.c - -# zlib compressor -if WITH_ZLIB -pkg_SOURCES += main/compressors/zlib.c - -pkg_CFLAGS += $(ZLIB_CFLAGS) -pkg_LDADD += $(ZLIB_LIBS) -endif - -# lzma compressor if WITH_LZMA -pkg_SOURCES += main/compressors/lzma.c - -pkg_CFLAGS += $(XZ_CFLAGS) pkg_LDADD += $(XZ_LIBS) endif +if WITH_ZLIB +pkg_LDADD += $(ZLIB_LIBS) +endif + bin_PROGRAMS += pkg diff --git a/main/cmd/pack/pack.h b/main/cmd/pack/pack.h index cbf68b7..102b13b 100644 --- a/main/cmd/pack/pack.h +++ b/main/cmd/pack/pack.h @@ -21,7 +21,7 @@ #include "filelist/image_entry.h" -#include "compressor.h" +#include "comp/compressor.h" #include "pkgformat.h" #include "pkgwriter.h" #include "command.h" diff --git a/main/compressor.c b/main/compressor.c deleted file mode 100644 index 696ce44..0000000 --- a/main/compressor.c +++ /dev/null @@ -1,32 +0,0 @@ -/* SPDX-License-Identifier: ISC */ -#include - -#include "compressor.h" - -static compressor_t *list = NULL; - -void compressor_register(compressor_t *compressor) -{ - compressor->next = list; - list = compressor; -} - -compressor_t *compressor_by_name(const char *name) -{ - compressor_t *it = list; - - while (it != NULL && strcmp(it->name, name) != 0) - it = it->next; - - return it; -} - -compressor_t *compressor_by_id(PKG_COMPRESSION id) -{ - compressor_t *it = list; - - while (it != NULL && it->id != id) - it = it->next; - - return it; -} diff --git a/main/pkgreader.c b/main/pkgreader.c index 197207e..d3966d6 100644 --- a/main/pkgreader.c +++ b/main/pkgreader.c @@ -8,9 +8,9 @@ #include #include +#include "comp/compressor.h" #include "util/util.h" #include "pkgreader.h" -#include "compressor.h" struct pkg_reader_t { int fd;