[pacman-dev] [PATCH] pactree: autodetect and use unicode line drawing characters

Dave Reisner dreisner at archlinux.org
Mon Oct 15 15:09:40 EDT 2012


Add a compile time check for langinfo.h so that we can possibly use
unicode line drawing characters if the current locale is supportive of
them. This can be explicitly disabled at runtime with the use of a new
switch: -a, --ascii.

Signed-off-by: Dave Reisner <dreisner at archlinux.org>
---
 configure.ac       |  4 ++--
 doc/pactree.8.txt  |  4 ++++
 src/util/pactree.c | 34 +++++++++++++++++++++++++++++++---
 3 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/configure.ac b/configure.ac
index 7fe696a..aa132c6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -247,8 +247,8 @@ AS_IF([test "x$have_gpgme" = xno -a "x$with_gpgme" = xyes],
 AM_CONDITIONAL([HAVE_LIBGPGME], [test "x$have_gpgme" = "xyes"])
 
 # Checks for header files.
-AC_CHECK_HEADERS([fcntl.h float.h glob.h libintl.h limits.h locale.h \
-                  mntent.h netinet/in.h netinet/tcp.h \
+AC_CHECK_HEADERS([fcntl.h float.h glob.h langinfo.h libintl.h limits.h \
+                  locale.h mntent.h netinet/in.h netinet/tcp.h \
                   stddef.h string.h sys/ioctl.h \
                   sys/mnttab.h sys/mount.h \
                   sys/param.h sys/statvfs.h sys/time.h sys/types.h \
diff --git a/doc/pactree.8.txt b/doc/pactree.8.txt
index 669a14b..6ecaf23 100644
--- a/doc/pactree.8.txt
+++ b/doc/pactree.8.txt
@@ -22,6 +22,10 @@ description is generated.
 
 Options
 -------
+*-a, \--ascii*::
+	Use ascii characters for tree formatting. By default, pactree will use unicode
+	line drawing characters if it is able to detect that the locale supports them.
+
 *-b, \--dbpath*::
 	Specify an alternative database location.
 
diff --git a/src/util/pactree.c b/src/util/pactree.c
index 77be629..82c9c0b 100644
--- a/src/util/pactree.c
+++ b/src/util/pactree.c
@@ -21,7 +21,7 @@
 #include <getopt.h>
 #include <stdio.h>
 #include <string.h>
-
+#include <locale.h>
 #include <alpm.h>
 #include <alpm_list.h>
 
@@ -42,6 +42,22 @@ struct graph_style {
 	int indent;
 };
 
+#define UTF_V   "\342\224\202"  /* U+2502, Vertical line drawing char */
+#define UTF_VR  "\342\224\234"  /* U+251C, Vertical and right */
+#define UTF_H   "\342\224\200"  /* U+2500, Horizontal */
+#define UTF_UR  "\342\224\224"  /* U+2514, Up and right */
+
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+static struct graph_style graph_utf8 = {
+	" provides",
+	UTF_VR UTF_H,
+	UTF_UR UTF_H,
+	UTF_V " ",
+	3
+};
+#endif
+
 static struct graph_style graph_default = {
 	" provides",
 	"|--",
@@ -95,7 +111,7 @@ alpm_list_t *provisions = NULL;
 
 /* options */
 struct color_choices *color = &no_color;
-struct graph_style *style = &graph_default;
+struct graph_style *style = &graph_utf8;
 int graphviz = 0;
 int max_depth = -1;
 int reverse = 0;
@@ -210,6 +226,7 @@ static int parse_options(int argc, char *argv[])
 	char *endptr = NULL;
 
 	static const struct option opts[] = {
+		{"ascii",   no_argument,          0, 'a'},
 		{"dbpath",  required_argument,    0, 'b'},
 		{"color",   no_argument,          0, 'c'},
 		{"depth",   required_argument,    0, 'd'},
@@ -224,12 +241,22 @@ static int parse_options(int argc, char *argv[])
 		{0, 0, 0, 0}
 	};
 
-	while((opt = getopt_long(argc, argv, "b:cd:ghlrsu", opts, &option_index))) {
+#ifdef HAVE_LANGINFO_H
+	setlocale(LC_ALL, "");
+	if(strcmp(nl_langinfo(CODESET), "UTF-8") == 0) {
+		style = &graph_utf8;
+	}
+#endif
+
+	while((opt = getopt_long(argc, argv, "ab:cd:ghlrsu", opts, &option_index))) {
 		if(opt < 0) {
 			break;
 		}
 
 		switch(opt) {
+			case 'a':
+				style = &graph_default;
+				break;
 			case OP_CONFIG:
 				configfile = optarg;
 				break;
@@ -281,6 +308,7 @@ static void usage(void)
 {
 	fprintf(stderr, "pactree v" PACKAGE_VERSION "\n"
 			"Usage: pactree [options] PACKAGE\n\n"
+			"  -a, --ascii          use ascii characters for tree formatting\n"
 			"  -b, --dbpath <path>  set an alternate database location\n"
 			"  -c, --color          colorize output\n"
 			"  -d, --depth <#>      limit the depth of recursion\n"
-- 
1.7.12.3



More information about the pacman-dev mailing list