--- mc-4.6.1-pre5/acinclude.m4 +++ mc-4.6.1-pre5/acinclude.m4 @@ -771,11 +771,11 @@ dnl Unless external S-Lang was requested, reject S-Lang with UTF-8 hacks if test x$with_screen = xslang; then : - m4_if([$1], strict, , - [AC_CHECK_LIB([slang], [SLsmg_write_nwchars], - [AC_MSG_WARN([Rejecting S-Lang with UTF-8 support, \ -it's not fully supported yet]) - with_screen=mcslang])]) +dnl m4_if([$1], strict, , +dnl [AC_CHECK_LIB([slang], [SLsmg_write_nwchars], +dnl [AC_MSG_WARN([Rejecting S-Lang with UTF-8 support, \ +dnl it's not fully supported yet]) +dnl with_screen=mcslang])]) fi if test x$with_screen = xslang; then --- mc-4.6.1-pre5/src/achown.c +++ mc-4.6.1-pre5/src/achown.c @@ -95,13 +95,16 @@ static void get_ownership (void) { /* set buttons - ownership */ const char *name_t; + int len; name_t = name_trunc (get_owner (sf_stat->st_uid), 15); - memset (b_user->text, ' ', 15); - strncpy (b_user->text, name_t, strlen (name_t)); + len = mbstrlen (name_t); + strcpy (b_user->text, name_t); + memset (strchr (b_user->text, '\0'), ' ', 15 - len); name_t = name_trunc (get_group (sf_stat->st_gid), 15); - memset (b_group->text, ' ', 15); - strncpy (b_group->text, name_t, strlen (name_t)); + len = mbstrlen (name_t); + strcpy (b_group->text, name_t); + memset (strchr (b_group->text, '\0'), ' ', 15 - len); } @@ -583,6 +586,12 @@ b_att[2] = button_new (XTRACT (6)); b_user = button_new (XTRACT (5)); b_group = button_new (XTRACT (4)); +#ifdef UTF8 + if (SLsmg_Is_Unicode) { + b_user->text = g_realloc (b_user->text, MB_CUR_MAX * 15 + 1); + b_group->text = g_realloc (b_group->text, MB_CUR_MAX * 15 + 1); + } +#endif add_widget (ch_dlg, b_group); add_widget (ch_dlg, b_user); --- mc-4.6.1-pre5/src/boxes.c +++ mc-4.6.1-pre5/src/boxes.c @@ -150,23 +150,23 @@ display_title = _(display_title); for (i = 0; i < LIST_TYPES; i++) { displays[i] = _(displays[i]); - if ((l = strlen (displays[i])) > maxlen) + if ((l = mbstrlen (displays[i])) > maxlen) maxlen = l; } - i = strlen (ok_button) + 5; - l = strlen (cancel_button) + 3; + i = mbstrlen (ok_button) + 5; + l = mbstrlen (cancel_button) + 3; l = max (i, l); i = maxlen + l + 16; if (i > DISPLAY_X) DISPLAY_X = i; - i = strlen (user_mini_status) + 13; + i = mbstrlen (user_mini_status) + 13; if (i > DISPLAY_X) DISPLAY_X = i; - i = strlen (display_title) + 10; + i = mbstrlen (display_title) + 10; if (i > DISPLAY_X) DISPLAY_X = i; @@ -285,20 +285,20 @@ int maxlen = 0; for (i = SORT_TYPES - 1; i >= 0; i--) { sort_orders_names[i] = _(sort_orders[i].sort_name); - r = strlen (sort_orders_names[i]); + r = mbstrlen (sort_orders_names[i]); if (r > maxlen) maxlen = r; } check_pos = maxlen + 9; - r = strlen (reverse_label) + 4; - i = strlen (case_label) + 4; + r = mbstrlen (reverse_label) + 4; + i = mbstrlen (case_label) + 4; if (i > r) r = i; - l = strlen (ok_button) + 6; - i = strlen (cancel_button) + 4; + l = mbstrlen (ok_button) + 6; + i = mbstrlen (cancel_button) + 4; if (i > l) l = i; @@ -307,7 +307,7 @@ if (i > SORT_X) SORT_X = i; - i = strlen (sort_title) + 6; + i = mbstrlen (sort_title) + 6; if (i > SORT_X) SORT_X = i; @@ -402,7 +402,7 @@ while (i--) { conf_widgets [i].text = _(conf_widgets [i].text); - l1 = strlen (conf_widgets [i].text) + 3; + l1 = mbstrlen (conf_widgets [i].text) + 3; if (l1 > maxlen) maxlen = l1; } @@ -417,8 +417,8 @@ * And this for the case when buttons with some space to the right * do not fit within 2/6 */ - l1 = strlen (conf_widgets [0].text) + 3; - i = strlen (conf_widgets [1].text) + 5; + l1 = mbstrlen (conf_widgets [0].text) + 3; + i = mbstrlen (conf_widgets [1].text) + 5; if (i > l1) l1 = i; @@ -489,11 +489,11 @@ { display_widgets [i].text = _(display_widgets[i].text); display_bits_str [i] = _(display_bits_str [i]); - l1 = strlen (display_bits_str [i]); + l1 = mbstrlen (display_bits_str [i]); if (l1 > maxlen) maxlen = l1; } - l1 = strlen (display_widgets [2].text); + l1 = mbstrlen (display_widgets [2].text); if (l1 > maxlen) maxlen = l1; @@ -501,8 +501,8 @@ display_bits.xlen = (maxlen + 5) * 6 / 4; /* See above confirm_box */ - l1 = strlen (display_widgets [0].text) + 3; - i = strlen (display_widgets [1].text) + 5; + l1 = mbstrlen (display_widgets [0].text) + 3; + i = mbstrlen (display_widgets [1].text) + 5; if (i > l1) l1 = i; @@ -597,7 +597,7 @@ cpname = _("&Select"); add_widget (dbits_dlg, - button_new (4, DISPX - 8 - strlen (cpname), B_USER, + button_new (4, DISPX - 8 - mbstrlen (cpname), B_USER, NORMAL_BUTTON, cpname, sel_charset_button)); return dbits_dlg; @@ -803,7 +803,7 @@ quick_widgets [1].y_divisions = quick_widgets [0].y_divisions = Quick_input.ylen = 5; - len = strlen (quick_widgets [1].text); + len = mbstrlen (quick_widgets [1].text); quick_widgets [0].relative_x = quick_widgets [1].relative_x + len + 1; @@ -962,7 +962,7 @@ { job_buttons [i].name = _(job_buttons [i].name); - len = strlen (job_buttons [i].name) + 4; + len = mbstrlen (job_buttons [i].name) + 4; JOBS_X = max (JOBS_X, startx + len + 3); job_buttons [i].xpos = startx; @@ -971,7 +971,7 @@ /* Last button - Ok a.k.a. Cancel :) */ job_buttons [n_buttons - 1].xpos = - JOBS_X - strlen (job_buttons [n_buttons - 1].name) - 7; + JOBS_X - mbstrlen (job_buttons [n_buttons - 1].name) - 7; i18n_flag = 1; } @@ -1029,7 +1029,7 @@ while (i--) { - l1 = strlen (labs [i] = _(labs [i])); + l1 = mbstrlen (labs [i] = _(labs [i])); if (l1 > maxlen) maxlen = l1; } @@ -1039,7 +1039,7 @@ for (i = sizeof(buts)/sizeof(buts[0]), l1 = 0; i--; ) { - l1 += strlen (buts [i] = _(buts [i])); + l1 += mbstrlen (buts [i] = _(buts [i])); } l1 += 15; if (l1 > dialog_x) @@ -1048,7 +1048,7 @@ ilen = dialog_x - 7 - maxlen; /* for the case of very long buttons :) */ istart = dialog_x - 3 - ilen; - b2 = dialog_x - (strlen(buts[1]) + 6); + b2 = dialog_x - (mbstrlen(buts[1]) + 6); i18n_flag = 1; } --- mc-4.6.1-pre5/src/filegui.c +++ mc-4.6.1-pre5/src/filegui.c @@ -564,8 +564,8 @@ * longest of "Overwrite..." labels * (assume "Target date..." are short enough) */ - l1 = max (strlen (rd_widgets[6].text), - strlen (rd_widgets[11].text)); + l1 = max (mbstrlen (rd_widgets[6].text), + mbstrlen (rd_widgets[11].text)); /* longest of button rows */ i = sizeof (rd_widgets) / sizeof (rd_widgets[0]); @@ -576,7 +576,7 @@ l2 = max (l2, l); l = 0; } - l += strlen (rd_widgets[i].text) + 4; + l += mbstrlen (rd_widgets[i].text) + 4; } } l2 = max (l2, l); /* last row */ @@ -594,12 +594,12 @@ l = l1; } rd_widgets[i].xpos = l; - l += strlen (rd_widgets[i].text) + 4; + l += mbstrlen (rd_widgets[i].text) + 4; } } /* Abort button is centered */ rd_widgets[1].xpos = - (rd_xlen - strlen (rd_widgets[1].text) - 3) / 2; + (rd_xlen - mbstrlen (rd_widgets[1].text) - 3) / 2; } #endif /* ENABLE_NLS */ @@ -618,7 +618,7 @@ ADD_RD_LABEL (ui, 0, name_trunc (ui->replace_filename, - rd_trunc - strlen (rd_widgets[0].text)), 0); + rd_trunc - mbstrlen (rd_widgets[0].text)), 0); ADD_RD_BUTTON (1); ADD_RD_BUTTON (2); @@ -805,36 +805,36 @@ if (fmd_widgets[i].text[0] != '\0') fmd_widgets[i].text = _(fmd_widgets[i].text); - len = strlen (fmd_widgets[FMCB11].text) - + strlen (fmd_widgets[FMCB21].text) + 15; + len = mbstrlen (fmd_widgets[FMCB11].text) + + mbstrlen (fmd_widgets[FMCB21].text) + 15; fmd_xlen = max (fmd_xlen, len); - len = strlen (fmd_widgets[FMCB12].text) - + strlen (fmd_widgets[FMCB22].text) + 15; + len = mbstrlen (fmd_widgets[FMCB12].text) + + mbstrlen (fmd_widgets[FMCB22].text) + 15; fmd_xlen = max (fmd_xlen, len); - len = strlen (fmd_widgets[FMBRGT].text) - + strlen (fmd_widgets[FMBLFT].text) + 11; + len = mbstrlen (fmd_widgets[FMBRGT].text) + + mbstrlen (fmd_widgets[FMBLFT].text) + 11; #ifdef FMBMID - len += strlen (fmd_widgets[FMBMID].text) + 6; + len += mbstrlen (fmd_widgets[FMBMID].text) + 6; #endif fmd_xlen = max (fmd_xlen, len + 4); len = (fmd_xlen - (len + 6)) / 2; i = fmd_widgets[FMBLFT].relative_x = len + 3; - i += strlen (fmd_widgets[FMBLFT].text) + 8; + i += mbstrlen (fmd_widgets[FMBLFT].text) + 8; #ifdef FMBMID fmd_widgets[FMBMID].relative_x = i; - i += strlen (fmd_widgets[FMBMID].text) + 6; + i += mbstrlen (fmd_widgets[FMBMID].text) + 6; #endif fmd_widgets[FMBRGT].relative_x = i; #define chkbox_xpos(i) \ - fmd_widgets [i].relative_x = fmd_xlen - strlen (fmd_widgets [i].text) - 6 + fmd_widgets [i].relative_x = fmd_xlen - mbstrlen (fmd_widgets [i].text) - 6 chkbox_xpos (FMCB0); chkbox_xpos (FMCB21); --- mc-4.6.1-pre5/src/find.c +++ mc-4.6.1-pre5/src/find.c @@ -205,7 +205,7 @@ int l1, maxlen = 0; while (i--) { - l1 = strlen (labs[i] = _(labs[i])); + l1 = mbstrlen (labs[i] = _(labs[i])); if (l1 > maxlen) maxlen = l1; } @@ -214,7 +214,7 @@ FIND_X = i; for (i = sizeof (buts) / sizeof (buts[0]), l1 = 0; i--;) { - l1 += strlen (buts[i] = _(buts[i])); + l1 += mbstrlen (buts[i] = _(buts[i])); } l1 += 21; if (l1 > FIND_X) @@ -223,8 +223,8 @@ ilen = FIND_X - 7 - maxlen; /* for the case of very long buttons :) */ istart = FIND_X - 3 - ilen; - b1 = b0 + strlen (buts[0]) + 7; - b2 = FIND_X - (strlen (buts[2]) + 6); + b1 = b0 + mbstrlen (buts[0]) + 7; + b2 = FIND_X - (mbstrlen (buts[2]) + 6); i18n_flag = 1; case_label = _(case_label); @@ -813,7 +813,7 @@ if (!i18n_flag) { register int i = sizeof (fbuts) / sizeof (fbuts[0]); while (i--) - fbuts[i].len = strlen (fbuts[i].text = _(fbuts[i].text)) + 3; + fbuts[i].len = mbstrlen (fbuts[i].text = _(fbuts[i].text)) + 3; fbuts[2].len += 2; /* DEFPUSH_BUTTON */ i18n_flag = 1; } --- mc-4.6.1-pre5/src/hotlist.c +++ mc-4.6.1-pre5/src/hotlist.c @@ -555,7 +555,7 @@ row = hotlist_but [i].y; ++count [row]; - len [row] += strlen (hotlist_but [i].text) + 5; + len [row] += mbstrlen (hotlist_but [i].text) + 5; if (hotlist_but [i].flags == DEFPUSH_BUTTON) len [row] += 2; } @@ -580,12 +580,12 @@ /* not first int the row */ if (!strcmp (hotlist_but [i].text, cancel_but)) hotlist_but [i].x = - cols - strlen (hotlist_but [i].text) - 13; + cols - mbstrlen (hotlist_but [i].text) - 13; else hotlist_but [i].x = cur_x [row]; } - cur_x [row] += strlen (hotlist_but [i].text) + 2 + cur_x [row] += mbstrlen (hotlist_but [i].text) + 2 + (hotlist_but [i].flags == DEFPUSH_BUTTON ? 5 : 3); } } @@ -814,7 +814,7 @@ for (i = 0; i < 3; i++) { qw [i].text = _(qw [i].text); - l[i] = strlen (qw [i].text) + 3; + l[i] = mbstrlen (qw [i].text) + 3; } space = (len - 4 - l[0] - l[1] - l[2]) / 4; @@ -860,7 +860,7 @@ static int i18n_flag = 0; #endif /* ENABLE_NLS */ - len = max (strlen (header), (size_t) msglen (text1, &lines1)); + len = max (mbstrlen (header), (size_t) msglen (text1, &lines1)); len = max (len, (size_t) msglen (text2, &lines2)) + 4; len = max (len, 64); @@ -955,7 +955,7 @@ static int i18n_flag = 0; #endif /* ENABLE_NLS */ - len = max (strlen (header), (size_t) msglen (label, &lines)) + 4; + len = max (mbstrlen (header), (size_t) msglen (label, &lines)) + 4; len = max (len, 64); #ifdef ENABLE_NLS @@ -1011,7 +1011,7 @@ { char *prompt, *label; const char *cp = _("Label for \"%s\":"); - int l = strlen (cp); + int l = mbstrlen (cp); char *label_string = g_strdup (current_panel->cwd); strip_password (label_string, 1); --- mc-4.6.1-pre5/src/layout.c +++ mc-4.6.1-pre5/src/layout.c @@ -362,36 +362,36 @@ while (i--) { s_split_direction[i] = _(s_split_direction[i]); - l1 = strlen (s_split_direction[i]) + 7; + l1 = mbstrlen (s_split_direction[i]) + 7; if (l1 > first_width) first_width = l1; } for (i = 0; i <= 8; i++) { check_options[i].text = _(check_options[i].text); - l1 = strlen (check_options[i].text) + 7; + l1 = mbstrlen (check_options[i].text) + 7; if (l1 > first_width) first_width = l1; } - l1 = strlen (title1) + 1; + l1 = mbstrlen (title1) + 1; if (l1 > first_width) first_width = l1; - l1 = strlen (title2) + 1; + l1 = mbstrlen (title2) + 1; if (l1 > first_width) first_width = l1; - second_width = strlen (title3) + 1; + second_width = mbstrlen (title3) + 1; for (i = 0; i < 6; i++) { check_options[i].text = _(check_options[i].text); - l1 = strlen (check_options[i].text) + 7; + l1 = mbstrlen (check_options[i].text) + 7; if (l1 > second_width) second_width = l1; } if (console_flag) { - l1 = strlen (output_lines_label) + 13; + l1 = mbstrlen (output_lines_label) + 13; if (l1 > second_width) second_width = l1; } @@ -405,14 +405,14 @@ * * Now the last thing to do - properly space buttons... */ - l1 = 11 + strlen (ok_button) /* 14 - all brackets and inner space */ - +strlen (save_button) /* notice: it is 3 char less because */ - +strlen (cancel_button); /* of '&' char in button text */ + l1 = 11 + mbstrlen (ok_button) /* 14 - all brackets and inner space */ + +mbstrlen (save_button) /* notice: it is 3 char less because */ + +mbstrlen (cancel_button); /* of '&' char in button text */ i = (first_width + second_width - l1) / 4; b1 = 5 + i; - b2 = b1 + strlen (ok_button) + i + 6; - b3 = b2 + strlen (save_button) + i + 4; + b2 = b1 + mbstrlen (ok_button) + i + 6; + b3 = b2 + mbstrlen (save_button) + i + 4; i18n_layt_flag = 1; } @@ -684,7 +684,7 @@ panel_do_cols (0); panel_do_cols (1); - promptl = strlen (prompt); + promptl = mbstrlen (prompt); widget_set_size (&the_menubar->widget, 0, 0, 1, COLS); --- mc-4.6.1-pre5/src/learn.c +++ mc-4.6.1-pre5/src/learn.c @@ -236,7 +236,7 @@ learn_but[0].x = 78 / 2 + 4; learn_but[1].text = _(learn_but[1].text); - learn_but[1].x = 78 / 2 - (strlen (learn_but[1].text) + 9); + learn_but[1].x = 78 / 2 - (mbstrlen (learn_but[1].text) + 9); learn_title = _(learn_title); i18n_flag = 1; --- mc-4.6.1-pre5/src/menu.c +++ mc-4.6.1-pre5/src/menu.c @@ -50,33 +50,102 @@ { Menu *menu; const char *cp; + int wlen = 0; + mbstate_t s; menu = (Menu *) g_malloc (sizeof (*menu)); menu->count = count; menu->max_entry_len = 20; menu->entries = entries; + menu->name = g_strdup (name); + menu_scan_hotkey (menu); +#ifdef UTF8 + menu->wentries = NULL; + menu->wname = NULL; + if (SLsmg_Is_Unicode) { + const char *str = menu->name; + memset (&s, 0, sizeof (s)); + wlen = mbsrtowcs (NULL, &str, -1, &s); + if (wlen > 0) + ++wlen; + else { + wlen = 0; + memset (&s, 0, sizeof (s)); + } + } +#endif if (entries != (menu_entry*) NULL) { register menu_entry* mp; for (mp = entries; count--; mp++) { if (mp->text[0] != '\0') { + int len; #ifdef ENABLE_NLS mp->text = _(mp->text); #endif /* ENABLE_NLS */ cp = strchr (mp->text,'&'); +#ifdef UTF8 + if (SLsmg_Is_Unicode) { + const char *str = mp->text; + + len = mbsrtowcs (NULL, &str, -1, &s); + if (len > 0) { + wlen += len + 1; + } else { + ++wlen; + memset (&s, 0, sizeof (s)); + } + } else +#endif + len = strlen (mp->text); + if (cp != NULL && *(cp+1) != '\0') { mp->hot_key = tolower (*(cp+1)); - menu->max_entry_len = max ((int) (strlen (mp->text) - 1), - menu->max_entry_len); + menu->max_entry_len = max (len - 1, menu->max_entry_len); } else { - menu->max_entry_len = max ((int) strlen (mp->text), - menu->max_entry_len); + menu->max_entry_len = max (len, menu->max_entry_len); } } } } +#ifdef UTF8 + if (wlen) { + wchar_t *wp; + const char *str; + int len; + + menu->wentries = (wchar_t **) + g_malloc (sizeof (wchar_t *) * menu->count + + wlen * sizeof (wchar_t)); + wp = (wchar_t *) (menu->wentries + menu->count); + str = menu->name; + len = mbsrtowcs (wp, &str, wlen, &s); + if (len > 0) { + menu->wname = wp; + wlen -= len + 1; + wp += len + 1; + } else + memset (&s, 0, sizeof (s)); + if (menu->entries != NULL) + for (count = 0; count < menu->count; ++count) + if (menu->entries[count].text[0] != '\0') { + str = menu->entries[count].text; + menu->wentries[count] = wp; + len = mbsrtowcs (wp, &str, wlen, &s); + if (len > 0) { + wlen -= len + 1; + wp += len + 1; + } else { + memset (&s, 0, sizeof (s)); + *wp++ = L'\0'; + --wlen; + } + } + } +#endif + menu->name = g_strdup (name); menu_scan_hotkey(menu); menu->start_x = 0; @@ -109,8 +178,26 @@ const unsigned char *text; addch((unsigned char)menu->entries [idx].first_letter); - for (text = menu->entries [idx].text; *text; text++) - { +#ifdef UTF8 + if (menu->wentries) { + wchar_t *wtext, *wp; + + for (wtext = wp = menu->wentries [idx]; *wtext; wtext++) { + if (*wtext == L'&') { + if (wtext > wp) + SLsmg_write_nwchars (wp, wtext - wp); + attrset (color == MENU_SELECTED_COLOR ? + MENU_HOTSEL_COLOR : MENU_HOT_COLOR); + SLsmg_write_nwchars (++wtext, 1); + attrset (color); + wp = wtext + 1; + } + } + if (wtext > wp) + SLsmg_write_nwchars (wp, wtext - wp); + } else +#endif + for (text = menu->entries [idx].text; *text; text++) { if (*text != '&') addch(*text); else { @@ -119,7 +206,7 @@ addch(*(++text)); attrset(color); } - } + } } widget_move (&menubar->widget, y, x + 1); } @@ -167,7 +254,13 @@ if (menubar->active) attrset(i == menubar->selected?MENU_SELECTED_COLOR:SELECTED_COLOR); widget_move (&menubar->widget, 0, menubar->menu [i]->start_x); - printw ("%s", menubar->menu [i]->name); +#ifdef UTF8 + if (menubar->menu [i]->wname) + SLsmg_write_nwchars (menubar->menu [i]->wname, + wcslen (menubar->menu [i]->wname)); + else +#endif + printw ("%s", menubar->menu [i]->name); } if (menubar->dropped) @@ -489,7 +582,13 @@ for (i = 0; i < items; i++) { - int len = strlen(menubar->menu[i]->name); + int len; +#ifdef UTF8 + if (menubar->menu[i]->wname) + len = wcslen (menubar->menu[i]->wname); + else +#endif + len = strlen(menubar->menu[i]->name); menubar->menu[i]->start_x = start_x; start_x += len + gap; } @@ -502,7 +601,13 @@ for (i = 0; i < items; i++) { /* preserve length here, to be used below */ - gap -= (menubar->menu[i]->start_x = strlen(menubar->menu[i]->name)); +#ifdef UTF8 + if (menubar->menu[i]->wname) + menubar->menu[i]->start_x = wcslen (menubar->menu[i]->wname); + else +#endif + menubar->menu[i]->start_x = strlen (menubar->menu[i]->name); + gap -= menubar->menu[i]->start_x; } gap /= (items - 1); @@ -526,6 +631,9 @@ void destroy_menu (Menu *menu) { +#ifdef UTF8 + g_free (menu->wentries); +#endif g_free (menu->name); g_free (menu->help_node); g_free (menu); --- mc-4.6.1-pre5/src/menu.h +++ mc-4.6.1-pre5/src/menu.h @@ -21,6 +21,8 @@ menu_entry *entries; int start_x; /* position relative to menubar start */ char *help_node; + wchar_t **wentries; + wchar_t *wname; } Menu; extern int menubar_visible; --- mc-4.6.1-pre5/src/myslang.h +++ mc-4.6.1-pre5/src/myslang.h @@ -11,6 +11,10 @@ #endif /* HAVE_SLANG_SLANG_H */ #endif +#ifdef UTF8 +# include +#endif + enum { KEY_BACKSPACE = 400, KEY_END, KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, --- mc-4.6.1-pre5/src/option.c +++ mc-4.6.1-pre5/src/option.c @@ -124,12 +124,12 @@ title2 = _(" Pause after run... "); title3 = _(" Other options "); - first_width = strlen (title1) + 1; - second_width = strlen (title3) + 1; + first_width = mbstrlen (title1) + 1; + second_width = mbstrlen (title3) + 1; for (i = 0; check_options[i].text; i++) { check_options[i].text = _(check_options[i].text); - l1 = strlen (check_options[i].text) + 7; + l1 = mbstrlen (check_options[i].text) + 7; if (i >= OTHER_OPTIONS) { if (l1 > first_width) first_width = l1; @@ -142,23 +142,23 @@ i = PAUSE_OPTIONS; while (i--) { pause_options[i] = _(pause_options[i]); - l1 = strlen (pause_options[i]) + 7; + l1 = mbstrlen (pause_options[i]) + 7; if (l1 > first_width) first_width = l1; } - l1 = strlen (title2) + 1; + l1 = mbstrlen (title2) + 1; if (l1 > first_width) first_width = l1; - l1 = 11 + strlen (ok_button) - + strlen (save_button) - + strlen (cancel_button); + l1 = 11 + mbstrlen (ok_button) + + mbstrlen (save_button) + + mbstrlen (cancel_button); i = (first_width + second_width - l1) / 4; b1 = 5 + i; - b2 = b1 + strlen (ok_button) + i + 6; - b3 = b2 + strlen (save_button) + i + 4; + b2 = b1 + mbstrlen (ok_button) + i + 6; + b3 = b2 + mbstrlen (save_button) + i + 4; i18n_config_flag = 1; } --- mc-4.6.1-pre5/src/panelize.c +++ mc-4.6.1-pre5/src/panelize.c @@ -127,7 +127,7 @@ i = sizeof (panelize_but) / sizeof (panelize_but[0]); while (i--) { panelize_but[i].text = _(panelize_but[i].text); - maxlen += strlen (panelize_but[i].text) + 5; + maxlen += mbstrlen (panelize_but[i].text) + 5; } maxlen += 10; @@ -136,11 +136,11 @@ panelize_cols = max (panelize_cols, maxlen); panelize_but[2].x = - panelize_but[3].x + strlen (panelize_but[3].text) + 7; + panelize_but[3].x + mbstrlen (panelize_but[3].text) + 7; panelize_but[1].x = - panelize_but[2].x + strlen (panelize_but[2].text) + 5; + panelize_but[2].x + mbstrlen (panelize_but[2].text) + 5; panelize_but[0].x = - panelize_cols - strlen (panelize_but[0].text) - 8 - BX; + panelize_cols - mbstrlen (panelize_but[0].text) - 8 - BX; #endif /* ENABLE_NLS */ --- mc-4.6.1-pre5/src/screen.c +++ mc-4.6.1-pre5/src/screen.c @@ -169,22 +169,59 @@ static const char * string_file_name (file_entry *fe, int len) { - static char buffer [BUF_SMALL]; size_t i; +#ifdef UTF8 + static char buffer [BUF_SMALL * 4]; + mbstate_t s; + int mbmax = MB_CUR_MAX; + const char *str = fe->fname; - for (i = 0; i < sizeof(buffer) - 1; i++) { - char c; + memset (&s, 0, sizeof (s)); +#else + static char buffer [BUF_SMALL]; +#endif - c = fe->fname[i]; +#ifdef UTF8 + if (SLsmg_Is_Unicode) + for (i = 0; i < sizeof (buffer) - 1; i++) { + wchar_t wc; + int len; - if (!c) - break; + len = mbrtowc (&wc, str, mbmax, &s); + if (!len) + break; + if (len < 0) { + memset (&s, 0, sizeof (s)); + buffer[i] = '?'; + str++; + continue; + } + if (!is_printable (wc)) { + buffer[i] = '?'; + str++; + continue; + } + if (i >= sizeof (buffer) - len) + break; + memcpy (buffer + i, str, len); + i += len - 1; + str += len; + } + else +#endif + for (i = 0; i < sizeof(buffer) - 1; i++) { + char c; - if (!is_printable(c)) - c = '?'; + c = fe->fname[i]; - buffer[i] = c; - } + if (!c) + break; + + if (!is_printable(c)) + c = '?'; + + buffer[i] = c; + } buffer[i] = 0; return buffer; @@ -425,42 +462,6 @@ { "dot", 1, 0, J_RIGHT, " ", 0, string_dot, NULL }, }; -static char * -to_buffer (char *dest, int just_mode, int len, const char *txt) -{ - int txtlen = strlen (txt); - int still, over; - - /* Fill buffer with spaces */ - memset (dest, ' ', len); - - still = (over=(txtlen > len)) ? (txtlen - len) : (len - txtlen); - - switch (HIDE_FIT(just_mode)){ - case J_LEFT: - still = 0; - break; - case J_CENTER: - still /= 2; - break; - case J_RIGHT: - default: - break; - } - - if (over){ - if (IS_FIT(just_mode)) - strcpy (dest, name_trunc(txt, len)); - else - strncpy (dest, txt+still, len); - } else - strncpy (dest+still, txt, txtlen); - - dest[len] = '\0'; - - return (dest + len); -} - static int file_compute_color (int attr, file_entry *fe) { @@ -514,14 +515,17 @@ /* Formats the file number file_index of panel in the buffer dest */ static void -format_file (char *dest, int limit, WPanel *panel, int file_index, int width, int attr, int isstatus) +format_file (WPanel *panel, int file_index, int width, int attr, int isstatus) { int color, length, empty_line; const char *txt; - char *old_pos; - char *cdest = dest; format_e *format, *home; file_entry *fe; +#ifdef UTF8 + char buffer[BUF_MEDIUM * sizeof (wchar_t)]; +#else + char buffer[BUF_MEDIUM]; +#endif length = 0; empty_line = (file_index >= panel->count); @@ -539,34 +543,105 @@ break; if (format->string_fn){ - int len; + int len, still, over, perm, txtlen, wide; if (empty_line) txt = " "; else txt = (*format->string_fn)(fe, format->field_len); - old_pos = cdest; - len = format->field_len; if (len + length > width) len = width - length; - if (len + (cdest - dest) > limit) - len = limit - (cdest - dest); + if (len >= BUF_MEDIUM) + len = BUF_MEDIUM - 1; if (len <= 0) break; - cdest = to_buffer (cdest, format->just_mode, len, txt); - length += len; - attrset (color); + perm = 0; + if (permission_mode) { + if (!strcmp(format->id, "perm")) + perm = 1; + else if (!strcmp(format->id, "mode")) + perm = 2; + } - if (permission_mode && !strcmp(format->id, "perm")) - add_permission_string (old_pos, format->field_len, fe, attr, color, 0); - else if (permission_mode && !strcmp(format->id, "mode")) - add_permission_string (old_pos, format->field_len, fe, attr, color, 1); - else - addstr (old_pos); + wide = 0; +#ifdef UTF8 + if (SLsmg_Is_Unicode && !empty_line && !perm) { + mbstate_t s; + const char *str = txt; + + memset (&s, 0, sizeof (s)); + txtlen = mbsrtowcs ((wchar_t *) buffer, &str, + sizeof (buffer) / sizeof (wchar_t), &s); + if (txtlen < 0) { + txt = " "; + txtlen = 1; + } else + wide = 1; + } else +#endif + txtlen = strlen (txt); + + over = txtlen > len; + still = over ? txtlen - len : len - txtlen; + switch (HIDE_FIT(format->just_mode)) { + case J_LEFT: + still = 0; + break; + case J_CENTER: + still /= 2; + break; + case J_RIGHT: + default: + break; + } + + attrset (color); + + if (wide) { +#ifdef UTF8 + if (over) { + if (IS_FIT (format->just_mode)) { + int len2 = len / 2 - 1 + (len % 2); + + SLsmg_write_nwchars ((wchar_t *) buffer, + len / 2); + SLsmg_write_nwchars (L"~", 1); + SLsmg_write_nwchars (((wchar_t *) buffer) + + txtlen - len2, len2); + } else + SLsmg_write_nwchars ((wchar_t *) buffer, len); + } else { + printw ("%*s", still, ""); + SLsmg_write_nwchars ((wchar_t *) buffer, txtlen); + printw ("%*s", len - txtlen - still, ""); + } +#endif + } else { + if (over) { + if (IS_FIT (format->just_mode)) + strcpy (buffer, name_trunc(txt, len)); + else + memcpy (buffer, txt + still, len); + } else { + memset (buffer, ' ', still); + memcpy (buffer + still, txt, txtlen); + memset (buffer + still + txtlen, ' ', + len - txtlen - still); + } + buffer[len] = '\0'; + + if (perm) + add_permission_string (buffer, format->field_len, fe, + attr, color, perm - 1); + else + addstr (buffer); + } + + length += len; } else { if (attr == SELECTED || attr == MARKED_SELECTED) attrset (SELECTED_COLOR); @@ -589,7 +664,6 @@ { int second_column = 0; int width, offset; - char buffer [BUF_MEDIUM]; offset = 0; if (!isstatus && panel->split){ @@ -618,7 +692,7 @@ widget_move (&panel->widget, file_index - panel->top_file + 2, 1); } - format_file (buffer, sizeof(buffer), panel, file_index, width, attr, isstatus); + format_file (panel, file_index, width, attr, isstatus); if (!isstatus && panel->split){ if (second_column) @@ -1068,6 +1142,12 @@ int side, width; const char *txt; +#ifdef UTF8 + char buffer[30 * sizeof (wchar_t)]; + mbstate_t s; + + memset (&s, 0, sizeof (s)); +#endif if (!panel->split) adjust_top_file (panel); @@ -1092,16 +1172,37 @@ if (format->string_fn){ txt = format->title; + attrset (MARKED_COLOR); + width -= format->field_len; +#ifdef UTF8 + if (SLsmg_Is_Unicode) { + const char *str = txt; + header_len = mbsrtowcs ((wchar_t *) buffer, &str, + sizeof (buffer) / sizeof (wchar_t), + &s); + if (header_len < 0) { + memset (&s, 0, sizeof (s)); + printw ("%*s", format->field_len, ""); + continue; + } + if (header_len > format->field_len) + header_len = format->field_len; + spaces = (format->field_len - header_len) / 2; + extra = (format->field_len - header_len) % 2; + printw ("%*s", spaces, ""); + SLsmg_write_nwchars ((wchar_t *) buffer, header_len); + printw ("%*s", spaces + extra, ""); + continue; + } +#endif header_len = strlen (txt); if (header_len > format->field_len) header_len = format->field_len; - attrset (MARKED_COLOR); spaces = (format->field_len - header_len) / 2; extra = (format->field_len - header_len) % 2; printw ("%*s%.*s%*s", spaces, "", header_len, txt, spaces+extra, ""); - width -= 2 * spaces + extra + header_len; } else { attrset (NORMAL_COLOR); one_vline (); --- mc-4.6.1-pre5/src/util.c +++ mc-4.6.1-pre5/src/util.c @@ -33,6 +33,7 @@ #include #include +#include "tty.h" #include "global.h" #include "profile.h" #include "main.h" /* mc_home */ @@ -44,6 +45,10 @@ #include "charsets.h" #endif +#ifdef UTF8 +#include +#endif + static const char app_text [] = "Midnight-Commander"; int easy_patterns = 1; @@ -78,8 +83,31 @@ } int +mbstrlen (const char *str) +{ +#ifdef UTF8 + if (SLsmg_Is_Unicode) { + static mbstate_t s; + int len; + + len = mbsrtowcs (NULL, &str, -1, &s); + if (len < 0) { + memset (&s, 0, sizeof (s)); + return -1; + } + return len; + } else +#endif + return strlen (str); +} + +int is_printable (int c) { +#ifdef UTF8 + if (SLsmg_Is_Unicode) + return iswprint (c); +#endif c &= 0xff; #ifdef HAVE_CHARSET @@ -222,25 +250,90 @@ name_trunc (const char *txt, int trunc_len) { static char x[MC_MAXPATHLEN + MC_MAXPATHLEN]; - int txt_len; + int txt_len, first, skip; char *p; + const char *str; if ((size_t) trunc_len > sizeof (x) - 1) { trunc_len = sizeof (x) - 1; } - txt_len = strlen (txt); - if (txt_len <= trunc_len) { - strcpy (x, txt); - } else { - int y = (trunc_len / 2) + (trunc_len % 2); - strncpy (x, txt, y); - strncpy (x + y, txt + txt_len - (trunc_len / 2), trunc_len / 2); - x[y] = '~'; - } - x[trunc_len] = 0; - for (p = x; *p; p++) - if (!is_printable (*p)) - *p = '?'; + txt_len = mbstrlen (txt); + first = 0; + skip = 0; + if (txt_len > trunc_len) { + first = trunc_len / 2; + skip = txt_len - trunc_len + 1; + } + +#ifdef UTF8 + if (SLsmg_Is_Unicode) { + mbstate_t s; + int mbmax; + + str = txt; + memset (&s, 0, sizeof (s)); + mbmax = MB_CUR_MAX; + p = x; + while (p < x + sizeof (x) - 1 && trunc_len) { + wchar_t wc; + int len; + + len = mbrtowc (&wc, str, mbmax, &s); + if (!len) + break; + if (len < 0) { + memset (&s, 0, sizeof (s)); + *p = '?'; + len = 1; + str++; + } else if (!is_printable (wc)) { + *p = '?'; + str += len; + len = 1; + } else if (p >= x + sizeof (x) - len) + break; + else { + memcpy (p, str, len); + str += len; + } + if (first) { + --trunc_len; + --first; + p += len; + if (!first && p < x + sizeof (x) - 1 && trunc_len) { + *p++ = '~'; + --trunc_len; + } + } else if (skip) + --skip; + else { + --trunc_len; + p += len; + } + } + } else +#endif + { + str = txt; + p = x; + while (p < x + sizeof (x) - 1) { + if (*str == '\0') + break; + else if (!is_printable (*str)) + *p++ = '?'; + else + *p++ = *str; + ++str; + if (first) { + --first; + if (!first) { + *p++ = '~'; + str += skip; + } + } + } + } + *p = '\0'; return x; } @@ -695,12 +788,14 @@ size_t i18n_checktimelength (void) { size_t length, a, b; - char buf [MAX_I18NTIMELENGTH + 1]; + char buf [4 * MAX_I18NTIMELENGTH + 1]; time_t testtime = time (NULL); - a = strftime (buf, sizeof(buf)-1, _("%b %e %H:%M"), localtime(&testtime)); - b = strftime (buf, sizeof(buf)-1, _("%b %e %Y"), localtime(&testtime)); - + strftime (buf, sizeof(buf)-1, _("%b %e %H:%M"), localtime(&testtime)); + a = mbstrlen (buf); + strftime (buf, sizeof(buf)-1, _("%b %e %Y"), localtime(&testtime)); + b = mbstrlen (buf); + length = max (a, b); /* Don't handle big differences. Use standard value (email bug, please) */ @@ -712,15 +807,12 @@ const char *file_date (time_t when) { - static char timebuf [MAX_I18NTIMELENGTH + 1]; + static char timebuf [4 * MAX_I18NTIMELENGTH + 1]; time_t current_time = time ((time_t) 0); - static size_t i18n_timelength = 0; static const char *fmtyear, *fmttime; const char *fmt; - if (i18n_timelength == 0){ - i18n_timelength = i18n_checktimelength() + 1; - + if (fmtyear == NULL) { /* strftime() format string for old dates */ fmtyear = _("%b %e %Y"); /* strftime() format string for recent dates */ @@ -740,7 +832,7 @@ else fmt = fmttime; - strftime (timebuf, i18n_timelength, fmt, localtime(&when)); + strftime (timebuf, sizeof (timebuf) - 1, fmt, localtime(&when)); return timebuf; } --- mc-4.6.1-pre5/src/util.h +++ mc-4.6.1-pre5/src/util.h @@ -93,6 +93,8 @@ char *get_group (int); char *get_owner (int); +int mbstrlen (const char *); + #define MAX_I18NTIMELENGTH 14 #define MIN_I18NTIMELENGTH 10 #define STD_I18NTIMELENGTH 12 --- mc-4.6.1-pre5/src/view.c +++ mc-4.6.1-pre5/src/view.c @@ -793,7 +793,7 @@ if (!i18n_adjust) { file_label = _("File: %s"); - i18n_adjust = strlen (file_label) - 2; + i18n_adjust = mbstrlen (file_label) - 2; } if (w < i18n_adjust + 6) --- mc-4.6.1-pre5/src/widget.c +++ mc-4.6.1-pre5/src/widget.c @@ -148,7 +148,11 @@ if (b->hotpos >= 0) { attrset ((b->selected) ? HOT_FOCUSC : HOT_NORMALC); widget_move (&b->widget, 0, b->hotpos + off); +#ifdef UTF8 + SLsmg_write_nwchars (&b->hotwc, 1); +#else addch ((unsigned char) b->text[b->hotpos]); +#endif } return MSG_HANDLED; @@ -179,7 +183,7 @@ static int button_len (const char *text, unsigned int flags) { - int ret = strlen (text); + int ret = mbstrlen (text); switch (flags){ case DEFPUSH_BUTTON: ret += 6; @@ -202,14 +206,36 @@ * the button text is g_malloc()ed, we can safely change and shorten it. */ static void -button_scan_hotkey (WButton *b) +scan_hotkey (char *text, int *hotposp, int *hotkeyp, wchar_t *hotwcp) { - char *cp = strchr (b->text, '&'); + char *cp = strchr (text, '&'); if (cp != NULL && cp[1] != '\0') { - g_strlcpy (cp, cp + 1, strlen (cp)); - b->hotkey = tolower (*cp); - b->hotpos = cp - b->text; +#ifdef UTF8 + if (SLsmg_Is_Unicode) { + mbstate_t s; + int len; + + *cp = '\0'; + memset (&s, 0, sizeof (s)); + len = mbrtowc (hotwcp, cp + 1, MB_CUR_MAX, &s); + if (len > 0) { + *hotposp = mbstrlen (text); + if (*hotposp < 0) { + *hotposp = -1; + } else { + /* FIXME */ + *hotkeyp = tolower (*hotwcp); + } + } + } else +#endif + { + *hotkeyp = tolower (cp[1]); + *hotposp = cp - text; + } + + memmove (cp, cp + 1, strlen (cp + 1) + 1); } } @@ -231,18 +257,19 @@ widget_want_hotkey (b->widget, 1); b->hotkey = 0; b->hotpos = -1; + b->hotwc = L'\0'; - button_scan_hotkey(b); + scan_hotkey(b->text, &b->hotpos, &b->hotkey, &b->hotwc); return b; } void button_set_text (WButton *b, const char *text) { - g_free (b->text); + g_free (b->text); b->text = g_strdup (text); b->widget.cols = button_len (text, b->flags); - button_scan_hotkey(b); + scan_hotkey(b->text, &b->hotpos, &b->hotkey, &b->hotwc); dlg_redraw (b->widget.parent); } @@ -320,16 +347,37 @@ widget_move (&r->widget, i, 0); printw ("(%c) ", (r->sel == i) ? '*' : ' '); - for (cp = r->texts[i]; *cp; cp++) { - if (*cp == '&') { - attrset ((i == r->pos && msg == WIDGET_FOCUS) - ? HOT_FOCUSC : HOT_NORMALC); - addch (*++cp); - attrset ((i == r->pos - && msg == WIDGET_FOCUS) ? FOCUSC : NORMALC); + cp = strchr (r->texts[i], '&'); + if (cp != NULL) { +#ifdef UTF8 + mbstate_t s; + wchar_t wc; + int len; +#endif + printw ("%.*s", (int) ((char *) cp - r->texts[i]), + r->texts[i]); + attrset ((i == r->pos && msg == WIDGET_FOCUS) + ? HOT_FOCUSC : HOT_NORMALC); +#ifdef UTF8 + if (SLsmg_Is_Unicode) { + memset (&s, 0, sizeof (s)); + len = mbrtowc (&wc, cp + 1, MB_CUR_MAX, &s); + ++cp; + if (len > 0) { + printw ("%.*s", len, cp); + cp += len; + } } else - addch (*cp); - } +#endif + { + addch (*++cp); + ++cp; + } + attrset ((i == r->pos && msg == WIDGET_FOCUS) + ? FOCUSC : NORMALC); + } else + cp = r->texts[i]; + addstr ((char *) cp); } return MSG_HANDLED; @@ -365,7 +413,7 @@ /* Compute the longest string */ max = 0; for (i = 0; i < count; i++){ - m = strlen (texts [i]); + m = mbstrlen (texts [i]); if (m > max) max = m; } @@ -426,7 +474,11 @@ if (c->hotpos >= 0) { attrset ((msg == WIDGET_FOCUS) ? HOT_FOCUSC : HOT_NORMALC); widget_move (&c->widget, 0, +c->hotpos + 4); +#ifdef UTF8 + SLsmg_write_nwchars (&c->hotwc, 1); +#else addch ((unsigned char) c->text[c->hotpos]); +#endif } return MSG_HANDLED; @@ -460,32 +512,18 @@ check_new (int y, int x, int state, const char *text) { WCheck *c = g_new (WCheck, 1); - const char *s; - char *t; - init_widget (&c->widget, y, x, 1, strlen (text), + init_widget (&c->widget, y, x, 1, mbstrlen (text), (callback_fn)check_callback, (mouse_h) check_event); c->state = state ? C_BOOL : 0; c->text = g_strdup (text); c->hotkey = 0; c->hotpos = -1; + c->hotwc = L'\0'; widget_want_hotkey (c->widget, 1); - /* Scan for the hotkey */ - for (s = text, t = c->text; *s; s++, t++){ - if (*s != '&'){ - *t = *s; - continue; - } - s++; - if (*s){ - c->hotkey = tolower (*s); - c->hotpos = t - c->text; - } - *t = *s; - } - *t = 0; + scan_hotkey (c->text, &c->hotpos, &c->hotkey, &c->hotwc); return c; } @@ -527,7 +565,7 @@ } widget_move (&l->widget, y, 0); printw ("%s", p); - xlen = l->widget.cols - strlen (p); + xlen = l->widget.cols - mbstrlen (p); if (xlen > 0) printw ("%*s", xlen, " "); if (!q) @@ -561,7 +599,7 @@ if (text){ label->text = g_strdup (text); if (label->auto_adjust_cols) { - newcols = strlen (text); + newcols = mbstrlen (text); if (newcols > label->widget.cols) label->widget.cols = newcols; } @@ -585,7 +623,7 @@ if (!text || strchr(text, '\n')) width = 1; else - width = strlen (text); + width = mbstrlen (text); l = g_new (WLabel, 1); init_widget (&l->widget, y, x, 1, width, @@ -740,7 +778,7 @@ int has_history = 0; int i, j; unsigned char c; - int buf_len = strlen (in->buffer); + int buf_len = mbstrlen (in->buffer); if (should_show_history_button (in)) has_history = HISTORY_BUTTON_WIDTH; @@ -919,7 +957,7 @@ show_hist (GList *history, int widget_x, int widget_y) { GList *hi, *z; - size_t maxlen = strlen (i18n_htitle ()), i, count = 0; + size_t maxlen = mbstrlen (i18n_htitle ()), i, count = 0; int x, y, w, h; char *q, *r = 0; Dlg_head *query_dlg; @@ -932,7 +970,7 @@ z = g_list_first (history); hi = z; while (hi) { - if ((i = strlen ((char *) hi->data)) > maxlen) + if ((i = mbstrlen ((char *) hi->data)) > maxlen) maxlen = i; count++; hi = g_list_next (hi); --- mc-4.6.1-pre5/src/widget.h +++ mc-4.6.1-pre5/src/widget.h @@ -25,6 +25,7 @@ char *text; /* text of button */ int hotkey; /* hot KEY */ int hotpos; /* offset hot KEY char in text */ + wchar_t hotwc; bcback callback; /* Callback function */ } WButton; @@ -43,6 +44,7 @@ char *text; /* text of check button */ int hotkey; /* hot KEY */ int hotpos; /* offset hot KEY char in text */ + wchar_t hotwc; } WCheck; typedef struct WGauge { --- mc-4.6.1-pre5/src/wtools.c +++ mc-4.6.1-pre5/src/wtools.c @@ -48,11 +48,11 @@ /* Adjust sizes */ lines = (lines > LINES - 6) ? LINES - 6 : lines; - if (title && (cols < (len = strlen (title) + 2))) + if (title && (cols < (len = mbstrlen (title) + 2))) cols = len; /* no &, but 4 spaces around button for brackets and such */ - if (cols < (len = strlen (cancel_string) + 3)) + if (cols < (len = mbstrlen (cancel_string) + 3)) cols = len; cols = cols > COLS - 6 ? COLS - 6 : cols; @@ -123,7 +123,7 @@ va_start (ap, count); for (i = 0; i < count; i++) { char *cp = va_arg (ap, char *); - win_len += strlen (cp) + 6; + win_len += mbstrlen (cp) + 6; if (strchr (cp, '&') != NULL) win_len--; } @@ -131,7 +131,7 @@ } /* count coordinates */ - cols = 6 + max (win_len, max ((int) strlen (header), msglen (text, &lines))); + cols = 6 + max (win_len, max ((int) mbstrlen (header), msglen (text, &lines))); lines += 4 + (count > 0 ? 2 : 0); xpos = COLS / 2 - cols / 2; ypos = LINES / 3 - (lines - 3) / 2; @@ -146,7 +146,7 @@ va_start (ap, count); for (i = 0; i < count; i++) { cur_name = va_arg (ap, char *); - xpos = strlen (cur_name) + 6; + xpos = mbstrlen (cur_name) + 6; if (strchr (cur_name, '&') != NULL) xpos--; @@ -457,7 +457,7 @@ g_strlcpy (histname + 3, header, 61); quick_widgets[2].histname = histname; - len = max ((int) strlen (header), msglen (text, &lines)) + 4; + len = max ((int) mbstrlen (header), msglen (text, &lines)) + 4; len = max (len, 64); /* The special value of def_text is used to identify password boxes @@ -477,7 +477,7 @@ */ quick_widgets[0].relative_x = len / 2 + 4; quick_widgets[1].relative_x = - len / 2 - (strlen (_(quick_widgets[1].text)) + 9); + len / 2 - (mbstrlen (_(quick_widgets[1].text)) + 9); quick_widgets[0].x_divisions = quick_widgets[1].x_divisions = len; #endif /* ENABLE_NLS */