From: Christian Hesse <[email protected]>

v2: automatically detect UTF-8 locale

Signed-off-by: Christian Hesse <[email protected]>
---
 src/pacman/callback.c | 58 ++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 39 insertions(+), 19 deletions(-)

diff --git a/src/pacman/callback.c b/src/pacman/callback.c
index 7f72b84..06ea8e5 100644
--- a/src/pacman/callback.c
+++ b/src/pacman/callback.c
@@ -28,6 +28,7 @@
 #include <unistd.h>
 #include <wchar.h>
 #include <limits.h> /* UINT_MAX */
+#include <langinfo.h>
 
 #include <alpm.h>
 
@@ -102,8 +103,13 @@ static void fill_progress(const int bar_percent, const int 
disp_percent,
        const int hashlen = proglen > 8 ? proglen - 8 : 0;
        const int hash = bar_percent * hashlen / 100;
        static int lasthash = 0, mouth = 0;
+       uint8_t have_utf8 = 0;
        int i;
 
+       setlocale(LC_CTYPE, "");
+       if(strcmp(nl_langinfo(CODESET), "UTF-8") == 0)
+               have_utf8 = 1;
+
        if(bar_percent == 0) {
                lasthash = 0;
                mouth = 0;
@@ -112,30 +118,44 @@ static void fill_progress(const int bar_percent, const 
int disp_percent,
        if(hashlen > 0) {
                fputs(" [", stdout);
                for(i = hashlen; i > 0; --i) {
-                       /* if special progress bar enabled */
+                       /* progress bar with pacman... */
                        if(config->chomp) {
-                               if(i > hashlen - hash) {
-                                       putchar('-');
-                               } else if(i == hashlen - hash) {
-                                       if(lasthash == hash) {
-                                               if(mouth) {
-                                                       
fputs("\033[1;33mC\033[m", stdout);
-                                               } else {
-                                                       
fputs("\033[1;33mc\033[m", stdout);
-                                               }
+                               /* ... in unicode: [  ᗧ••ᗣ••] */
+                               if(have_utf8) {
+                                       if(i > hashlen - hash) {
+                                               putchar(' ');
+                                       } else if(i == hashlen - hash) {
+                                               fputs("\033[1;33mᗧ\033[m", 
stdout);
+                                       } else if(i % 3 == 0) {
+                                               printf("\033[1;%dmᗣ\033[m", i % 
5 + 31);
                                        } else {
-                                               lasthash = hash;
-                                               mouth = mouth == 1 ? 0 : 1;
-                                               if(mouth) {
-                                                       
fputs("\033[1;33mC\033[m", stdout);
+                                               fputs("\033[0;37m•\033[m", 
stdout);
+                                       }
+                               } /* ... in ascii: [--C  o  ] */
+                               else {
+                                       if(i > hashlen - hash) {
+                                               putchar('-');
+                                       } else if(i == hashlen - hash) {
+                                               if(lasthash == hash) {
+                                                       if(mouth) {
+                                                               
fputs("\033[1;33mC\033[m", stdout);
+                                                       } else {
+                                                               
fputs("\033[1;33mc\033[m", stdout);
+                                                       }
                                                } else {
-                                                       
fputs("\033[1;33mc\033[m", stdout);
+                                                       lasthash = hash;
+                                                       mouth = mouth == 1 ? 0 
: 1;
+                                                       if(mouth) {
+                                                               
fputs("\033[1;33mC\033[m", stdout);
+                                                       } else {
+                                                               
fputs("\033[1;33mc\033[m", stdout);
+                                                       }
                                                }
+                                       } else if(i % 3 == 0) {
+                                               fputs("\033[0;37mo\033[m", 
stdout);
+                                       } else {
+                                               fputs("\033[0;37m \033[m", 
stdout);
                                        }
-                               } else if(i % 3 == 0) {
-                                       fputs("\033[0;37mo\033[m", stdout);
-                               } else {
-                                       fputs("\033[0;37m \033[m", stdout);
                                }
                        } /* else regular progress bar */
                        else if(i > hashlen - hash) {
-- 
2.10.2

Reply via email to