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>
diff --git a/archival/bbunzip.c b/archival/bbunzip.c
index 86adb6e..08db275 100644
--- a/archival/bbunzip.c
+++ b/archival/bbunzip.c
@@ -27,9 +27,15 @@
 	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,
-	char* (*make_new_name)(char *filename),
-	IF_DESKTOP(long long) int (*unpacker)(unpack_info_t *info)
+	IF_DESKTOP(long long) int FAST_FUNC (*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;
@@ -68,7 +74,7 @@
 
 		/* Open dst if we are going to unpack to file */
 		if (filename) {
-			new_name = make_new_name(filename);
+			new_name = make_new_name(filename, expected_ext);
 			if (!new_name) {
 				bb_error_msg("%s: unknown suffix - ignored", filename);
 				goto err;
@@ -142,7 +148,7 @@
 
 #if ENABLE_UNCOMPRESS || ENABLE_BUNZIP2 || ENABLE_UNLZMA || ENABLE_UNXZ
 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, '.');
 	if (!extension || strcmp(extension + 1, expected_ext) != 0) {
@@ -163,12 +169,7 @@
  */
 #if ENABLE_UNCOMPRESS
 static
-char* make_new_name_uncompress(char *filename)
-{
-	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 FAST_FUNC unpack_uncompress(unpack_info_t *info UNUSED_PARAM)
 {
 	IF_DESKTOP(long long) int status = -1;
 
@@ -185,7 +186,7 @@
 	getopt32(argv, "cf");
 	argv += optind;
 
-	return bbunpack(argv, make_new_name_uncompress, unpack_uncompress);
+	return bbunpack(argv, unpack_uncompress, make_new_name_generic, "Z");
 }
 #endif
 
@@ -219,7 +220,7 @@
  */
 #if ENABLE_GUNZIP
 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, '.');
 
@@ -244,7 +245,7 @@
 	return filename;
 }
 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;
 
@@ -292,7 +293,7 @@
 	if (applet_name[1] == 'c')
 		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
 
@@ -305,12 +306,7 @@
  */
 #if ENABLE_BUNZIP2
 static
-char* make_new_name_bunzip2(char *filename)
-{
-	return make_new_name_generic(filename, "bz2");
-}
-static
-IF_DESKTOP(long long) int unpack_bunzip2(unpack_info_t *info UNUSED_PARAM)
+IF_DESKTOP(long long) int FAST_FUNC unpack_bunzip2(unpack_info_t *info UNUSED_PARAM)
 {
 	return unpack_bz2_stream_prime(STDIN_FILENO, STDOUT_FILENO);
 }
@@ -322,7 +318,7 @@
 	if (applet_name[2] == 'c') /* bzcat */
 		option_mask32 |= OPT_STDOUT;
 
-	return bbunpack(argv, make_new_name_bunzip2, unpack_bunzip2);
+	return bbunpack(argv, unpack_bunzip2, make_new_name_generic, "bz2");
 }
 #endif
 
@@ -337,12 +333,7 @@
  */
 #if ENABLE_UNLZMA
 static
-char* make_new_name_unlzma(char *filename)
-{
-	return make_new_name_generic(filename, "lzma");
-}
-static
-IF_DESKTOP(long long) int unpack_unlzma(unpack_info_t *info UNUSED_PARAM)
+IF_DESKTOP(long long) int FAST_FUNC unpack_unlzma(unpack_info_t *info UNUSED_PARAM)
 {
 	return unpack_lzma_stream(STDIN_FILENO, STDOUT_FILENO);
 }
@@ -360,19 +351,14 @@
 		option_mask32 |= OPT_STDOUT;
 
 	argv += optind;
-	return bbunpack(argv, make_new_name_unlzma, unpack_unlzma);
+	return bbunpack(argv, unpack_unlzma, make_new_name_generic, "lzma");
 }
 #endif
 
 
 #if ENABLE_UNXZ
 static
-char* make_new_name_unxz(char *filename)
-{
-	return make_new_name_generic(filename, "xz");
-}
-static
-IF_DESKTOP(long long) int unpack_unxz(unpack_info_t *info UNUSED_PARAM)
+IF_DESKTOP(long long) int FAST_FUNC unpack_unxz(unpack_info_t *info UNUSED_PARAM)
 {
 	return unpack_xz_stream(STDIN_FILENO, STDOUT_FILENO);
 }
@@ -390,6 +376,6 @@
 		option_mask32 |= OPT_STDOUT;
 
 	argv += optind;
-	return bbunpack(argv, make_new_name_unxz, unpack_unxz);
+	return bbunpack(argv, unpack_unxz, make_new_name_generic, "xz");
 }
 #endif