hush: make ${#var} unicode-aware
No binary (build failed)
—
(log yok)
| @@ -1976,6 +1976,22 @@ static struct variable *set_vars_and_save_old(char **strings) | |
| } | |
| + | /* |
| + | * Unicode helper |
| + | */ |
| + | static void reinit_unicode_for_hush(void) |
| + | { |
| + | /* Unicode support should be activated even if LANG is set |
| + | * _during_ shell execution, not only if it was set when |
| + | * 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); |
| + | } |
| + | |
| + | |
| /* | |
| * in_str support | |
| */ | |
| @@ -2042,15 +2058,7 @@ static void get_user_input(struct in_str *i) | |
| /* Enable command line editing only while a command line | |
| * is actually being read */ | |
| do { | |
| - | /* Unicode support should be activated even if LANG is set |
| - | * _during_ shell execution, not only if it was set when |
| - | * 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); |
| - | |
| + | reinit_unicode_for_hush(); |
| G.flag_SIGINT = 0; | |
| /* buglet: SIGINT will not make new prompt to appear _at once_, | |
| * only after <Enter>. (^C will work) */ | |
| @@ -5028,8 +5036,9 @@ static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, cha | |
| /* Handle any expansions */ | |
| if (exp_op == 'L') { | |
| + | reinit_unicode_for_hush(); |
| debug_printf_expand("expand: length(%s)=", val); | |
| - | val = utoa(val ? strlen(val) : 0); |
| + | val = utoa(val ? unicode_strlen(val) : 0); |
| debug_printf_expand("%s\n", val); | |
| } else if (exp_op) { | |
| if (exp_op == '%' || exp_op == '#') { | |
| @@ -0,0 +1,3 @@ | |
| + | 1 |
| + | 1 |
| + | Ok |
| @@ -0,0 +1,13 @@ | |
| + | LANG=en_US.UTF-8 |
| + | |
| + | # A combining character U+300 |
| + | a=`printf "\xcc\x80"` |
| + | # Should print 1 |
| + | echo ${#a} |
| + | |
| + | # A Japanese katakana charachter U+30a3 |
| + | a=`printf "\xe3\x82\xa3"` |
| + | # Should print 1 |
| + | echo ${#a} |
| + | |
| + | echo Ok |