diff --git a/configure.ac b/configure.ac index b823fab3..1a90906e 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 669a14bb..6ecaf23e 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 4984a12e..ae0c8a07 100644 --- a/src/util/pactree.c +++ b/src/util/pactree.c @@ -21,10 +21,14 @@ #include #include #include - +#include #include #include +#ifdef HAVE_LANGINFO_H +#include +#endif + #define LINE_MAX 512 typedef struct tdepth { @@ -42,6 +46,19 @@ 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 */ + +static struct graph_style graph_utf8 = { + " provides", + UTF_VR UTF_H, + UTF_UR UTF_H, + UTF_V " ", + 3 +}; + static struct graph_style graph_default = { " provides", "|--", @@ -95,7 +112,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 +227,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 +242,24 @@ 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; + } +#else + style = &graph_default; +#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 +311,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 set an alternate database location\n" " -c, --color colorize output\n" " -d, --depth <#> limit the depth of recursion\n"