bin/170651: On 9.0-RELEASE#0 and master sh(1) gobbles high bit
at first
Steffen Daode Nurpmeso
sdaoden at gmail.com
Wed Aug 29 10:30:06 UTC 2012
The following reply was made to PR bin/170651; it has been noted by GNATS.
From: Steffen "Daode" Nurpmeso <sdaoden at gmail.com>
To: Jilles Tjoelker <jilles at stack.nl>
Cc: bug-followup at FreeBSD.org
Subject: Re: bin/170651: On 9.0-RELEASE#0 and master sh(1) gobbles high bit at first
Date: Wed, 29 Aug 2012 12:24:11 +0200
This is a multi-part message in MIME format.
--=_503dedcb.nteIZRWEG6EbH/vp9TUbaaUn9m8DsADejmyTkwQSsrStVaAf
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Jilles Tjoelker <jilles at stack.nl> wrote:
|This PR bin/170651 does in fact look valid. It looks like libedit only
|partially picks up an LC_CTYPE change. Whether it shows '\OOO' or real
|characters with bit 7 set changes immediately; whether it accepts
|characters with bit 7 set changes only after doing something that causes
|libedit to be reinitialized (such as 'set +o').
|
|This is probably a bug in libedit and/or sh's use of it, although there
|are bigger bugs in libedit and sh's use of it.
|
|--
|Jilles Tjoelker
As all locale changes effectively boil down in var.c:{update,init}charset(),
either call histedit() in updatecharset(), which is what the first (-easy)
diff does, or introduce a new function which only performs the necessary
libedit call-in to update the mapping (second patch, -harder).
Since histedit() always causes a reparse of editrc(5) (and AFAIU), i would
vote for the harder patch :)
Thanks and ciao,
--steffen
--=_503dedcb.nteIZRWEG6EbH/vp9TUbaaUn9m8DsADejmyTkwQSsrStVaAf
Content-Type: text/plain;
charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="pr_bin_170651-easy.diff"
diff --git a/bin/sh/var.c b/bin/sh/var.c
index 6041459..ccbb5d7 100644
--- a/bin/sh/var.c
+++ b/bin/sh/var.c
@@ -515,6 +515,7 @@ bltinunsetlocale(void)
/*
* Update the localeisutf8 flag.
+ * And force reinitialization of libedit's key mappings (PR bin/170651).
*/
void
updatecharset(void)
@@ -523,6 +524,9 @@ updatecharset(void)
charset = nl_langinfo(CODESET);
localeisutf8 = !strcmp(charset, "UTF-8");
+#ifndef NO_HISTORY
+ histedit();
+#endif
}
void
--=_503dedcb.nteIZRWEG6EbH/vp9TUbaaUn9m8DsADejmyTkwQSsrStVaAf
Content-Type: text/plain;
charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="pr_bin_170651-harder.diff"
diff --git a/bin/sh/histedit.c b/bin/sh/histedit.c
index 6371599..069ac04 100644
--- a/bin/sh/histedit.c
+++ b/bin/sh/histedit.c
@@ -158,6 +158,16 @@ bad:
}
}
+void
+hist_on_lc_change(void)
+{
+ if (iflag && editing) {
+ if (el)
+ el_set(el, EL_EDITOR, Vflag ? "vi" : "emacs");
+ else
+ histedit();
+ }
+}
void
sethistsize(const char *hs)
diff --git a/bin/sh/myhistedit.h b/bin/sh/myhistedit.h
index e31276d..3193a09 100644
--- a/bin/sh/myhistedit.h
+++ b/bin/sh/myhistedit.h
@@ -37,6 +37,7 @@ extern EditLine *el;
extern int displayhist;
void histedit(void);
+void hist_on_lc_change(void);
void sethistsize(const char *);
void setterm(const char *);
diff --git a/bin/sh/var.c b/bin/sh/var.c
index 6041459..8f019bf 100644
--- a/bin/sh/var.c
+++ b/bin/sh/var.c
@@ -515,6 +515,7 @@ bltinunsetlocale(void)
/*
* Update the localeisutf8 flag.
+ * And force reinitialization of libedit's key mappings (PR bin/170651).
*/
void
updatecharset(void)
@@ -523,6 +524,9 @@ updatecharset(void)
charset = nl_langinfo(CODESET);
localeisutf8 = !strcmp(charset, "UTF-8");
+#ifndef NO_HISTORY
+ hist_on_lc_change();
+#endif
}
void
--=_503dedcb.nteIZRWEG6EbH/vp9TUbaaUn9m8DsADejmyTkwQSsrStVaAf--
More information about the freebsd-bugs
mailing list