unzip: use printable_string() for printing filenames

function                                             old     new   delta
unzip_main                                          2726    2792     +66
printable_string2                                      -      57     +57
identify                                            4329    4336      +7
expmeta                                              659     663      +4
add_interface                                         99     103      +4
beep_main                                            286     289      +3
changepath                                           192     194      +2
builtin_type                                         115     117      +2
devmem_main                                          469     470      +1
input_tab                                           1076    1074      -2
create_J                                            1821    1819      -2
poplocalvars                                         314     311      -3
doCommands                                          2222    2214      -8
do_load                                              918     902     -16
printable_string                                      57       9     -48
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 8/6 up/down: 146/-79)            Total: 67 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-09-30 16:56:56 +02:00
parent 14454b3071
commit 349d72c19c
7 changed files with 50 additions and 27 deletions

View File

@ -153,15 +153,15 @@ typedef union {
#define FIX_ENDIANNESS_CDF(cdf) \ #define FIX_ENDIANNESS_CDF(cdf) \
do { if (BB_BIG_ENDIAN) { \ do { if (BB_BIG_ENDIAN) { \
(cdf).fmt.version_made_by = SWAP_LE16((cdf).fmt.version_made_by); \ (cdf).fmt.version_made_by = SWAP_LE16((cdf).fmt.version_made_by); \
(cdf).fmt.version_needed = SWAP_LE16((cdf).fmt.version_needed); \ (cdf).fmt.version_needed = SWAP_LE16((cdf).fmt.version_needed ); \
(cdf).fmt.method = SWAP_LE16((cdf).fmt.method ); \ (cdf).fmt.method = SWAP_LE16((cdf).fmt.method ); \
(cdf).fmt.modtime = SWAP_LE16((cdf).fmt.modtime ); \ (cdf).fmt.modtime = SWAP_LE16((cdf).fmt.modtime ); \
(cdf).fmt.moddate = SWAP_LE16((cdf).fmt.moddate ); \ (cdf).fmt.moddate = SWAP_LE16((cdf).fmt.moddate ); \
(cdf).fmt.crc32 = SWAP_LE32((cdf).fmt.crc32 ); \ (cdf).fmt.crc32 = SWAP_LE32((cdf).fmt.crc32 ); \
(cdf).fmt.cmpsize = SWAP_LE32((cdf).fmt.cmpsize ); \ (cdf).fmt.cmpsize = SWAP_LE32((cdf).fmt.cmpsize ); \
(cdf).fmt.ucmpsize = SWAP_LE32((cdf).fmt.ucmpsize ); \ (cdf).fmt.ucmpsize = SWAP_LE32((cdf).fmt.ucmpsize ); \
(cdf).fmt.filename_len = SWAP_LE16((cdf).fmt.filename_len); \ (cdf).fmt.filename_len = SWAP_LE16((cdf).fmt.filename_len ); \
(cdf).fmt.extra_len = SWAP_LE16((cdf).fmt.extra_len ); \ (cdf).fmt.extra_len = SWAP_LE16((cdf).fmt.extra_len ); \
(cdf).fmt.file_comment_length = SWAP_LE16((cdf).fmt.file_comment_length); \ (cdf).fmt.file_comment_length = SWAP_LE16((cdf).fmt.file_comment_length); \
(cdf).fmt.external_attributes = SWAP_LE32((cdf).fmt.external_attributes); \ (cdf).fmt.external_attributes = SWAP_LE32((cdf).fmt.external_attributes); \
}} while (0) }} while (0)
@ -456,7 +456,9 @@ static int get_lstat_mode(const char *dst_fn)
struct stat stat_buf; struct stat stat_buf;
if (lstat(dst_fn, &stat_buf) == -1) { if (lstat(dst_fn, &stat_buf) == -1) {
if (errno != ENOENT) { if (errno != ENOENT) {
bb_perror_msg_and_die("can't stat '%s'", dst_fn); bb_perror_msg_and_die("can't stat '%s'",
dst_fn
);
} }
/* File does not exist */ /* File does not exist */
return -1; return -1;
@ -634,7 +636,9 @@ int unzip_main(int argc, char **argv)
break; break;
if (++i > 2) { if (++i > 2) {
*ext = '\0'; *ext = '\0';
bb_error_msg_and_die("can't open %s[.zip]", src_fn); bb_error_msg_and_die("can't open %s[.zip]",
src_fn
);
} }
strcpy(ext, extn[i - 1]); strcpy(ext, extn[i - 1]);
} }
@ -646,8 +650,11 @@ int unzip_main(int argc, char **argv)
xchdir(base_dir); xchdir(base_dir);
if (quiet <= 1) { /* not -qq */ if (quiet <= 1) { /* not -qq */
if (quiet == 0) if (quiet == 0) {
printf("Archive: %s\n", src_fn); printf("Archive: %s\n",
printable_string(src_fn)
);
}
if (opts & OPT_l) { if (opts & OPT_l) {
puts(verbose ? puts(verbose ?
" Length Method Size Cmpr Date Time CRC-32 Name\n" " Length Method Size Cmpr Date Time CRC-32 Name\n"
@ -831,7 +838,8 @@ int unzip_main(int argc, char **argv)
printf( "%9u " "%s " "%s\n", printf( "%9u " "%s " "%s\n",
(unsigned)zip.fmt.ucmpsize, (unsigned)zip.fmt.ucmpsize,
dtbuf, dtbuf,
dst_fn); printable_string(dst_fn)
);
} else { } else {
char method6[7]; char method6[7];
unsigned long percents; unsigned long percents;
@ -860,7 +868,8 @@ int unzip_main(int argc, char **argv)
(unsigned)percents, (unsigned)percents,
dtbuf, dtbuf,
zip.fmt.crc32, zip.fmt.crc32,
dst_fn); printable_string(dst_fn)
);
total_size += zip.fmt.cmpsize; total_size += zip.fmt.cmpsize;
} }
total_usize += zip.fmt.ucmpsize; total_usize += zip.fmt.ucmpsize;
@ -886,7 +895,7 @@ int unzip_main(int argc, char **argv)
mode = get_lstat_mode(dst_fn); mode = get_lstat_mode(dst_fn);
if (mode == -1) { /* ENOENT */ if (mode == -1) { /* ENOENT */
if (!quiet) { if (!quiet) {
printf(" creating: %s\n", dst_fn); printf(" creating: %s\n", printable_string(dst_fn));
} }
unzip_create_leading_dirs(dst_fn); unzip_create_leading_dirs(dst_fn);
if (bb_make_directory(dst_fn, dir_mode, FILEUTILS_IGNORE_CHMOD_ERR)) { if (bb_make_directory(dst_fn, dir_mode, FILEUTILS_IGNORE_CHMOD_ERR)) {
@ -895,7 +904,9 @@ int unzip_main(int argc, char **argv)
} else { } else {
if (!S_ISDIR(mode)) { if (!S_ISDIR(mode)) {
bb_error_msg_and_die("'%s' exists but is not a %s", bb_error_msg_and_die("'%s' exists but is not a %s",
dst_fn, "directory"); printable_string(dst_fn),
"directory"
);
} }
} }
goto skip_cmpsize; goto skip_cmpsize;
@ -914,12 +925,16 @@ int unzip_main(int argc, char **argv)
if (!S_ISREG(mode)) { if (!S_ISREG(mode)) {
fishy: fishy:
bb_error_msg_and_die("'%s' exists but is not a %s", bb_error_msg_and_die("'%s' exists but is not a %s",
dst_fn, "regular file"); printable_string(dst_fn),
"regular file"
);
} }
if (overwrite == O_ALWAYS) { if (overwrite == O_ALWAYS) {
goto do_open_and_extract; goto do_open_and_extract;
} }
printf("replace %s? [y]es, [n]o, [A]ll, [N]one, [r]ename: ", dst_fn); printf("replace %s? [y]es, [n]o, [A]ll, [N]one, [r]ename: ",
printable_string(dst_fn)
);
my_fgets80(key_buf); my_fgets80(key_buf);
/* User input could take a long time. Is it still a regular file? */ /* User input could take a long time. Is it still a regular file? */
mode = get_lstat_mode(dst_fn); mode = get_lstat_mode(dst_fn);
@ -949,7 +964,9 @@ int unzip_main(int argc, char **argv)
if (!quiet) { if (!quiet) {
printf(/* zip.fmt.method == 0 printf(/* zip.fmt.method == 0
? " extracting: %s\n" ? " extracting: %s\n"
: */ " inflating: %s\n", dst_fn); : */ " inflating: %s\n",
printable_string(dst_fn)
);
} }
#if ENABLE_FEATURE_UNZIP_CDF #if ENABLE_FEATURE_UNZIP_CDF
if (S_ISLNK(file_mode)) { if (S_ISLNK(file_mode)) {

View File

@ -421,7 +421,7 @@ static unsigned calc_name_len(const char *name)
uni_stat_t uni_stat; uni_stat_t uni_stat;
// TODO: quote tab as \t, etc, if -Q // TODO: quote tab as \t, etc, if -Q
name = printable_string(&uni_stat, name); name = printable_string2(&uni_stat, name);
if (!(option_mask32 & OPT_Q)) { if (!(option_mask32 & OPT_Q)) {
return uni_stat.unicode_width; return uni_stat.unicode_width;
@ -450,7 +450,7 @@ static unsigned print_name(const char *name)
uni_stat_t uni_stat; uni_stat_t uni_stat;
// TODO: quote tab as \t, etc, if -Q // TODO: quote tab as \t, etc, if -Q
name = printable_string(&uni_stat, name); name = printable_string2(&uni_stat, name);
if (!(option_mask32 & OPT_Q)) { if (!(option_mask32 & OPT_Q)) {
fputs(name, stdout); fputs(name, stdout);

View File

@ -833,7 +833,8 @@ typedef struct uni_stat_t {
} uni_stat_t; } uni_stat_t;
/* Returns a string with unprintable chars replaced by '?' or /* Returns a string with unprintable chars replaced by '?' or
* SUBST_WCHAR. This function is unicode-aware. */ * SUBST_WCHAR. This function is unicode-aware. */
const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str); const char* FAST_FUNC printable_string(const char *str);
const char* FAST_FUNC printable_string2(uni_stat_t *stats, const char *str);
/* Prints unprintable char ch as ^C or M-c to file /* Prints unprintable char ch as ^C or M-c to file
* (M-c is used only if ch is ORed with PRINTABLE_META), * (M-c is used only if ch is ORed with PRINTABLE_META),
* else it is printed as-is (except for ch = 0x9b) */ * else it is printed as-is (except for ch = 0x9b) */

View File

@ -1086,7 +1086,7 @@ static void showfiles(void)
); );
} }
if (ENABLE_UNICODE_SUPPORT) if (ENABLE_UNICODE_SUPPORT)
puts(printable_string(NULL, matches[n])); puts(printable_string(matches[n]));
else else
puts(matches[n]); puts(matches[n]);
} }

View File

@ -9,7 +9,7 @@
#include "libbb.h" #include "libbb.h"
#include "unicode.h" #include "unicode.h"
const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str) const char* FAST_FUNC printable_string2(uni_stat_t *stats, const char *str)
{ {
char *dst; char *dst;
const char *s; const char *s;
@ -55,3 +55,8 @@ const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str)
#endif #endif
return auto_string(dst); return auto_string(dst);
} }
const char* FAST_FUNC printable_string(const char *str)
{
return printable_string2(NULL, str);
}

View File

@ -996,7 +996,7 @@ size_t FAST_FUNC unicode_strlen(const char *string)
size_t FAST_FUNC unicode_strwidth(const char *string) size_t FAST_FUNC unicode_strwidth(const char *string)
{ {
uni_stat_t uni_stat; uni_stat_t uni_stat;
printable_string(&uni_stat, string); printable_string2(&uni_stat, string);
return uni_stat.unicode_width; return uni_stat.unicode_width;
} }

View File

@ -87,7 +87,7 @@ gpt_print_wide36(uint16_t *s)
} }
wc[i] = 0; wc[i] = 0;
if (wcstombs(buf, wc, sizeof(buf)) <= sizeof(buf)-1) if (wcstombs(buf, wc, sizeof(buf)) <= sizeof(buf)-1)
fputs(printable_string(NULL, buf), stdout); fputs(printable_string(buf), stdout);
#else #else
char buf[37]; char buf[37];
int i = 0; int i = 0;