*** ../bash-3.0/subst.c Sun Jul 4 13:56:13 2004 --- subst.c Thu Aug 12 13:36:17 2004 *************** *** 4692,4695 **** --- 4692,4715 ---- } + #if defined (HANDLE_MULTIBYTE) + size_t + mbstrlen (s) + const char *s; + { + size_t clen, nc; + mbstate_t mbs; + + nc = 0; + memset (&mbs, 0, sizeof (mbs)); + while ((clen = mbrlen(s, MB_CUR_MAX, &mbs)) != 0 && (MB_INVALIDCH(clen) == 0)) + { + s += clen; + nc++; + } + return nc; + } + #endif + + /* Handle the parameter brace expansion that requires us to return the length of a parameter. */ *************** *** 4747,4758 **** { t = get_dollar_var_value (arg_index); ! number = STRLEN (t); FREE (t); } #if defined (ARRAY_VARS) ! else if ((var = find_variable (name + 1)) && array_p (var)) { t = array_reference (array_cell (var), 0); ! number = STRLEN (t); } #endif --- 4767,4778 ---- { t = get_dollar_var_value (arg_index); ! number = MB_STRLEN (t); FREE (t); } #if defined (ARRAY_VARS) ! else if ((var = find_variable (name + 1)) && (invisible_p (var) == 0) && array_p (var)) { t = array_reference (array_cell (var), 0); ! number = MB_STRLEN (t); } #endif *************** *** 4767,4771 **** dispose_words (list); ! number = STRLEN (t); FREE (t); } --- 4787,4791 ---- dispose_words (list); ! number = MB_STRLEN (t); FREE (t); } *************** *** 4872,4876 **** case VT_VARIABLE: case VT_ARRAYMEMBER: ! len = strlen (value); break; case VT_POSPARMS: --- 4892,4896 ---- case VT_VARIABLE: case VT_ARRAYMEMBER: ! len = MB_STRLEN (value); break; case VT_POSPARMS: *************** *** 4892,4896 **** *e1p += len; ! if (*e1p >= len || *e1p < 0) return (-1); --- 4912,4916 ---- *e1p += len; ! if (*e1p > len || *e1p < 0) return (-1); *************** *** 4983,4987 **** return -1; } ! else if ((v = find_variable (varname)) && array_p (v)) { vtype = VT_ARRAYMEMBER; --- 5003,5007 ---- return -1; } ! else if ((v = find_variable (varname)) && (invisible_p (v) == 0) && array_p (v)) { vtype = VT_ARRAYMEMBER;