unicode: check $LC_CTYPE too to detect Unicode mode
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 5 Jul 2013 20:00:57 +0000 (22:00 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 5 Jul 2013 20:00:57 +0000 (22:00 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Config.in
libbb/unicode.c
shell/ash.c
shell/hush.c

index 03c2d032f25be0d94284847134e443db68c7a51b..2c4be2e9f4d49f4a4c90e7acb0180a48c96dc686 100644 (file)
--- a/Config.in
+++ b/Config.in
@@ -161,12 +161,13 @@ config UNICODE_USING_LOCALE
          Internal implementation is smaller.
 
 config FEATURE_CHECK_UNICODE_IN_ENV
-       bool "Check $LANG environment variable"
+       bool "Check $LC_ALL, $LC_CTYPE and $LANG environment variables"
        default n
        depends on UNICODE_SUPPORT && !UNICODE_USING_LOCALE
        help
          With this option on, Unicode support is activated
-         only if LANG variable has the value of the form "xxxx.utf8"
+         only if locale-related variables have the value of the form
+         "xxxx.utf8"
 
          Otherwise, Unicode support will be always enabled and active.
 
index c1e3966fe2a95166dfcd23fe6df92c291c63f654..35e88d307119c64fa769ff058682b30ea867d911 100644 (file)
@@ -39,8 +39,15 @@ void FAST_FUNC reinit_unicode(const char *LANG)
 
 void FAST_FUNC init_unicode(void)
 {
+       /* Some people set only $LC_CTYPE, not $LC_ALL, because they want
+        * only Unicode to be activated on their system, not the whole
+        * shebang of wrong decimal points, strange date formats and so on.
+        *
+        * TODO? Maybe we should use LC_CTYPE instead of LC_ALL in setlocale()?
+        */
        if (unicode_status == UNICODE_UNKNOWN) {
                char *s = getenv("LC_ALL");
+               if (!s) s = getenv("LC_CTYPE");
                if (!s) s = getenv("LANG");
                reinit_unicode(s);
        }
@@ -63,6 +70,7 @@ void FAST_FUNC init_unicode(void)
 {
        if (unicode_status == UNICODE_UNKNOWN) {
                char *s = getenv("LC_ALL");
+               if (!s) s = getenv("LC_CTYPE");
                if (!s) s = getenv("LANG");
                reinit_unicode(s);
        }
index 90f222467f00b2b7afbbeb8c56eb209044d1b4d1..d696bbdaccaf87a04e4167be7bf2489c3be19bfc 100644 (file)
@@ -9659,6 +9659,7 @@ preadfd(void)
                 */
                {
                        const char *s = lookupvar("LC_ALL");
+                       if (!s) s = lookupvar("LC_CTYPE");
                        if (!s) s = lookupvar("LANG");
                        reinit_unicode(s);
                }
index 1fa84dc4f6440503fe6a1702ed31b59c8844901a..fc9b89b554479b471219a8b456e1e7cb4764fa5b 100644 (file)
@@ -2045,6 +2045,7 @@ static void get_user_input(struct in_str *i)
                 * shell was started. Therefore, re-check LANG every time:
                 */
                const char *s = get_local_var_value("LC_ALL");
+               if (!s) s = get_local_var_value("LC_CTYPE");
                if (!s) s = get_local_var_value("LANG");
                reinit_unicode(s);