sh: Track if the current locale's charset is UTF-8 or not.
authorPeter Avalos <pavalos@dragonflybsd.org>
Sun, 3 Jul 2011 02:28:16 +0000 (16:28 -1000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Sun, 21 Aug 2011 19:10:26 +0000 (12:10 -0700)
Obtained-from:   FreeBSD SVN rev 221559

bin/sh/main.c
bin/sh/var.c
bin/sh/var.h

index 688384e..1466f57 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#) Copyright (c) 1991, 1993 The Regents of the University of California.  All rights reserved.
  * @(#)main.c  8.6 (Berkeley) 5/28/95
- * $FreeBSD: src/bin/sh/main.c,v 1.45 2011/04/23 22:28:56 jilles Exp $
+ * $FreeBSD: src/bin/sh/main.c,v 1.46 2011/05/06 22:31:27 jilles Exp $
  */
 
 #include <stdio.h>
@@ -70,6 +70,7 @@
 int rootpid;
 int rootshell;
 struct jmploc main_handler;
+int localeisutf8;
 
 static void read_profile(const char *);
 static const char *find_dot_file(const char *);
@@ -90,6 +91,7 @@ main(int argc, char *argv[])
        char *shinit;
 
        setlocale(LC_ALL, "");
+       updatecharset();
        state = 0;
        if (setjmp(main_handler.loc)) {
                switch (exception) {
index 24e0e5b..717fd85 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)var.c   8.3 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/var.c,v 1.56 2011/02/04 22:47:55 jilles Exp $
+ * $FreeBSD: src/bin/sh/var.c,v 1.57 2011/05/06 22:31:27 jilles Exp $
  */
 
 #include <unistd.h>
@@ -45,6 +45,7 @@
  */
 
 #include <locale.h>
+#include <langinfo.h>
 #include <paths.h>
 
 #include "shell.h"
@@ -358,6 +359,7 @@ setvareq(char *s, int flags)
                        if ((vp->flags & VEXPORT) && localevar(s)) {
                                change_env(s, 1);
                                setlocale(LC_ALL, "");
+                               updatecharset();
                        }
                        INTON;
                        return;
@@ -376,6 +378,7 @@ setvareq(char *s, int flags)
        if ((vp->flags & VEXPORT) && localevar(s)) {
                change_env(s, 1);
                setlocale(LC_ALL, "");
+               updatecharset();
        }
        INTON;
 }
@@ -477,6 +480,7 @@ bltinsetlocale(void)
        if (loc != NULL) {
                setlocale(LC_ALL, loc);
                INTON;
+               updatecharset();
                return;
        }
        locdef = bltinlookup("LANG", 0);
@@ -488,6 +492,7 @@ bltinsetlocale(void)
                        setlocale(locale_categories[i], loc);
        }
        INTON;
+       updatecharset();
 }
 
 /*
@@ -502,12 +507,24 @@ bltinunsetlocale(void)
        for (lp = cmdenviron ; lp ; lp = lp->next) {
                if (localevar(lp->text)) {
                        setlocale(LC_ALL, "");
+                       updatecharset();
                        return;
                }
        }
        INTON;
 }
 
+/*
+ * Update the localeisutf8 flag.
+ */
+void
+updatecharset(void)
+{
+       char *charset;
+
+       charset = nl_langinfo(CODESET);
+       localeisutf8 = !strcmp(charset, "UTF-8");
+}
 
 /*
  * Generate a list of exported variables.  This routine is used to construct
@@ -653,6 +670,7 @@ exportcmd(int argc, char **argv)
                                                if ((vp->flags & VEXPORT) && localevar(vp->text)) {
                                                        change_env(vp->text, 1);
                                                        setlocale(LC_ALL, "");
+                                                       updatecharset();
                                                }
                                                goto found;
                                        }
@@ -847,6 +865,7 @@ unsetvar(const char *s)
                        if ((vp->flags & VEXPORT) && localevar(vp->text)) {
                                change_env(__DECONST(char *, s), 0);
                                setlocale(LC_ALL, "");
+                               updatecharset();
                        }
                        vp->flags &= ~VEXPORT;
                        vp->flags |= VUNSET;
index 389cb59..4d62501 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)var.h       8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/var.h,v 1.19 2011/01/01 13:26:18 jilles Exp $
+ * $FreeBSD: src/bin/sh/var.h,v 1.20 2011/05/06 22:31:27 jilles Exp $
  */
 
 /*
@@ -85,6 +85,8 @@ extern struct var vhistsize;
 extern struct var vterm;
 #endif
 
+extern int localeisutf8;
+
 /*
  * The following macros access the values of the above variables.
  * They have to skip over the name.  They return the null string
@@ -116,6 +118,7 @@ char *lookupvar(const char *);
 char *bltinlookup(const char *, int);
 void bltinsetlocale(void);
 void bltinunsetlocale(void);
+void updatecharset(void);
 char **environment(void);
 int showvarscmd(int, char **);
 int exportcmd(int, char **);