[git commit] tree: make it unicode-aware

Denys Vlasenko vda.linux at googlemail.com
Fri Aug 26 12:41:42 UTC 2022


commit: https://git.busybox.net/busybox/commit/?id=b30d345cfd995f111797f3377a3caaa263616081
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

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 at googlemail.com>
---
 miscutils/tree.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/miscutils/tree.c b/miscutils/tree.c
index 8b16c5383..10e5481c4 100644
--- a/miscutils/tree.c
+++ b/miscutils/tree.c
@@ -19,6 +19,7 @@
 
 #include "libbb.h"
 #include "common_bufsiz.h"
+#include "unicode.h"
 
 #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;
 	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
 	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);
 
 			if (index == size) {
-				strcpy(prefix_pos, "└── ");
+				strcpy(prefix_pos, end);
 			} else {
-				strcpy(prefix_pos, "├── ");
+				strcpy(prefix_pos, mid);
 			}
 			fputs_stdout(prefix_buf);
 
@@ -75,7 +87,7 @@ static void tree_print(unsigned count[2], const char* directory_name, char* pref
 				if (index == size) {
 					pos = stpcpy(prefix_pos, "    ");
 				} else {
-					pos = stpcpy(prefix_pos, "│   ");
+					pos = stpcpy(prefix_pos, bar);
 				}
 				tree_print(count, dirent->d_name, pos);
 				count[0]++;
@@ -103,6 +115,7 @@ int tree_main(int argc UNUSED_PARAM, char **argv)
 	unsigned count[2] = { 0, 0 };
 
 	setup_common_bufsiz();
+	init_unicode();
 
 	if (!argv[1])
 		*argv-- = (char*)".";


More information about the busybox-cvs mailing list