aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2014-08-13 18:00:08 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2014-08-13 18:00:08 +0200
commite9ab07c211b283c0f798628858eaaef93a4893aa (patch)
tree9b1afa5a5dcac89c3e78337c4894eba4fa42fd0c /shell
parent841f8331d79c642b4268dae52c382fab2da9cddc (diff)
downloadbusybox-w32-e9ab07c211b283c0f798628858eaaef93a4893aa.tar.gz
busybox-w32-e9ab07c211b283c0f798628858eaaef93a4893aa.tar.bz2
busybox-w32-e9ab07c211b283c0f798628858eaaef93a4893aa.zip
ash: make ${#var} unicode-aware
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 3b8aac553..4ead6f990 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -2121,6 +2121,22 @@ lookupvar(const char *name)
2121 return NULL; 2121 return NULL;
2122} 2122}
2123 2123
2124static void reinit_unicode_for_ash(void)
2125{
2126 /* Unicode support should be activated even if LANG is set
2127 * _during_ shell execution, not only if it was set when
2128 * shell was started. Therefore, re-check LANG every time:
2129 */
2130 if (ENABLE_FEATURE_CHECK_UNICODE_IN_ENV
2131 || ENABLE_UNICODE_USING_LOCALE
2132 ) {
2133 const char *s = lookupvar("LC_ALL");
2134 if (!s) s = lookupvar("LC_CTYPE");
2135 if (!s) s = lookupvar("LANG");
2136 reinit_unicode(s);
2137 }
2138}
2139
2124/* 2140/*
2125 * Search the environment of a builtin command. 2141 * Search the environment of a builtin command.
2126 */ 2142 */
@@ -6798,7 +6814,15 @@ evalvar(char *p, int flags, struct strlist *var_str_list)
6798 varunset(p, var, 0, 0); 6814 varunset(p, var, 0, 0);
6799 6815
6800 if (subtype == VSLENGTH) { 6816 if (subtype == VSLENGTH) {
6801 cvtnum(varlen > 0 ? varlen : 0); 6817 ssize_t n = varlen;
6818 if (n > 0) {
6819 reinit_unicode_for_ash();
6820 if (unicode_status == UNICODE_ON) {
6821 const char *val = lookupvar(var);
6822 n = unicode_strlen(val);
6823 }
6824 }
6825 cvtnum(n > 0 ? n : 0);
6802 goto record; 6826 goto record;
6803 } 6827 }
6804 6828
@@ -9657,18 +9681,7 @@ preadfd(void)
9657# if ENABLE_FEATURE_TAB_COMPLETION 9681# if ENABLE_FEATURE_TAB_COMPLETION
9658 line_input_state->path_lookup = pathval(); 9682 line_input_state->path_lookup = pathval();
9659# endif 9683# endif
9660 /* Unicode support should be activated even if LANG is set 9684 reinit_unicode_for_ash();
9661 * _during_ shell execution, not only if it was set when
9662 * shell was started. Therefore, re-check LANG every time:
9663 */
9664 if (ENABLE_FEATURE_CHECK_UNICODE_IN_ENV
9665 || ENABLE_UNICODE_USING_LOCALE
9666 ) {
9667 const char *s = lookupvar("LC_ALL");
9668 if (!s) s = lookupvar("LC_CTYPE");
9669 if (!s) s = lookupvar("LANG");
9670 reinit_unicode(s);
9671 }
9672 nr = read_line_input(line_input_state, cmdedit_prompt, buf, IBUFSIZ, timeout); 9685 nr = read_line_input(line_input_state, cmdedit_prompt, buf, IBUFSIZ, timeout);
9673 if (nr == 0) { 9686 if (nr == 0) {
9674 /* Ctrl+C pressed */ 9687 /* Ctrl+C pressed */