tree: make it unicode-aware

function                                             old     new   delta
tree_print                                           396     420     +24
.rodata                                           105251  105266     +15
tree_main                                             86      91      +5
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 44/0)               Total: 44 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2022-08-26 14:41:42 +02:00
parent 5eceafb1f8
commit b30d345cfd

View File

@ -19,6 +19,7 @@
#include "libbb.h" #include "libbb.h"
#include "common_bufsiz.h" #include "common_bufsiz.h"
#include "unicode.h"
#define prefix_buf bb_common_bufsiz1 #define prefix_buf bb_common_bufsiz1
@ -26,6 +27,17 @@ static void tree_print(unsigned count[2], const char* directory_name, char* pref
{ {
struct dirent **entries; struct dirent **entries;
int index, size; int index, size;
const char *bar = "| ";
const char *mid = "|-- ";
const char *end = "`-- ";
#if ENABLE_UNICODE_SUPPORT
if (unicode_status == UNICODE_ON) {
bar = "│   ";
mid = "├── ";
end = "└── ";
}
#endif
// read directory entries // read directory entries
size = scandir(directory_name, &entries, NULL, alphasort); size = scandir(directory_name, &entries, NULL, alphasort);
@ -55,9 +67,9 @@ static void tree_print(unsigned count[2], const char* directory_name, char* pref
status = lstat(dirent->d_name, &statBuf); status = lstat(dirent->d_name, &statBuf);
if (index == size) { if (index == size) {
strcpy(prefix_pos, "└── "); strcpy(prefix_pos, end);
} else { } else {
strcpy(prefix_pos, "├── "); strcpy(prefix_pos, mid);
} }
fputs_stdout(prefix_buf); fputs_stdout(prefix_buf);
@ -75,7 +87,7 @@ static void tree_print(unsigned count[2], const char* directory_name, char* pref
if (index == size) { if (index == size) {
pos = stpcpy(prefix_pos, " "); pos = stpcpy(prefix_pos, " ");
} else { } else {
pos = stpcpy(prefix_pos, "│   "); pos = stpcpy(prefix_pos, bar);
} }
tree_print(count, dirent->d_name, pos); tree_print(count, dirent->d_name, pos);
count[0]++; count[0]++;
@ -103,6 +115,7 @@ int tree_main(int argc UNUSED_PARAM, char **argv)
unsigned count[2] = { 0, 0 }; unsigned count[2] = { 0, 0 };
setup_common_bufsiz(); setup_common_bufsiz();
init_unicode();
if (!argv[1]) if (!argv[1])
*argv-- = (char*)"."; *argv-- = (char*)".";