Use nl_langinfo properly to detect if the charset is utf8
authorPierre Habouzit <madcoder@debian.org>
Sun, 30 Dec 2007 10:50:19 +0000 (11:50 +0100)
committerPierre Habouzit <madcoder@debian.org>
Sun, 30 Dec 2007 11:09:37 +0000 (12:09 +0100)
  Also remove bogus guard: we cannot use waddch for a multi-byte character
(EUC-JP comes to mind).

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
demo/boxshell.c
madtty/madtty.c
madtty/madtty.h

index 806a1ff..15fbc41 100644 (file)
@@ -72,6 +72,7 @@ int main(void)
     keypad(stdscr, TRUE);
     curs_set(0);
     ESCDELAY=50;
+    madtty_init_vt100_graphics();
     madtty_init_colors();
     getmaxyx(stdscr, screen_h, screen_w);
 
index ef1230b..4bb95f7 100644 (file)
@@ -24,6 +24,7 @@
 #include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <langinfo.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -47,7 +48,7 @@
 
 #define IS_CONTROL(ch) !((ch) & 0xffffff60UL)
 
-static int has_default = 0;
+static int has_default, is_utf8;
 
 enum {
     C0_NUL = 0x00,
@@ -687,13 +688,10 @@ static void madtty_process_nonprinting(madtty_t *t, wchar_t wc)
     }
 }
 
-bool is_utf8 = true;
-
 static void is_utf8_locale(void)
 {
-    const char *l = getenv("LANG");
-    if (l)
-        is_utf8 = (strstr(l, "UTF-8") != NULL);
+    const char *cset = nl_langinfo(CODESET) ?: "ANSI_X3.4-1968";
+    is_utf8 = !strcmp(cset, "UTF-8");
 }
 
 // vt100 special graphics and line drawing
@@ -771,10 +769,9 @@ static void madtty_putc(madtty_t *t, wchar_t wc)
 
         if (t->graphmode) {
             if (wc >= 0x41 && wc <= 0x7e) {
-                if(is_utf8 && vt100_utf8[wc - 0x41])
-                    wc = vt100_utf8[wc - 0x41];
-                else if(!is_utf8 && vt100[wc - 0x41])
-                    wc = vt100[wc - 0x41];
+                wchar_t gc = is_utf8 ? vt100_utf8[wc - 0x41] : vt100[wc - 0x41];
+                if (gc)
+                    wc = gc;
             }
             width = 1;
         } else {
@@ -968,7 +965,7 @@ void madtty_draw(madtty_t *t, WINDOW *win, int srow, int scol)
         for (int j = 0; j < t->cols; j++) {
             if (!j || row->attr[j] != row->attr[j - 1])
                 wattrset(win, (attr_t)row->attr[j] << NCURSES_ATTR_SHIFT);
-            if (is_utf8 && row->text[j] >= 128) {
+            if (row->text[j] >= 128) {
                 char buf[MB_CUR_MAX + 1];
                 int len;
 
@@ -1064,11 +1061,11 @@ void madtty_init_colors(void)
                               fg == COLOR_WHITE ? -1 : fg,
                               bg == COLOR_BLACK ? -1 : bg);
                 } else {
-                init_pair((7 - fg) * 8 + bg, fg, bg);
+                    init_pair((7 - fg) * 8 + bg, fg, bg);
+                }
             }
         }
     }
-    }
 }
 
 int madtty_color_pair(int fg, int bg)
index c790a50..8e8424a 100644 (file)
 #include <unistd.h>
 #include <wchar.h>
 
+typedef struct madtty_t madtty_t;
+
 void madtty_init_colors(void);
-int madtty_color_pair(int fg, int bg);
 void madtty_init_vt100_graphics(void);
 
-typedef struct madtty_t madtty_t;
+int madtty_color_pair(int fg, int bg);
 
 madtty_t *madtty_create(int rows, int cols);
 void madtty_resize(madtty_t *, int rows, int cols);