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) \
do { if (BB_BIG_ENDIAN) { \
(cdf).fmt.version_made_by = SWAP_LE16((cdf).fmt.version_made_by); \
(cdf).fmt.version_needed = SWAP_LE16((cdf).fmt.version_needed); \
(cdf).fmt.method = SWAP_LE16((cdf).fmt.method ); \
(cdf).fmt.modtime = SWAP_LE16((cdf).fmt.modtime ); \
(cdf).fmt.moddate = SWAP_LE16((cdf).fmt.moddate ); \
(cdf).fmt.crc32 = SWAP_LE32((cdf).fmt.crc32 ); \
(cdf).fmt.cmpsize = SWAP_LE32((cdf).fmt.cmpsize ); \
(cdf).fmt.ucmpsize = SWAP_LE32((cdf).fmt.ucmpsize ); \
(cdf).fmt.filename_len = SWAP_LE16((cdf).fmt.filename_len); \
(cdf).fmt.extra_len = SWAP_LE16((cdf).fmt.extra_len ); \
(cdf).fmt.version_needed = SWAP_LE16((cdf).fmt.version_needed ); \
(cdf).fmt.method = SWAP_LE16((cdf).fmt.method ); \
(cdf).fmt.modtime = SWAP_LE16((cdf).fmt.modtime ); \
(cdf).fmt.moddate = SWAP_LE16((cdf).fmt.moddate ); \
(cdf).fmt.crc32 = SWAP_LE32((cdf).fmt.crc32 ); \
(cdf).fmt.cmpsize = SWAP_LE32((cdf).fmt.cmpsize ); \
(cdf).fmt.ucmpsize = SWAP_LE32((cdf).fmt.ucmpsize ); \
(cdf).fmt.filename_len = SWAP_LE16((cdf).fmt.filename_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.external_attributes = SWAP_LE32((cdf).fmt.external_attributes); \
}} while (0)
@ -456,7 +456,9 @@ static int get_lstat_mode(const char *dst_fn)
struct stat stat_buf;
if (lstat(dst_fn, &stat_buf) == -1) {
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 */
return -1;
@ -634,7 +636,9 @@ int unzip_main(int argc, char **argv)
break;
if (++i > 2) {
*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]);
}
@ -646,8 +650,11 @@ int unzip_main(int argc, char **argv)
xchdir(base_dir);
if (quiet <= 1) { /* not -qq */
if (quiet == 0)
printf("Archive: %s\n", src_fn);
if (quiet == 0) {
printf("Archive: %s\n",
printable_string(src_fn)
);
}
if (opts & OPT_l) {
puts(verbose ?
" 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",
(unsigned)zip.fmt.ucmpsize,
dtbuf,
dst_fn);
printable_string(dst_fn)
);
} else {
char method6[7];
unsigned long percents;
@ -860,7 +868,8 @@ int unzip_main(int argc, char **argv)
(unsigned)percents,
dtbuf,
zip.fmt.crc32,
dst_fn);
printable_string(dst_fn)
);
total_size += zip.fmt.cmpsize;
}
total_usize += zip.fmt.ucmpsize;
@ -886,7 +895,7 @@ int unzip_main(int argc, char **argv)
mode = get_lstat_mode(dst_fn);
if (mode == -1) { /* ENOENT */
if (!quiet) {
printf(" creating: %s\n", dst_fn);
printf(" creating: %s\n", printable_string(dst_fn));
}
unzip_create_leading_dirs(dst_fn);
if (bb_make_directory(dst_fn, dir_mode, FILEUTILS_IGNORE_CHMOD_ERR)) {
@ -895,7 +904,9 @@ int unzip_main(int argc, char **argv)
} else {
if (!S_ISDIR(mode)) {
bb_error_msg_and_die("'%s' exists but is not a %s",
dst_fn, "directory");
printable_string(dst_fn),
"directory"
);
}
}
goto skip_cmpsize;
@ -914,12 +925,16 @@ int unzip_main(int argc, char **argv)
if (!S_ISREG(mode)) {
fishy:
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) {
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);
/* User input could take a long time. Is it still a regular file? */
mode = get_lstat_mode(dst_fn);
@ -949,7 +964,9 @@ int unzip_main(int argc, char **argv)
if (!quiet) {
printf(/* zip.fmt.method == 0
? " extracting: %s\n"
: */ " inflating: %s\n", dst_fn);
: */ " inflating: %s\n",
printable_string(dst_fn)
);
}
#if ENABLE_FEATURE_UNZIP_CDF
if (S_ISLNK(file_mode)) {

View File

@ -421,7 +421,7 @@ static unsigned calc_name_len(const char *name)
uni_stat_t uni_stat;
// 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)) {
return uni_stat.unicode_width;
@ -450,7 +450,7 @@ static unsigned print_name(const char *name)
uni_stat_t uni_stat;
// 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)) {
fputs(name, stdout);

View File

@ -833,7 +833,8 @@ typedef struct uni_stat_t {
} uni_stat_t;
/* Returns a string with unprintable chars replaced by '?' or
* 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
* (M-c is used only if ch is ORed with PRINTABLE_META),
* else it is printed as-is (except for ch = 0x9b) */

View File

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

View File

@ -9,7 +9,7 @@
#include "libbb.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;
const char *s;
@ -55,3 +55,8 @@ const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str)
#endif
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)
{
uni_stat_t uni_stat;
printable_string(&uni_stat, string);
printable_string2(&uni_stat, string);
return uni_stat.unicode_width;
}

View File

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