archival/*: shrink by reusing sufficiently similar functions

function                                             old     new   delta
append_ext                                             -      16     +16
unxz_main                                             77      83      +6
unlzma_main                                           77      83      +6
uncompress_main                                       42      48      +6
gzip_main                                            184     190      +6
bzip2_main                                           114     120      +6
bunzip2_main                                          61      67      +6
bbunpack                                             469     475      +6
send_tree                                            355     360      +5
lzop_main                                             89      92      +3
gunzip_main                                           61      64      +3
make_new_name_lzop                                    84      82      -2
make_new_name_gunzip                                 114     112      -2
make_new_name_unxz                                    14       -     -14
make_new_name_unlzma                                  14       -     -14
make_new_name_uncompress                              14       -     -14
make_new_name_bunzip2                                 14       -     -14
make_new_name_gzip                                    17       -     -17
make_new_name_bzip2                                   17       -     -17
------------------------------------------------------------------------------
(add/remove: 1/6 grow/shrink: 10/2 up/down: 69/-94)           Total: -25 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2010-05-31 14:18:57 +02:00
parent b8b72f02f0
commit 39a04f71ca
5 changed files with 34 additions and 57 deletions

View File

@ -27,9 +27,15 @@ int open_to_or_warn(int to_fd, const char *filename, int flags, int mode)
return 0; return 0;
} }
char* FAST_FUNC append_ext(char *filename, const char *expected_ext)
{
return xasprintf("%s.%s", filename, expected_ext);
}
int FAST_FUNC bbunpack(char **argv, int FAST_FUNC bbunpack(char **argv,
char* (*make_new_name)(char *filename), IF_DESKTOP(long long) int FAST_FUNC (*unpacker)(unpack_info_t *info),
IF_DESKTOP(long long) int (*unpacker)(unpack_info_t *info) char* FAST_FUNC (*make_new_name)(char *filename, const char *expected_ext),
const char *expected_ext
) )
{ {
struct stat stat_buf; struct stat stat_buf;
@ -68,7 +74,7 @@ int FAST_FUNC bbunpack(char **argv,
/* Open dst if we are going to unpack to file */ /* Open dst if we are going to unpack to file */
if (filename) { if (filename) {
new_name = make_new_name(filename); new_name = make_new_name(filename, expected_ext);
if (!new_name) { if (!new_name) {
bb_error_msg("%s: unknown suffix - ignored", filename); bb_error_msg("%s: unknown suffix - ignored", filename);
goto err; goto err;
@ -142,7 +148,7 @@ int FAST_FUNC bbunpack(char **argv,
#if ENABLE_UNCOMPRESS || ENABLE_BUNZIP2 || ENABLE_UNLZMA || ENABLE_UNXZ #if ENABLE_UNCOMPRESS || ENABLE_BUNZIP2 || ENABLE_UNLZMA || ENABLE_UNXZ
static static
char* make_new_name_generic(char *filename, const char *expected_ext) char* FAST_FUNC make_new_name_generic(char *filename, const char *expected_ext)
{ {
char *extension = strrchr(filename, '.'); char *extension = strrchr(filename, '.');
if (!extension || strcmp(extension + 1, expected_ext) != 0) { if (!extension || strcmp(extension + 1, expected_ext) != 0) {
@ -163,12 +169,7 @@ char* make_new_name_generic(char *filename, const char *expected_ext)
*/ */
#if ENABLE_UNCOMPRESS #if ENABLE_UNCOMPRESS
static static
char* make_new_name_uncompress(char *filename) IF_DESKTOP(long long) int FAST_FUNC unpack_uncompress(unpack_info_t *info UNUSED_PARAM)
{
return make_new_name_generic(filename, "Z");
}
static
IF_DESKTOP(long long) int unpack_uncompress(unpack_info_t *info UNUSED_PARAM)
{ {
IF_DESKTOP(long long) int status = -1; IF_DESKTOP(long long) int status = -1;
@ -185,7 +186,7 @@ int uncompress_main(int argc UNUSED_PARAM, char **argv)
getopt32(argv, "cf"); getopt32(argv, "cf");
argv += optind; argv += optind;
return bbunpack(argv, make_new_name_uncompress, unpack_uncompress); return bbunpack(argv, unpack_uncompress, make_new_name_generic, "Z");
} }
#endif #endif
@ -219,7 +220,7 @@ int uncompress_main(int argc UNUSED_PARAM, char **argv)
*/ */
#if ENABLE_GUNZIP #if ENABLE_GUNZIP
static static
char* make_new_name_gunzip(char *filename) char* FAST_FUNC make_new_name_gunzip(char *filename, const char *expected_ext UNUSED_PARAM)
{ {
char *extension = strrchr(filename, '.'); char *extension = strrchr(filename, '.');
@ -244,7 +245,7 @@ char* make_new_name_gunzip(char *filename)
return filename; return filename;
} }
static static
IF_DESKTOP(long long) int unpack_gunzip(unpack_info_t *info) IF_DESKTOP(long long) int FAST_FUNC unpack_gunzip(unpack_info_t *info)
{ {
IF_DESKTOP(long long) int status = -1; IF_DESKTOP(long long) int status = -1;
@ -292,7 +293,7 @@ int gunzip_main(int argc UNUSED_PARAM, char **argv)
if (applet_name[1] == 'c') if (applet_name[1] == 'c')
option_mask32 |= OPT_STDOUT; option_mask32 |= OPT_STDOUT;
return bbunpack(argv, make_new_name_gunzip, unpack_gunzip); return bbunpack(argv, unpack_gunzip, make_new_name_gunzip, /*unused:*/ NULL);
} }
#endif #endif
@ -305,12 +306,7 @@ int gunzip_main(int argc UNUSED_PARAM, char **argv)
*/ */
#if ENABLE_BUNZIP2 #if ENABLE_BUNZIP2
static static
char* make_new_name_bunzip2(char *filename) IF_DESKTOP(long long) int FAST_FUNC unpack_bunzip2(unpack_info_t *info UNUSED_PARAM)
{
return make_new_name_generic(filename, "bz2");
}
static
IF_DESKTOP(long long) int unpack_bunzip2(unpack_info_t *info UNUSED_PARAM)
{ {
return unpack_bz2_stream_prime(STDIN_FILENO, STDOUT_FILENO); return unpack_bz2_stream_prime(STDIN_FILENO, STDOUT_FILENO);
} }
@ -322,7 +318,7 @@ int bunzip2_main(int argc UNUSED_PARAM, char **argv)
if (applet_name[2] == 'c') /* bzcat */ if (applet_name[2] == 'c') /* bzcat */
option_mask32 |= OPT_STDOUT; option_mask32 |= OPT_STDOUT;
return bbunpack(argv, make_new_name_bunzip2, unpack_bunzip2); return bbunpack(argv, unpack_bunzip2, make_new_name_generic, "bz2");
} }
#endif #endif
@ -337,12 +333,7 @@ int bunzip2_main(int argc UNUSED_PARAM, char **argv)
*/ */
#if ENABLE_UNLZMA #if ENABLE_UNLZMA
static static
char* make_new_name_unlzma(char *filename) IF_DESKTOP(long long) int FAST_FUNC unpack_unlzma(unpack_info_t *info UNUSED_PARAM)
{
return make_new_name_generic(filename, "lzma");
}
static
IF_DESKTOP(long long) int unpack_unlzma(unpack_info_t *info UNUSED_PARAM)
{ {
return unpack_lzma_stream(STDIN_FILENO, STDOUT_FILENO); return unpack_lzma_stream(STDIN_FILENO, STDOUT_FILENO);
} }
@ -360,19 +351,14 @@ int unlzma_main(int argc UNUSED_PARAM, char **argv)
option_mask32 |= OPT_STDOUT; option_mask32 |= OPT_STDOUT;
argv += optind; argv += optind;
return bbunpack(argv, make_new_name_unlzma, unpack_unlzma); return bbunpack(argv, unpack_unlzma, make_new_name_generic, "lzma");
} }
#endif #endif
#if ENABLE_UNXZ #if ENABLE_UNXZ
static static
char* make_new_name_unxz(char *filename) IF_DESKTOP(long long) int FAST_FUNC unpack_unxz(unpack_info_t *info UNUSED_PARAM)
{
return make_new_name_generic(filename, "xz");
}
static
IF_DESKTOP(long long) int unpack_unxz(unpack_info_t *info UNUSED_PARAM)
{ {
return unpack_xz_stream(STDIN_FILENO, STDOUT_FILENO); return unpack_xz_stream(STDIN_FILENO, STDOUT_FILENO);
} }
@ -390,6 +376,6 @@ int unxz_main(int argc UNUSED_PARAM, char **argv)
option_mask32 |= OPT_STDOUT; option_mask32 |= OPT_STDOUT;
argv += optind; argv += optind;
return bbunpack(argv, make_new_name_unxz, unpack_unxz); return bbunpack(argv, unpack_unxz, make_new_name_generic, "xz");
} }
#endif #endif

View File

@ -102,7 +102,7 @@ IF_DESKTOP(long long) int bz_write(bz_stream *strm, void* rbuf, ssize_t rlen, vo
} }
static static
IF_DESKTOP(long long) int compressStream(unpack_info_t *info UNUSED_PARAM) IF_DESKTOP(long long) int FAST_FUNC compressStream(unpack_info_t *info UNUSED_PARAM)
{ {
IF_DESKTOP(long long) int total; IF_DESKTOP(long long) int total;
ssize_t count; ssize_t count;
@ -135,12 +135,6 @@ IF_DESKTOP(long long) int compressStream(unpack_info_t *info UNUSED_PARAM)
return total; return total;
} }
static
char* make_new_name_bzip2(char *filename)
{
return xasprintf("%s.bz2", filename);
}
int bzip2_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int bzip2_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int bzip2_main(int argc UNUSED_PARAM, char **argv) int bzip2_main(int argc UNUSED_PARAM, char **argv)
{ {
@ -181,5 +175,5 @@ int bzip2_main(int argc UNUSED_PARAM, char **argv)
argv += optind; argv += optind;
option_mask32 &= 0x7; /* ignore all except -cfv */ option_mask32 &= 0x7; /* ignore all except -cfv */
return bbunpack(argv, make_new_name_bzip2, compressStream); return bbunpack(argv, compressStream, append_ext, "bz2");
} }

View File

@ -1998,13 +1998,7 @@ static void zip(ulg time_stamp)
/* ======================================================================== */ /* ======================================================================== */
static static
char* make_new_name_gzip(char *filename) IF_DESKTOP(long long) int FAST_FUNC pack_gzip(unpack_info_t *info UNUSED_PARAM)
{
return xasprintf("%s.gz", filename);
}
static
IF_DESKTOP(long long) int pack_gzip(unpack_info_t *info UNUSED_PARAM)
{ {
struct stat s; struct stat s;
@ -2063,7 +2057,7 @@ static const char gzip_longopts[] ALIGN1 =
#endif #endif
/* /*
* Linux kernel build uses gzip -d -n. We accept and ignore it. * Linux kernel build uses gzip -d -n. We accept and ignore -n.
* Man page says: * Man page says:
* -n --no-name * -n --no-name
* gzip: do not save the original file name and time stamp. * gzip: do not save the original file name and time stamp.
@ -2113,5 +2107,5 @@ int gzip_main(int argc UNUSED_PARAM, char **argv)
/* Initialise the CRC32 table */ /* Initialise the CRC32 table */
G1.crc_32_tab = crc32_filltable(NULL, 0); G1.crc_32_tab = crc32_filltable(NULL, 0);
return bbunpack(argv, make_new_name_gzip, pack_gzip); return bbunpack(argv, pack_gzip, append_ext, "gz");
} }

View File

@ -1042,7 +1042,7 @@ static smallint do_lzo_decompress(void)
return lzo_decompress(&header); return lzo_decompress(&header);
} }
static char* make_new_name_lzop(char *filename) static char* FAST_FUNC make_new_name_lzop(char *filename, const char *expected_ext UNUSED_PARAM)
{ {
if (option_mask32 & OPT_DECOMPRESS) { if (option_mask32 & OPT_DECOMPRESS) {
char *extension = strrchr(filename, '.'); char *extension = strrchr(filename, '.');
@ -1054,7 +1054,7 @@ static char* make_new_name_lzop(char *filename)
return xasprintf("%s.lzo", filename); return xasprintf("%s.lzo", filename);
} }
static IF_DESKTOP(long long) int pack_lzop(unpack_info_t *info UNUSED_PARAM) static IF_DESKTOP(long long) int FAST_FUNC pack_lzop(unpack_info_t *info UNUSED_PARAM)
{ {
if (option_mask32 & OPT_DECOMPRESS) if (option_mask32 & OPT_DECOMPRESS)
return do_lzo_decompress(); return do_lzo_decompress();
@ -1074,5 +1074,5 @@ int lzop_main(int argc UNUSED_PARAM, char **argv)
option_mask32 |= OPT_DECOMPRESS; option_mask32 |= OPT_DECOMPRESS;
G.lzo_crc32_table = crc32_filltable(NULL, 0); G.lzo_crc32_table = crc32_filltable(NULL, 0);
return bbunpack(argv, make_new_name_lzop, pack_lzop); return bbunpack(argv, pack_lzop, make_new_name_lzop, /*unused:*/ NULL);
} }

View File

@ -155,9 +155,12 @@ IF_DESKTOP(long long) int unpack_Z_stream(int src_fd, int dst_fd) FAST_FUNC;
/* wrapper which checks first two bytes to be "BZ" */ /* wrapper which checks first two bytes to be "BZ" */
IF_DESKTOP(long long) int unpack_bz2_stream_prime(int src_fd, int dst_fd) FAST_FUNC; IF_DESKTOP(long long) int unpack_bz2_stream_prime(int src_fd, int dst_fd) FAST_FUNC;
char* append_ext(char *filename, const char *expected_ext) FAST_FUNC;
int bbunpack(char **argv, int bbunpack(char **argv,
char* (*make_new_name)(char *filename), IF_DESKTOP(long long) int FAST_FUNC (*unpacker)(unpack_info_t *info),
IF_DESKTOP(long long) int (*unpacker)(unpack_info_t *info)) FAST_FUNC; char* FAST_FUNC (*make_new_name)(char *filename, const char *expected_ext),
const char *expected_ext
) FAST_FUNC;
#if BB_MMU #if BB_MMU
void open_transformer(int fd, void open_transformer(int fd,