Nikita V. Youshchenko wrote:
Hi,
> - why SLsmg_write_char() puts garbage into buffer when gets (whar_t)1040?
>
I asked google about the SLsmg_write_char function and it seems the
first link it returns,
http://mail.gnome.org/archives/mc-devel/2006-June/msg00020.html,
contains a fix for the bug. At least it works for me, so I'm attaching a
patch from the above page, slightly adjusted for the current Debian
package.
Best Regards,
robert
diff -Nur mc-4.6.1/edit/editdraw.c mc-4.6.1.new/edit/editdraw.c
--- mc-4.6.1/edit/editdraw.c 2006-06-23 23:11:15.000000000 +0200
+++ mc-4.6.1.new/edit/editdraw.c 2006-06-23 23:11:46.000000000 +0200
@@ -239,7 +239,7 @@
lowlevel_set_color (color);
}
#ifdef UTF8
- SLsmg_write_char(textchar);
+ SLsmg_write_nwchars(&textchar, 1);
#else
addch (textchar);
#endif
diff -Nur mc-4.6.1/src/help.c mc-4.6.1.new/src/help.c
--- mc-4.6.1/src/help.c 2006-06-23 23:11:15.000000000 +0200
+++ mc-4.6.1.new/src/help.c 2006-06-23 23:11:46.000000000 +0200
@@ -461,7 +461,7 @@
len = mbrtowc(&wc, p, MB_CUR_MAX, &mbs);
if (len <= 0) len = 1; /* skip broken multibyte chars */
- SLsmg_write_char(wc);
+ SLsmg_write_nwchars(&wc, 1);
p += len - 1;
} else
#endif
diff -Nur mc-4.6.1/src/util.c mc-4.6.1.new/src/util.c
--- mc-4.6.1/src/util.c 2006-06-23 23:11:15.000000000 +0200
+++ mc-4.6.1.new/src/util.c 2006-06-23 23:12:51.000000000 +0200
@@ -59,8 +59,26 @@
#if SLANG_VERSION >= 20000
void SLsmg_write_nwchars(wchar_t *s, size_t n)
{
- while(n--)
- SLsmg_write_char(*s++);
+ if (SLsmg_is_utf8_mode()) { /* slang can handle it directly */
+ while(n-- && *s)
+ SLsmg_write_char(*s++);
+ }
+ else { /* convert wchars back to 8bit encoding */
+ mbstate_t mbs;
+ memset (&mbs, 0, sizeof (mbs));
+ while (n-- && *s) {
+ char buf[MB_LEN_MAX + 1]; /* should use 1 char, but to be sure */
+ if (*s < 0x80) {
+ SLsmg_write_char(*s++); /* ASCII */
+ }
+ else {
+ if (wcrtomb(buf, *s++, &mbs) == 1)
+ SLsmg_write_char((wchar_t)(buf[0]));
+ else
+ SLsmg_write_char('?'); /* should not happen */
+ }
+ }
+ }
}
#endif
diff -Nur mc-4.6.1/src/view.c mc-4.6.1.new/src/view.c
--- mc-4.6.1/src/view.c 2006-06-23 23:11:15.000000000 +0200
+++ mc-4.6.1.new/src/view.c 2006-06-23 23:11:46.000000000 +0200
@@ -856,7 +856,7 @@
#ifndef UTF8
#define view_add_character(view,c) addch (c)
#else /* UTF8 */
-#define view_add_character(view,c) SLsmg_write_char(c)
+#define view_add_character(view,c) {wchar_t tmp=c; SLsmg_write_nwchars(&tmp, 1);}
#endif /* UTF8 */
#define view_add_one_vline() one_vline()
#define view_add_string(view,s) addstr (s)