From 349d72c19ced4fae64e8fdd5792b37e78ac2f616 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 30 Sep 2018 16:56:56 +0200 Subject: [PATCH] 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 --- archival/unzip.c | 57 ++++++++++++++++++++++++++-------------- coreutils/ls.c | 4 +-- include/libbb.h | 3 ++- libbb/lineedit.c | 2 +- libbb/printable_string.c | 7 ++++- libbb/unicode.c | 2 +- util-linux/fdisk_gpt.c | 2 +- 7 files changed, 50 insertions(+), 27 deletions(-) diff --git a/archival/unzip.c b/archival/unzip.c index 96b7ab69b..c406d53c4 100644 --- a/archival/unzip.c +++ b/archival/unzip.c @@ -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)) { diff --git a/coreutils/ls.c b/coreutils/ls.c index b1c306809..db3ddb944 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -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); diff --git a/include/libbb.h b/include/libbb.h index 61fa1e03e..140404ff5 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -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) */ diff --git a/libbb/lineedit.c b/libbb/lineedit.c index d5e92e84c..b1e971f88 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c @@ -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]); } diff --git a/libbb/printable_string.c b/libbb/printable_string.c index 077d58d32..a814fd03c 100644 --- a/libbb/printable_string.c +++ b/libbb/printable_string.c @@ -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); +} diff --git a/libbb/unicode.c b/libbb/unicode.c index d378175a4..89d42179b 100644 --- a/libbb/unicode.c +++ b/libbb/unicode.c @@ -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; } diff --git a/util-linux/fdisk_gpt.c b/util-linux/fdisk_gpt.c index cdb90627d..dbe889f7c 100644 --- a/util-linux/fdisk_gpt.c +++ b/util-linux/fdisk_gpt.c @@ -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;