]> git.pld-linux.org Git - packages/mc.git/commitdiff
- orphaned, outdated
authorJan Rękorajski <baggins@pld-linux.org>
Fri, 21 Apr 2006 23:41:16 +0000 (23:41 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    mc-4.6.0-utf8-fix.patch -> 1.2
    mc-4.6.0-utf8-hints.patch -> 1.2
    mc-4.6.0-utf8-input.patch -> 1.2
    mc-4.6.0-utf8.patch -> 1.3
    mc-64bit.patch -> 1.2
    mc-BINDIR.patch -> 1.2
    mc-extention.patch -> 1.4
    mc-ftpcrash.patch -> 1.2
    mc-showagain.patch -> 1.2
    mc-slang2.patch -> 1.3
    mc-stderr.patch -> 1.2
    mc-symcrash.patch -> 1.2
    mc-use_AM_GNU_GETTEXT.patch -> 1.2
    mc-use_old_sorting.patch -> 1.3

14 files changed:
mc-4.6.0-utf8-fix.patch [deleted file]
mc-4.6.0-utf8-hints.patch [deleted file]
mc-4.6.0-utf8-input.patch [deleted file]
mc-4.6.0-utf8.patch [deleted file]
mc-64bit.patch [deleted file]
mc-BINDIR.patch [deleted file]
mc-extention.patch [deleted file]
mc-ftpcrash.patch [deleted file]
mc-showagain.patch [deleted file]
mc-slang2.patch [deleted file]
mc-stderr.patch [deleted file]
mc-symcrash.patch [deleted file]
mc-use_AM_GNU_GETTEXT.patch [deleted file]
mc-use_old_sorting.patch [deleted file]

diff --git a/mc-4.6.0-utf8-fix.patch b/mc-4.6.0-utf8-fix.patch
deleted file mode 100644 (file)
index fb429d4..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
---- src/main.c
-+++ src/main.c
-@@ -868,7 +868,7 @@
-       int prompt_len;
-       prompt = strip_ctrl_codes (subshell_prompt);
--      prompt_len = strlen (prompt);
-+      prompt_len = mbstrlen (prompt);
-       /* Check for prompts too big */
-       if (COLS > 8 && prompt_len > COLS - 8) {
-@@ -1844,7 +1844,7 @@
-     if (xterm_flag && xterm_title) {
-       p = s = g_strdup (strip_home_and_password (cpanel->cwd));
-       do {
--          if (!is_printable (*s))
-+          if (*s < ' ')
-               *s = '?';
-       } while (*++s);
-       fprintf (stdout, "\33]0;mc - %s\7", p);
---- src/menu.c
-+++ src/menu.c
-@@ -20,6 +20,7 @@
- #include <stdarg.h>
- #include <sys/types.h>
- #include <ctype.h>
-+#include <wchar.h>
- #include "global.h"
- #include "tty.h"
- #include "menu.h"
---- src/util.c
-+++ src/util.c
-@@ -84,11 +84,13 @@
-     if (SLsmg_Is_Unicode) {
-       static mbstate_t s;
-       int len;
-+      const char *str0 = str;
-       len = mbsrtowcs (NULL, &str, -1, &s);
-       if (len < 0) {
--          memset (&s, 0, sizeof (s));
--          return -1;
-+              memset (&s, 0, sizeof (s));
-+              /* invalid multibyte character, probably not UTF-8 string */
-+              return strlen (str0);
-       }
-       return len;
-     } else
-@@ -917,7 +919,7 @@
-           continue;
-       }
--      if (is_printable(*r))
-+      if ((unsigned char)*r >= ' ')
-           *w++ = *r;
-       ++r;
-     }
diff --git a/mc-4.6.0-utf8-hints.patch b/mc-4.6.0-utf8-hints.patch
deleted file mode 100644 (file)
index 8e1e812..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
---- src/util.c
-+++ src/util.c
-@@ -34,6 +34,8 @@
- #include <errno.h>            /* my_system */
- #include <string.h>
- #include <ctype.h>
-+#include <iconv.h>
-+#include <langinfo.h>
- #include "tty.h"
- #include "global.h"
-@@ -751,11 +753,60 @@
-     }
- }
-+char *utf8_to_local(char *str)
-+{
-+   iconv_t cd;
-+   size_t buflen = strlen(str);
-+   char *output;
-+   int retry = 1;
-+        
-+   cd = iconv_open (nl_langinfo(CODESET), "UTF-8");
-+   if (cd == (iconv_t) -1) {
-+      return g_strdup(str);
-+   }
-+
-+   output = g_malloc(buflen + 1);
-+     
-+   while (retry)
-+   {
-+      char *wrptr = output;
-+      char *inptr = str;
-+      size_t insize = buflen;
-+      size_t avail = buflen;
-+        size_t nconv;
-+     
-+        nconv = iconv (cd, &inptr, &insize, &wrptr, &avail);
-+        if (nconv == (size_t) -1)
-+        {
-+          if (errno == E2BIG)
-+          {
-+              buflen *= 2;
-+              g_free(output);
-+              output = g_malloc(buflen + 1);
-+          }
-+          else
-+          {
-+              g_free(output);
-+              return g_strdup(str);
-+          }
-+      }
-+      else {
-+          retry = 0;
-+          *wrptr = 0;
-+      }
-+    }
-+     
-+    iconv_close (cd);
-+    
-+    return output;
-+}
-+
- char *load_mc_home_file (const char *filename, char ** allocated_filename)
- {
-     char *hintfile_base, *hintfile;
-     char *lang;
-     char *data;
-+    char *conv_data;
-     hintfile_base = concat_dir_and_file (mc_home, filename);
-     lang = guess_message_value ();
-@@ -785,7 +836,10 @@
-     else
-       g_free (hintfile);
--    return data;
-+    conv_data = utf8_to_local(data);
-+    g_free(data);
-+    
-+    return conv_data;
- }
- /* Check strftime() results. Some systems (i.e. Solaris) have different
diff --git a/mc-4.6.0-utf8-input.patch b/mc-4.6.0-utf8-input.patch
deleted file mode 100644 (file)
index eed49de..0000000
+++ /dev/null
@@ -1,2572 +0,0 @@
---- edit/edit-widget.h
-+++ edit/edit-widget.h
-@@ -25,6 +25,11 @@
-     unsigned char border;
- };
-+struct action {
-+    wchar_t ch;
-+    long flags;
-+};
-+
- struct WEdit {
-     Widget widget;
-@@ -38,8 +43,12 @@
-     /* dynamic buffers and cursor position for editor: */
-     long curs1;                       /* position of the cursor from the beginning of the file. */
-     long curs2;                       /* position from the end of the file */
--    unsigned char *buffers1[MAXBUFF + 1];     /* all data up to curs1 */
--    unsigned char *buffers2[MAXBUFF + 1];     /* all data from end of file down to curs2 */
-+    wchar_t *buffers1[MAXBUFF + 1];   /* all data up to curs1 */
-+    wchar_t *buffers2[MAXBUFF + 1];   /* all data from end of file down to curs2 */
-+
-+    unsigned char charbuf[MB_LEN_MAX];
-+    int charpoint;
-+
-     /* search variables */
-     long search_start;                /* First character to start searching from */
-@@ -84,7 +93,7 @@
-     /* undo stack and pointers */
-     unsigned long stack_pointer;
--    long *undo_stack;
-+    struct action *undo_stack;
-     unsigned long stack_size;
-     unsigned long stack_size_mask;
-     unsigned long stack_bottom;
---- edit/edit.c
-+++ edit/edit.c
-@@ -97,7 +97,7 @@
- #ifndef NO_INLINE_GETBYTE
--int edit_get_byte (WEdit * edit, long byte_index)
-+wchar_t edit_get_byte (WEdit * edit, long byte_index)
- {
-     unsigned long p;
-     if (byte_index >= (edit->curs1 + edit->curs2) || byte_index < 0)
-@@ -129,7 +129,7 @@
-     edit->curs1 = 0;
-     edit->curs2 = 0;
--    edit->buffers2[0] = g_malloc (EDIT_BUF_SIZE);
-+    edit->buffers2[0] = g_malloc (EDIT_BUF_SIZE * sizeof(wchar_t));
- }
- /*
-@@ -156,7 +156,7 @@
-     }
-     if (!edit->buffers2[buf2])
--      edit->buffers2[buf2] = g_malloc (EDIT_BUF_SIZE);
-+      edit->buffers2[buf2] = g_malloc (EDIT_BUF_SIZE  * sizeof(wchar_t));
-     mc_read (file,
-            (char *) edit->buffers2[buf2] + EDIT_BUF_SIZE -
-@@ -166,7 +166,7 @@
-     for (buf = buf2 - 1; buf >= 0; buf--) {
-       /* edit->buffers2[0] is already allocated */
-       if (!edit->buffers2[buf])
--          edit->buffers2[buf] = g_malloc (EDIT_BUF_SIZE);
-+          edit->buffers2[buf] = g_malloc (EDIT_BUF_SIZE * sizeof(wchar_t));
-       mc_read (file, (char *) edit->buffers2[buf], EDIT_BUF_SIZE);
-     }
-@@ -245,11 +245,41 @@
- static long
- edit_insert_stream (WEdit * edit, FILE * f)
- {
--    int c;
-+    wchar_t c;
-     long i = 0;
--    while ((c = fgetc (f)) >= 0) {
--      edit_insert (edit, c);
--      i++;
-+    unsigned char buf[MB_LEN_MAX];
-+    int charpos = 0;
-+    mbstate_t mbs;
-+      
-+    
-+    while ((c = fgetc (f)) != WEOF) {
-+      wchar_t wc;
-+      int size;
-+      int j;
-+      
-+      buf[charpos++] = c;
-+      
-+        memset (&mbs, 0, sizeof (mbs));
-+      size = mbrtowc(&wc, buf, charpos, &mbs);
-+      
-+      if (size == -2) 
-+          continue; /* incomplete */
-+      
-+      else if (size >= 0) {
-+          edit_insert (edit, wc);
-+          i++;
-+          charpos = 0;
-+          continue;
-+      }
-+      else {
-+      
-+              /* invalid  */
-+#ifdef __STDC_ISO_10646__
-+              for (j=0; j<charpos; j++)
-+                  edit_insert (edit, BINARY_CHAR_OFFSET + (wchar_t)buf[j]);
-+#endif
-+              charpos = 0;
-+      }
-     }
-     return i;
- }
-@@ -257,9 +287,26 @@
- long edit_write_stream (WEdit * edit, FILE * f)
- {
-     long i;
--    for (i = 0; i < edit->last_byte; i++)
--      if (fputc (edit_get_byte (edit, i), f) < 0)
--          break;
-+    for (i = 0; i < edit->last_byte; i++) {
-+      wchar_t wc = edit_get_byte (edit, i);
-+      int res;
-+      char tmpbuf[MB_LEN_MAX];
-+        mbstate_t mbs;
-+
-+        memset (&mbs, 0, sizeof (mbs));
-+      
-+#ifdef __STDC_ISO_10646__ 
-+      if (wc >= BINARY_CHAR_OFFSET && wc < (BINARY_CHAR_OFFSET + 256)) {
-+          res = 1;
-+          tmpbuf[0] = (char) (wc - BINARY_CHAR_OFFSET);
-+      } else
-+#endif
-+      res = wcrtomb(tmpbuf, wc, &mbs);
-+      if (res > 0) {
-+          if (fwrite(tmpbuf, res, 1, f) != 1)
-+              break;
-+      }
-+    }
-     return i;
- }
-@@ -299,12 +346,38 @@
-       int i, file, blocklen;
-       long current = edit->curs1;
-       unsigned char *buf;
-+      mbstate_t mbs;
-+      int bufstart = 0;
-+      
-+      memset (&mbs, 0, sizeof (mbs));
-       if ((file = mc_open (filename, O_RDONLY | O_BINARY)) == -1)
-           return 0;
-       buf = g_malloc (TEMP_BUF_LEN);
--      while ((blocklen = mc_read (file, (char *) buf, TEMP_BUF_LEN)) > 0) {
--          for (i = 0; i < blocklen; i++)
--              edit_insert (edit, buf[i]);
-+      while ((blocklen = mc_read (file, (char *) buf + bufstart, TEMP_BUF_LEN - bufstart)) > 0) {
-+          blocklen += bufstart;
-+          bufstart = 0;
-+          for (i = 0; i < blocklen; ) {
-+              wchar_t wc;
-+              int j;
-+              int size = mbrtowc(&wc, buf + i, blocklen - i, &mbs);
-+              if (size == -2) { /*incomplete char*/
-+                  bufstart = blocklen - i;
-+                  memcpy(buf, buf+i, bufstart);
-+                  i = blocklen;
-+                  memset (&mbs, 0, sizeof (mbs));
-+              }
-+              else if (size <= 0) {
-+#ifdef __STDC_ISO_10646__
-+                  edit_insert (edit, BINARY_CHAR_OFFSET + (wchar_t)buf[i]);
-+#endif
-+                  memset (&mbs, 0, sizeof (mbs));
-+                  i++; /* skip broken char */
-+              }
-+              else {
-+                  edit_insert (edit, wc);
-+                  i+=size;
-+              }
-+          }
-       }
-       edit_cursor_move (edit, current - edit->curs1);
-       g_free (buf);
-@@ -398,7 +471,7 @@
- static int
- edit_load_file (WEdit *edit)
- {
--    int fast_load = 1;
-+    int fast_load = 0; /* can't be used with multibyte caracters */
-     /* Cannot do fast load if a filter is used */
-     if (edit_find_filter (edit->filename) >= 0)
-@@ -546,7 +619,7 @@
-     edit_set_filename (edit, filename);
-     edit->stack_size = START_STACK_SIZE;
-     edit->stack_size_mask = START_STACK_SIZE - 1;
--    edit->undo_stack = g_malloc ((edit->stack_size + 10) * sizeof (long));
-+    edit->undo_stack = g_malloc ((edit->stack_size + 10) * sizeof (struct action));
-     if (edit_load_file (edit)) {
-       /* edit_load_file already gives an error message */
-       if (to_free)
-@@ -569,7 +642,7 @@
-       edit_move_display (edit, line - 1);
-       edit_move_to_line (edit, line - 1);
-     }
--
-+    edit->charpoint = 0;
-     return edit;
- }
-@@ -690,13 +763,23 @@
- {
-     unsigned long sp = edit->stack_pointer;
-     unsigned long spm1;
--    long *t;
-+    struct action *t;
-+    wchar_t ch = 0;
-+    
-+    if (c == CHAR_INSERT || c == CHAR_INSERT_AHEAD) {
-+      va_list ap;
-+      va_start (ap, c);
-+      ch = va_arg (ap, wchar_t);
-+      va_end (ap);
-+    }
-+
-+
- /* first enlarge the stack if necessary */
-     if (sp > edit->stack_size - 10) { /* say */
-       if (option_max_undo < 256)
-           option_max_undo = 256;
-       if (edit->stack_size < option_max_undo) {
--          t = g_realloc (edit->undo_stack, (edit->stack_size * 2 + 10) * sizeof (long));
-+          t = g_realloc (edit->undo_stack, (edit->stack_size * 2 + 10) * sizeof (struct action));
-           if (t) {
-               edit->undo_stack = t;
-               edit->stack_size <<= 1;
-@@ -711,7 +794,7 @@
- #ifdef FAST_MOVE_CURSOR
-     if (c == CURS_LEFT_LOTS || c == CURS_RIGHT_LOTS) {
-       va_list ap;
--      edit->undo_stack[sp] = c == CURS_LEFT_LOTS ? CURS_LEFT : CURS_RIGHT;
-+      edit->undo_stack[sp].flags = c == CURS_LEFT_LOTS ? CURS_LEFT : CURS_RIGHT;
-       edit->stack_pointer = (edit->stack_pointer + 1) & edit->stack_size_mask;
-       va_start (ap, c);
-       c = -(va_arg (ap, int));
-@@ -722,12 +805,14 @@
-       && spm1 != edit->stack_bottom
-       && ((sp - 2) & edit->stack_size_mask) != edit->stack_bottom) {
-       int d;
--      if (edit->undo_stack[spm1] < 0) {
--          d = edit->undo_stack[(sp - 2) & edit->stack_size_mask];
--          if (d == c) {
--              if (edit->undo_stack[spm1] > -1000000000) {
-+      wchar_t d_ch;
-+      if (edit->undo_stack[spm1].flags < 0) {
-+          d    = edit->undo_stack[(sp - 2) & edit->stack_size_mask].flags;
-+          d_ch = edit->undo_stack[(sp - 2) & edit->stack_size_mask].ch;
-+          if (d == c && d_ch == ch) {
-+              if (edit->undo_stack[spm1].flags > -1000000000) {
-                   if (c < KEY_PRESS)  /* --> no need to push multiple do-nothings */
--                      edit->undo_stack[spm1]--;
-+                      edit->undo_stack[spm1].flags--;
-                   return;
-               }
-           }
-@@ -735,19 +820,20 @@
- #ifndef NO_STACK_CURSMOVE_ANIHILATION
-           else if ((c == CURS_LEFT && d == CURS_RIGHT)
-                    || (c == CURS_RIGHT && d == CURS_LEFT)) {  /* a left then a right anihilate each other */
--              if (edit->undo_stack[spm1] == -2)
-+              if (edit->undo_stack[spm1].flags == -2)
-                   edit->stack_pointer = spm1;
-               else
--                  edit->undo_stack[spm1]++;
-+                  edit->undo_stack[spm1].flags++;
-               return;
-           }
- #endif
-       } else {
--          d = edit->undo_stack[spm1];
--          if (d == c) {
-+          d    = edit->undo_stack[spm1].flags;
-+          d_ch = edit->undo_stack[spm1].ch;
-+          if (d == c && d_ch == ch) {
-               if (c >= KEY_PRESS)
-                   return;     /* --> no need to push multiple do-nothings */
--              edit->undo_stack[sp] = -2;
-+              edit->undo_stack[sp].flags = -2;
-               goto check_bottom;
-           }
- #ifndef NO_STACK_CURSMOVE_ANIHILATION
-@@ -759,7 +845,9 @@
- #endif
-       }
-     }
--    edit->undo_stack[sp] = c;
-+    edit->undo_stack[sp].flags = c;
-+    edit->undo_stack[sp].ch = ch;
-+
-   check_bottom:
-     edit->stack_pointer = (edit->stack_pointer + 1) & edit->stack_size_mask;
-@@ -769,10 +857,10 @@
-     if (c == edit->stack_bottom || ((c + 1) & edit->stack_size_mask) == edit->stack_bottom)
-       do {
-           edit->stack_bottom = (edit->stack_bottom + 1) & edit->stack_size_mask;
--      } while (edit->undo_stack[edit->stack_bottom] < KEY_PRESS && edit->stack_bottom != edit->stack_pointer);
-+      } while (edit->undo_stack[edit->stack_bottom].flags < KEY_PRESS && edit->stack_bottom != edit->stack_pointer);
- /*If a single key produced enough pushes to wrap all the way round then we would notice that the [stack_bottom] does not contain KEY_PRESS. The stack is then initialised: */
--    if (edit->stack_pointer != edit->stack_bottom && edit->undo_stack[edit->stack_bottom] < KEY_PRESS)
-+    if (edit->stack_pointer != edit->stack_bottom && edit->undo_stack[edit->stack_bottom].flags < KEY_PRESS)
-       edit->stack_bottom = edit->stack_pointer = 0;
- }
-@@ -781,30 +869,33 @@
-    then the file should be as it was when he loaded up. Then set edit->modified to 0.
-  */
- static long
--pop_action (WEdit * edit)
-+pop_action (WEdit * edit, struct action *c)
- {
--    long c;
-     unsigned long sp = edit->stack_pointer;
-     if (sp == edit->stack_bottom) {
--      return STACK_BOTTOM;
-+      c->flags = STACK_BOTTOM;
-+      return c->flags;
-     }
-     sp = (sp - 1) & edit->stack_size_mask;
--    if ((c = edit->undo_stack[sp]) >= 0) {
-+
-+    *c = edit->undo_stack[sp];
-+    if (edit->undo_stack[sp].flags >= 0) {
- /*    edit->undo_stack[sp] = '@'; */
-       edit->stack_pointer = (edit->stack_pointer - 1) & edit->stack_size_mask;
--      return c;
-+      return c->flags;
-     }
-     if (sp == edit->stack_bottom) {
-       return STACK_BOTTOM;
-     }
--    c = edit->undo_stack[(sp - 1) & edit->stack_size_mask];
--    if (edit->undo_stack[sp] == -2) {
-+    *c = edit->undo_stack[(sp - 1) & edit->stack_size_mask];
-+    
-+    if (edit->undo_stack[sp].flags == -2) {
- /*      edit->undo_stack[sp] = '@'; */
-       edit->stack_pointer = sp;
-     } else
--      edit->undo_stack[sp]++;
-+      edit->undo_stack[sp].flags++;
--    return c;
-+    return c->flags;
- }
- /* is called whenever a modification is made by one of the four routines below */
-@@ -821,7 +912,7 @@
-  */
- void
--edit_insert (WEdit *edit, int c)
-+edit_insert (WEdit *edit, wchar_t c)
- {
-     /* check if file has grown to large */
-     if (edit->last_byte >= SIZE_LIMIT)
-@@ -855,12 +946,12 @@
-     /* add a new buffer if we've reached the end of the last one */
-     if (!(edit->curs1 & M_EDIT_BUF_SIZE))
-       edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] =
--          g_malloc (EDIT_BUF_SIZE);
-+          g_malloc (EDIT_BUF_SIZE * sizeof(wchar_t));
-     /* perform the insertion */
-     edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE][edit->
-                                                  curs1 & M_EDIT_BUF_SIZE]
--      = (unsigned char) c;
-+      = c;
-     /* update file length */
-     edit->last_byte++;
-@@ -871,7 +962,7 @@
- /* same as edit_insert and move left */
--void edit_insert_ahead (WEdit * edit, int c)
-+void edit_insert_ahead (WEdit * edit, wchar_t c)
- {
-     if (edit->last_byte >= SIZE_LIMIT)
-       return;
-@@ -894,7 +985,7 @@
-     edit->last_get_rule += (edit->last_get_rule >= edit->curs1);
-     if (!((edit->curs2 + 1) & M_EDIT_BUF_SIZE))
--      edit->buffers2[(edit->curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE);
-+      edit->buffers2[(edit->curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE * sizeof(wchar_t));
-     edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE - (edit->curs2 & M_EDIT_BUF_SIZE) - 1] = c;
-     edit->last_byte++;
-@@ -904,7 +995,7 @@
- int edit_delete (WEdit * edit)
- {
--    int p;
-+    wchar_t p;
-     if (!edit->curs2)
-       return 0;
-@@ -927,7 +1018,7 @@
-       edit->total_lines--;
-       edit->force |= REDRAW_AFTER_CURSOR;
-     }
--    edit_push_action (edit, p + 256);
-+    edit_push_action (edit, CHAR_INSERT_AHEAD, p);
-     if (edit->curs1 < edit->start_display) {
-       edit->start_display--;
-       if (p == '\n')
-@@ -942,7 +1033,7 @@
- static int
- edit_backspace (WEdit * edit)
- {
--    int p;
-+    wchar_t p;
-     if (!edit->curs1)
-       return 0;
-@@ -965,7 +1056,7 @@
-       edit->total_lines--;
-       edit->force |= REDRAW_AFTER_CURSOR;
-     }
--    edit_push_action (edit, p);
-+    edit_push_action (edit, CHAR_INSERT, p);
-     if (edit->curs1 < edit->start_display) {
-       edit->start_display--;
-@@ -979,10 +1070,14 @@
- #ifdef FAST_MOVE_CURSOR
--static void memqcpy (WEdit * edit, unsigned char *dest, unsigned char *src, int n)
-+static void memqcpy (WEdit * edit, wchar_t *dest, wchar_t *src, int n)
- {
-     unsigned long next;
--    while ((next = (unsigned long) memccpy (dest, src, '\n', n))) {
-+    while (n) {
-+      next = 0;
-+      while (next < n && src[next]!='\n') next++;
-+      if (next < n) next++;
-+        wmemcpy (dest, src, next)
-       edit->curs_line--;
-       next -= (unsigned long) dest;
-       n -= next;
-@@ -995,7 +1090,7 @@
- edit_move_backward_lots (WEdit *edit, long increment)
- {
-     int r, s, t;
--    unsigned char *p;
-+    wchar_t *p;
-     if (increment > edit->curs1)
-       increment = edit->curs1;
-@@ -1035,7 +1130,7 @@
-           edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE] = p;
-       else
-           edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE] =
--              g_malloc (EDIT_BUF_SIZE);
-+              g_malloc (EDIT_BUF_SIZE * sizeof(wchar_t));
-     } else {
-       if (p)
-           g_free (p);
-@@ -1074,7 +1169,7 @@
-               edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE] = p;
-           else
-               edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE] =
--                  g_malloc (EDIT_BUF_SIZE);
-+                  g_malloc (EDIT_BUF_SIZE * sizeof(wchar_t));
-       } else {
-           g_free (p);
-       }
-@@ -1106,7 +1201,7 @@
-           c = edit_get_byte (edit, edit->curs1 - 1);
-           if (!((edit->curs2 + 1) & M_EDIT_BUF_SIZE))
--              edit->buffers2[(edit->curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE);
-+              edit->buffers2[(edit->curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE * sizeof(wchar_t));
-           edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE - (edit->curs2 & M_EDIT_BUF_SIZE) - 1] = c;
-           edit->curs2++;
-           c = edit->buffers1[(edit->curs1 - 1) >> S_EDIT_BUF_SIZE][(edit->curs1 - 1) & M_EDIT_BUF_SIZE];
-@@ -1131,7 +1226,7 @@
-           c = edit_get_byte (edit, edit->curs1);
-           if (!(edit->curs1 & M_EDIT_BUF_SIZE))
--              edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE);
-+              edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE * sizeof(wchar_t));
-           edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE][edit->curs1 & M_EDIT_BUF_SIZE] = c;
-           edit->curs1++;
-           c = edit->buffers2[(edit->curs2 - 1) >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE - ((edit->curs2 - 1) & M_EDIT_BUF_SIZE) - 1];
-@@ -1389,7 +1484,7 @@
- is_blank (WEdit *edit, long offset)
- {
-     long s, f;
--    int c;
-+    wchar_t c;
-     s = edit_bol (edit, offset);
-     f = edit_eol (edit, offset) - 1;
-     while (s <= f) {
-@@ -1624,11 +1719,11 @@
-     selection_history[current_selection].text =
-       g_malloc (selection_history[current_selection].len + 1);
-     if (!selection_history[current_selection].text) {
--      selection_history[current_selection].text = g_malloc (1);
-+      selection_history[current_selection].text = g_malloc (sizeof(wchar_t));
-       *selection_history[current_selection].text = 0;
-       selection_history[current_selection].len = 0;
-     } else {
--      unsigned char *p = selection_history[current_selection].text;
-+      wchar_t *p = selection_history[current_selection].text;
-       for (; start_mark < end_mark; start_mark++)
-           *p++ = edit_get_byte (edit, start_mark);
-       *p = 0;
-@@ -1787,13 +1882,13 @@
- static void
- edit_do_undo (WEdit * edit)
- {
--    long ac;
-+    struct action ac;
-     long count = 0;
-     edit->stack_disable = 1;  /* don't record undo's onto undo stack! */
--    while ((ac = pop_action (edit)) < KEY_PRESS) {
--      switch ((int) ac) {
-+    while (pop_action (edit, &ac) < KEY_PRESS) {
-+      switch ((int) ac.flags) {
-       case STACK_BOTTOM:
-           goto done_undo;
-       case CURS_RIGHT:
-@@ -1814,31 +1909,33 @@
-       case COLUMN_OFF:
-           column_highlighting = 0;
-           break;
-+      case CHAR_INSERT:
-+          edit_insert (edit, ac.ch);
-+          break;
-+      case CHAR_INSERT_AHEAD:
-+          edit_insert_ahead (edit, ac.ch);
-+          break;
-       }
--      if (ac >= 256 && ac < 512)
--          edit_insert_ahead (edit, ac - 256);
--      if (ac >= 0 && ac < 256)
--          edit_insert (edit, ac);
--      if (ac >= MARK_1 - 2 && ac < MARK_2 - 2) {
--          edit->mark1 = ac - MARK_1;
-+      if (ac.flags >= MARK_1 - 2 && ac.flags < MARK_2 - 2) {
-+          edit->mark1 = ac.flags - MARK_1;
-           edit->column1 = edit_move_forward3 (edit, edit_bol (edit, edit->mark1), 0, edit->mark1);
--      } else if (ac >= MARK_2 - 2 && ac < KEY_PRESS) {
--          edit->mark2 = ac - MARK_2;
-+      } else if (ac.flags >= MARK_2 - 2 && ac.flags < KEY_PRESS) {
-+          edit->mark2 = ac.flags - MARK_2;
-           edit->column2 = edit_move_forward3 (edit, edit_bol (edit, edit->mark2), 0, edit->mark2);
-       }
-       if (count++)
-           edit->force |= REDRAW_PAGE;         /* more than one pop usually means something big */
-     }
--    if (edit->start_display > ac - KEY_PRESS) {
--      edit->start_line -= edit_count_lines (edit, ac - KEY_PRESS, edit->start_display);
-+    if (edit->start_display > ac.flags - KEY_PRESS) {
-+      edit->start_line -= edit_count_lines (edit, ac.flags - KEY_PRESS, edit->start_display);
-       edit->force |= REDRAW_PAGE;
--    } else if (edit->start_display < ac - KEY_PRESS) {
--      edit->start_line += edit_count_lines (edit, edit->start_display, ac - KEY_PRESS);
-+    } else if (edit->start_display < ac.flags - KEY_PRESS) {
-+      edit->start_line += edit_count_lines (edit, edit->start_display, ac.flags - KEY_PRESS);
-       edit->force |= REDRAW_PAGE;
-     }
--    edit->start_display = ac - KEY_PRESS;     /* see push and pop above */
-+    edit->start_display = ac.flags - KEY_PRESS;       /* see push and pop above */
-     edit_update_curs_row (edit);
-   done_undo:;
-@@ -2114,7 +2211,7 @@
- /* one of command or char_for_insertion must be passed as -1 */
- /* commands are executed, and char_for_insertion is inserted at the cursor */
- /* returns 0 if the command is a macro that was not found, 1 otherwise */
--int edit_execute_key_command (WEdit * edit, int command, int char_for_insertion)
-+int edit_execute_key_command (WEdit * edit, int command, wchar_t char_for_insertion)
- {
-     int r;
-     if (command == CK_Begin_Record_Macro) {
-@@ -2153,7 +2250,7 @@
-    Returns 0 if the command is a macro that was not found, 1
-    otherwise.
-  */
--int edit_execute_cmd (WEdit * edit, int command, int char_for_insertion)
-+int edit_execute_cmd (WEdit * edit, int command, wchar_t char_for_insertion)
- {
-     int result = 1;
-     edit->force |= REDRAW_LINE;
-@@ -2669,7 +2766,7 @@
- /* either command or char_for_insertion must be passed as -1 */
- /* returns 0 if command is a macro that was not found, 1 otherwise */
--int edit_execute_command (WEdit * edit, int command, int char_for_insertion)
-+int edit_execute_command (WEdit * edit, int command, wchar_t char_for_insertion)
- {
-     int r;
-     r = edit_execute_cmd (edit, command, char_for_insertion);
---- edit/edit.h
-+++ edit/edit.h
-@@ -22,6 +22,7 @@
- #ifndef __EDIT_H
- #define __EDIT_H
-+#define _ISOC99_SOURCE 
- #include <stdio.h>
- #include <stdarg.h>
-@@ -37,8 +38,14 @@
- #include <stdlib.h>
-+#include <wchar.h>
-+#include <wctype.h>
-+
- #include "src/global.h"
-+/* unicode private use area */
-+#define BINARY_CHAR_OFFSET 0xFFE00
-+
- #    define WIDGET_COMMAND (WIDGET_USER + 10)
- #    define N_menus 5
-@@ -89,6 +96,8 @@
- /*some codes that may be pushed onto or returned from the undo stack: */
-+#define CHAR_INSERT 65
-+#define CHAR_INSERT_AHEAD 66
- #define CURS_LEFT 601
- #define CURS_RIGHT 602
- #define DELCHAR 603
-@@ -108,11 +117,11 @@
- struct macro {
-     short command;
--    short ch;
-+    wchar_t ch;
- };
- struct selection {
--   unsigned char * text;
-+   wchar_t * text;
-    int len;
- };
-@@ -128,12 +137,13 @@
- int edit_raw_key_query (char *heading, char *query, int cancel);
- char *strcasechr (const unsigned char *s, int c);
- int edit (const char *_file, int line);
--int edit_translate_key (WEdit *edit, long x_key, int *cmd, int *ch);
-+int edit_translate_key (WEdit *edit, long x_key, int *cmd, wchar_t *ch);
--#ifndef NO_INLINE_GETBYTE
--int edit_get_byte (WEdit * edit, long byte_index);
-+//ifndef NO_INLINE_GETBYTE
-+#if 1
-+wchar_t edit_get_byte (WEdit * edit, long byte_index);
- #else
--static inline int edit_get_byte (WEdit * edit, long byte_index)
-+static inline wchar_t edit_get_byte (WEdit * edit, long byte_index)
- {
-     unsigned long p;
-     if (byte_index >= (edit->curs1 + edit->curs2) || byte_index < 0)
-@@ -173,11 +183,11 @@
- void edit_delete_line (WEdit * edit);
- int edit_delete (WEdit * edit);
--void edit_insert (WEdit * edit, int c);
-+void edit_insert (WEdit * edit, wchar_t c);
- int edit_cursor_move (WEdit * edit, long increment);
- void edit_push_action (WEdit * edit, long c, ...);
- void edit_push_key_press (WEdit * edit);
--void edit_insert_ahead (WEdit * edit, int c);
-+void edit_insert_ahead (WEdit * edit, wchar_t c);
- int edit_save_file (WEdit * edit, const char *filename);
- long edit_write_stream (WEdit * edit, FILE * f);
- char *edit_get_write_filter (const char *writename, const char *filename);
-@@ -210,16 +220,17 @@
- void edit_goto_cmd (WEdit * edit);
- int eval_marks (WEdit * edit, long *start_mark, long *end_mark);
- void edit_status (WEdit * edit);
--int edit_execute_command (WEdit * edit, int command, int char_for_insertion);
--int edit_execute_key_command (WEdit * edit, int command, int char_for_insertion);
-+int edit_execute_command (WEdit * edit, int command, wchar_t char_for_insertion);
-+int edit_execute_key_command (WEdit * edit, int command, wchar_t char_for_insertion);
- void edit_update_screen (WEdit * edit);
- int edit_printf (WEdit * e, const char *fmt, ...)
-     __attribute__ ((format (printf, 2, 3)));
- int edit_print_string (WEdit * e, const char *s);
-+int edit_print_wstring (WEdit * e, wchar_t *s);
- void edit_move_to_line (WEdit * e, long line);
- void edit_move_display (WEdit * e, long line);
- void edit_word_wrap (WEdit * edit);
--unsigned char *edit_get_block (WEdit * edit, long start, long finish, int *l);
-+wchar_t *edit_get_block (WEdit * edit, long start, long finish, int *l);
- int edit_sort_cmd (WEdit * edit);
- void edit_help_cmd (WEdit * edit);
- void edit_left_word_move (WEdit * edit, int s);
-@@ -261,7 +272,7 @@
- void format_paragraph (WEdit *edit, int force);
- /* either command or char_for_insertion must be passed as -1 */
--int edit_execute_cmd (WEdit * edit, int command, int char_for_insertion);
-+int edit_execute_cmd (WEdit * edit, int command, wchar_t char_for_insertion);
- #define get_sys_error(s) (s)
---- edit/editcmd.c
-+++ edit/editcmd.c
-@@ -22,7 +22,6 @@
- */
- /* #define PIPE_BLOCKS_SO_READ_BYTE_BY_BYTE */
--
- #include <config.h>
- #include <ctype.h>
-@@ -95,12 +94,13 @@
- }
- #endif /* !HAVE_MEMMOVE */
--/* #define itoa MY_itoa  <---- this line is now in edit.h */
--static char *
-+/* #define itoa 
-+MY_itoa  <---- this line is now in edit.h */
-+static wchar_t *
- MY_itoa (int i)
- {
--    static char t[14];
--    char *s = t + 13;
-+    static wchar_t t[14];
-+    wchar_t *s = t + 13;
-     int j = i;
-     *s-- = 0;
-     do {
-@@ -184,6 +184,46 @@
-     doupdate();
- }
-+
-+
-+static size_t 
-+wchar_write(int fd, wchar_t *buf, size_t len)
-+{
-+    char *tmpbuf = g_malloc(len + MB_LEN_MAX);
-+    mbstate_t mbs;
-+    size_t i;
-+    size_t outlen = 0;
-+    size_t res;
-+    
-+    for (i = 0; i < len; i++) {
-+      if (outlen >= len) {
-+          if ((res = mc_write(fd, tmpbuf, outlen)) != outlen) {
-+              g_free(tmpbuf);
-+              return -1;
-+          }
-+          outlen = 0;
-+      }
-+      memset (&mbs, 0, sizeof (mbs));
-+#ifdef __STDC_ISO_10646__ 
-+      if (buf[i] >= BINARY_CHAR_OFFSET && buf[i] < (BINARY_CHAR_OFFSET + 256)) {
-+          res = 1;
-+          tmpbuf[outlen] = (char) (buf[i] - BINARY_CHAR_OFFSET);
-+
-+      } else
-+#endif
-+      res = wcrtomb(tmpbuf + outlen, buf[i], &mbs);
-+      if (res > 0) {
-+          outlen += res;
-+      }
-+    }
-+    if ((res = mc_write(fd, tmpbuf, outlen)) != outlen) {
-+      g_free(tmpbuf);
-+      return -1;
-+    }
-+    g_free(tmpbuf);
-+    return len;
-+}
-+
- /* "Oleg Yu. Repin" <repin@ssd.sscc.ru> added backup filenames
-     ...thanks -paul */
-@@ -286,32 +326,32 @@
-       buf = 0;
-       filelen = edit->last_byte;
-       while (buf <= (edit->curs1 >> S_EDIT_BUF_SIZE) - 1) {
--          if (mc_write (fd, (char *) edit->buffers1[buf], EDIT_BUF_SIZE)
-+          if (wchar_write (fd, edit->buffers1[buf], EDIT_BUF_SIZE)
-               != EDIT_BUF_SIZE) {
-               mc_close (fd);
-               goto error_save;
-           }
-           buf++;
-       }
--      if (mc_write
--          (fd, (char *) edit->buffers1[buf],
-+      if (wchar_write
-+          (fd, edit->buffers1[buf],
-            edit->curs1 & M_EDIT_BUF_SIZE) !=
-           (edit->curs1 & M_EDIT_BUF_SIZE)) {
-           filelen = -1;
-       } else if (edit->curs2) {
-           edit->curs2--;
-           buf = (edit->curs2 >> S_EDIT_BUF_SIZE);
--          if (mc_write
-+          if (wchar_write
-               (fd,
--               (char *) edit->buffers2[buf] + EDIT_BUF_SIZE -
-+               edit->buffers2[buf] + EDIT_BUF_SIZE -
-                (edit->curs2 & M_EDIT_BUF_SIZE) - 1,
-                1 + (edit->curs2 & M_EDIT_BUF_SIZE)) !=
-               1 + (edit->curs2 & M_EDIT_BUF_SIZE)) {
-               filelen = -1;
-           } else {
-               while (--buf >= 0) {
--                  if (mc_write
--                      (fd, (char *) edit->buffers2[buf],
-+                  if (wchar_write
-+                      (fd, edit->buffers2[buf],
-                        EDIT_BUF_SIZE) != EDIT_BUF_SIZE) {
-                       filelen = -1;
-                       break;
-@@ -597,13 +637,13 @@
-       if (!n || n == EOF)
-           break;
-       n = 0;
--      while (fscanf (f, "%hd %hd, ", &macro[n].command, &macro[n].ch))
-+      while (fscanf (f, "%hd %lu, ", &macro[n].command, &macro[n].ch))
-           n++;
-       fscanf (f, ";\n");
-       if (s != k) {
-           fprintf (g, ("key '%d 0': "), s);
-           for (i = 0; i < n; i++)
--              fprintf (g, "%hd %hd, ", macro[i].command, macro[i].ch);
-+              fprintf (g, "%hd %lu, ", macro[i].command, macro[i].ch);
-           fprintf (g, ";\n");
-       }
-     }
-@@ -639,7 +679,7 @@
-       if (f) {
-           fprintf (f, ("key '%d 0': "), s);
-           for (i = 0; i < n; i++)
--              fprintf (f, "%hd %hd, ", macro[i].command, macro[i].ch);
-+              fprintf (f, "%hd %lu, ", macro[i].command, macro[i].ch);
-           fprintf (f, ";\n");
-           fclose (f);
-           if (saved_macros_loaded) {
-@@ -688,10 +728,10 @@
-               saved_macro[i++] = s;
-           if (!found) {
-               *n = 0;
--              while (*n < MAX_MACRO_LENGTH && 2 == fscanf (f, "%hd %hd, ", &macro[*n].command, &macro[*n].ch))
-+              while (*n < MAX_MACRO_LENGTH && 2 == fscanf (f, "%hd %lu, ", &macro[*n].command, &macro[*n].ch))
-                   (*n)++;
-           } else {
--              while (2 == fscanf (f, "%hd %hd, ", &dummy.command, &dummy.ch));
-+              while (2 == fscanf (f, "%hd %lu, ", &dummy.command, &dummy.ch));
-           }
-           fscanf (f, ";\n");
-           if (s == k)
-@@ -819,7 +859,7 @@
- #define space_width 1
- static void
--edit_insert_column_of_text (WEdit * edit, unsigned char *data, int size, int width)
-+edit_insert_column_of_text (WEdit * edit, wchar_t *data, int size, int width)
- {
-     long cursor;
-     int i, col;
-@@ -867,7 +907,7 @@
- {
-     long start_mark, end_mark, current = edit->curs1;
-     int size, x;
--    unsigned char *copy_buf;
-+    wchar_t *copy_buf;
-     edit_update_curs_col (edit);
-     x = edit->curs_col;
-@@ -912,7 +952,7 @@
- {
-     long count;
-     long current;
--    unsigned char *copy_buf;
-+    wchar_t *copy_buf;
-     long start_mark, end_mark;
-     int deleted = 0;
-     int x = 0;
-@@ -973,7 +1013,7 @@
-       edit_push_action (edit, COLUMN_ON);
-       column_highlighting = 0;
-     } else {
--      copy_buf = g_malloc (end_mark - start_mark);
-+      copy_buf = g_malloc ((end_mark - start_mark) * sizeof(wchar_t));
-       edit_cursor_move (edit, start_mark - edit->curs1);
-       edit_scroll_screen_over_cursor (edit);
-       count = start_mark;
-@@ -1303,7 +1343,7 @@
- /* This function is a modification of mc-3.2.10/src/view.c:regexp_view_search() */
- /* returns -3 on error in pattern, -1 on not found, found_len = 0 if either */
- static int
--string_regexp_search (char *pattern, char *string, int len, int match_type,
-+string_regexp_search (char *pattern, wchar_t *wstring, int len, int match_type,
-                     int match_bol, int icase, int *found_len, void *d)
- {
-     static regex_t r;
-@@ -1311,7 +1351,10 @@
-     static int old_type, old_icase;
-     regmatch_t *pmatch;
-     static regmatch_t s[1];
--
-+    char *string;
-+    int i;
-+    
-+    
-     pmatch = (regmatch_t *) d;
-     if (!pmatch)
-       pmatch = s;
-@@ -1331,13 +1374,43 @@
-       old_type = match_type;
-       old_icase = icase;
-     }
-+    
-+    string = wchar_to_mbstr(wstring);
-+    if (string == NULL)
-+      return -1;
-+    
-     if (regexec
-       (&r, string, d ? NUM_REPL_ARGS : 1, pmatch,
-        ((match_bol
-          || match_type != match_normal) ? 0 : REG_NOTBOL)) != 0) {
-       *found_len = 0;
-+      g_free(string);
-       return -1;
-     }
-+    
-+    for (i = 0; i < (d ? NUM_REPL_ARGS : 1); i++) {
-+      char tmp;
-+      int new_o;
-+      
-+      if (pmatch[i].rm_so < 0)
-+          continue;
-+      tmp = string[pmatch[i].rm_so];
-+      string[pmatch[i].rm_so] = 0;
-+      new_o = mbstrlen(string);
-+      string[pmatch[i].rm_so] = tmp;
-+      pmatch[i].rm_so = new_o; 
-+
-+      if (pmatch[i].rm_eo < 0)
-+          continue;
-+      tmp = string[pmatch[i].rm_eo];
-+      string[pmatch[i].rm_eo] = 0;
-+      new_o = mbstrlen(string);
-+      string[pmatch[i].rm_eo] = tmp;
-+      pmatch[i].rm_eo = new_o; 
-+    }
-+    
-+    g_free(string);
-+    
-     *found_len = pmatch[0].rm_eo - pmatch[0].rm_so;
-     return (pmatch[0].rm_so);
- }
-@@ -1346,11 +1419,14 @@
-    (and the above) routines to work properly - paul */
- static long
--edit_find_string (long start, unsigned char *exp, int *len, long last_byte, int (*get_byte) (void *, long), void *data, int once_only, void *d)
-+edit_find_string (long start, unsigned char *exp_mb, int *len, long last_byte, int (*get_byte) (void *, long), void *data, int once_only, void *d)
- {
-     long p, q = 0;
--    long l = strlen ((char *) exp), f = 0;
-+    long f = 0;
-     int n = 0;
-+    wchar_t *exp = mbstr_to_wchar(exp_mb);
-+    wchar_t *exp_backup = exp;
-+    long l = wcslen(exp);
-     for (p = 0; p < l; p++)   /* count conversions... */
-       if (exp[p] == '%')
-@@ -1358,18 +1434,20 @@
-               n++;
-     if (replace_scanf || replace_regexp) {
--      int c;
--      unsigned char *buf;
--      unsigned char mbuf[MAX_REPL_LEN * 2 + 3];
-+      wchar_t c;
-+      wchar_t *buf;
-+      wchar_t mbuf[MAX_REPL_LEN * 2 + 3];
-       replace_scanf = (!replace_regexp);      /* can't have both */
-       buf = mbuf;
-       if (replace_scanf) {
--          unsigned char e[MAX_REPL_LEN];
--          if (n >= NUM_REPL_ARGS)
-+          wchar_t e[MAX_REPL_LEN];
-+          if (n >= NUM_REPL_ARGS) {
-+              g_free(exp_backup);
-               return -3;
-+          }
-           if (replace_case) {
-               for (p = start; p < last_byte && p < start + MAX_REPL_LEN; p++)
-@@ -1384,20 +1462,23 @@
-           }
-           buf[(q = p - start)] = 0;
--          strcpy ((char *) e, (char *) exp);
--          strcat ((char *) e, "%n");
-+          wcscpy (e, exp);
-+          wcscat (e, L"%n");
-           exp = e;
-           while (q) {
-               *((int *) sargs[n]) = 0;        /* --> here was the problem - now fixed: good */
--              if (n == sscanf ((char *) buf, (char *) exp, SCANF_ARGS)) {
-+              if (n == swscanf (buf, exp, SCANF_ARGS)) {
-                   if (*((int *) sargs[n])) {
-                       *len = *((int *) sargs[n]);
-+                      g_free(exp_backup);
-                       return start;
-                   }
-               }
--              if (once_only)
-+              if (once_only) {
-                   return -2;
-+                  g_free(exp_backup);
-+              }
-               if (q + start < last_byte) {
-                   if (replace_case) {
-                       buf[q] = (*get_byte) (data, q + start);
-@@ -1411,7 +1492,7 @@
-               start++;
-               buf++;          /* move the window along */
-               if (buf == mbuf + MAX_REPL_LEN) {       /* the window is about to go past the end of array, so... */
--                  memmove (mbuf, buf, strlen ((char *) buf) + 1);     /* reset it */
-+                  wmemmove (mbuf, buf, (wcslen (buf) + 1));   /* reset it */
-                   buf = mbuf;
-               }
-               q--;
-@@ -1437,10 +1518,11 @@
-               buf = mbuf;
-               while (q) {
--                  found_start = string_regexp_search ((char *) exp, (char *) buf, q, match_normal, match_bol, !replace_case, len, d);
-+                  found_start = string_regexp_search ((char *) exp_mb, buf, q, match_normal, match_bol, !replace_case, len, d);
-                   if (found_start <= -2) {    /* regcomp/regexec error */
-                       *len = 0;
-+                      g_free(exp_backup);
-                       return -3;
-                   }
-                   else if (found_start == -1) /* not found: try next line */
-@@ -1451,15 +1533,19 @@
-                       match_bol = 0;
-                       continue;
-                   }
--                  else        /* found */
-+                  else {      /* found */
-+                      g_free(exp_backup);
-                       return (start + offset - q + found_start);
-+                  }
-               }
--              if (once_only)
-+              if (once_only) {
-+                  g_free(exp_backup);
-                   return -2;
-+              }
-               if (buf[q - 1] != '\n') { /* incomplete line: try to recover */
-                   buf = mbuf + MAX_REPL_LEN / 2;
--                  q = strlen ((char *) buf);
-+                  q = wcslen (buf);
-                   memmove (mbuf, buf, q);
-                   p = start + q;
-                   move_win = 1;
-@@ -1469,36 +1555,45 @@
-           }
-       }
-     } else {
--      *len = strlen ((char *) exp);
-+      *len = wcslen (exp);
-       if (replace_case) {
-           for (p = start; p <= last_byte - l; p++) {
--              if ((*get_byte) (data, p) == (unsigned char)exp[0]) {   /* check if first char matches */
-+              if ((*get_byte) (data, p) == exp[0]) {  /* check if first char matches */
-                   for (f = 0, q = 0; q < l && f < 1; q++)
--                      if ((*get_byte) (data, q + p) != (unsigned char)exp[q])
-+                      if ((*get_byte) (data, q + p) != exp[q])
-                           f = 1;
--                  if (f == 0)
-+                  if (f == 0) {
-+                      g_free(exp_backup);
-                       return p;
-+                  }
-               }
--              if (once_only)
-+              if (once_only) {
-+                  g_free(exp_backup);
-                   return -2;
-+              }
-           }
-       } else {
-           for (p = 0; exp[p] != 0; p++)
-               exp[p] = my_lower_case (exp[p]);
-           for (p = start; p <= last_byte - l; p++) {
--              if (my_lower_case ((*get_byte) (data, p)) == (unsigned char)exp[0]) {
-+              if (my_lower_case ((*get_byte) (data, p)) == exp[0]) {
-                   for (f = 0, q = 0; q < l && f < 1; q++)
--                      if (my_lower_case ((*get_byte) (data, q + p)) != (unsigned char)exp[q])
-+                      if (my_lower_case ((*get_byte) (data, q + p)) != exp[q])
-                           f = 1;
--                  if (f == 0)
-+                  if (f == 0) {
-+                      g_free(exp_backup);
-                       return p;
-+                  }
-               }
--              if (once_only)
-+              if (once_only) {
-+                  g_free(exp_backup);
-                   return -2;
-+              }
-           }
-       }
-     }
-+    g_free(exp_backup);
-     return -2;
- }
-@@ -1512,9 +1607,8 @@
-     while ((p = edit_find_string (p, exp, len, last_byte, get_byte, data, once_only, d)) >= 0) {
-       if (replace_whole) {
--/*If the bordering chars are not in option_whole_chars_search then word is whole */
--          if (!strcasechr (option_whole_chars_search, (*get_byte) (data, p - 1))
--              && !strcasechr (option_whole_chars_search, (*get_byte) (data, p + *len)))
-+          if (!iswalnum((*get_byte) (data, p - 1))
-+              && !iswalnum((*get_byte) (data, p + *len)))
-               return p;
-           if (once_only)
-               return -2;
-@@ -1546,34 +1640,35 @@
- #define is_digit(x) ((x) >= '0' && (x) <= '9')
--#define snprintf(v) { \
-+#define my_swprintf(v) { \
-               *p1++ = *p++; \
-               *p1++ = '%'; \
-               *p1++ = 'n'; \
-               *p1 = '\0'; \
--              sprintf(s,q1,v,&n); \
-+              swprintf(s, MAX_REPL_LEN - (s - str), q1,v,&n); \
-               s += n; \
-           }
- /* this function uses the sprintf command to do a vprintf */
- /* it takes pointers to arguments instead of the arguments themselves */
--static int sprintf_p (char *str, const char *fmt,...)
--    __attribute__ ((format (printf, 2, 3)));
-+//static int sprintf_p (wchar_t *str, const wchar_t *fmt,...)
-+//    __attribute__ ((format (printf, 2, 3)));
--static int sprintf_p (char *str, const char *fmt,...)
-+static int sprintf_p (wchar_t *str, const wchar_t *fmt,...)
- {
-     va_list ap;
-     int n;
--    char *q, *p, *s = str;
--    char q1[32];
--    char *p1;
-+    const wchar_t *q, *p;
-+    wchar_t *s = str;
-+    wchar_t q1[32];
-+    wchar_t *p1;
-     va_start (ap, fmt);
--    p = q = (char *) fmt;
-+    p = q = fmt;
--    while ((p = strchr (p, '%'))) {
-+    while ((p = wcschr (p, '%'))) {
-       n = p - q;
--      strncpy (s, q, n);      /* copy stuff between format specifiers */
-+      wcsncpy (s, q, n);      /* copy stuff between format specifiers */
-       s += n;
-       *s = 0;
-       q = p;
-@@ -1601,50 +1696,51 @@
-           *p1++ = *p++;
-       if (*p == '*') {
-           p++;
--          strcpy (p1, MY_itoa (*va_arg (ap, int *))); /* replace field width with a number */
--          p1 += strlen (p1);
-+          wcscpy (p1, MY_itoa (*va_arg (ap, int *))); /* replace field width with a number */
-+          p1 += wcslen (p1);
-       } else {
--          while (is_digit (*p))
-+          while (iswdigit (*p))
-               *p1++ = *p++;
-       }
-       if (*p == '.')
-           *p1++ = *p++;
-       if (*p == '*') {
-           p++;
--          strcpy (p1, MY_itoa (*va_arg (ap, int *))); /* replace precision with a number */
--          p1 += strlen (p1);
-+          wcscpy (p1, MY_itoa (*va_arg (ap, int *))); /* replace precision with a number */
-+          p1 += wcslen (p1);
-       } else {
--          while (is_digit (*p))
-+          while (iswdigit (*p))
-               *p1++ = *p++;
-       }
- /* flags done, now get argument */
-       if (*p == 's') {
--          snprintf (va_arg (ap, char *));
-+          *p1++ = 'l';
-+          my_swprintf (va_arg (ap, wchar_t *));
-       } else if (*p == 'h') {
-           if (strchr ("diouxX", *p))
--              snprintf (*va_arg (ap, short *));
-+              my_swprintf (*va_arg (ap, short *));
-       } else if (*p == 'l') {
-           *p1++ = *p++;
-           if (strchr ("diouxX", *p))
--              snprintf (*va_arg (ap, long *));
-+              my_swprintf (*va_arg (ap, long *));
-       } else if (strchr ("cdiouxX", *p)) {
--          snprintf (*va_arg (ap, int *));
-+          my_swprintf (*va_arg (ap, int *));
-       } else if (*p == 'L') {
-           *p1++ = *p++;
-           if (strchr ("EefgG", *p))
--              snprintf (*va_arg (ap, double *));      /* should be long double */
-+              my_swprintf (*va_arg (ap, double *));   /* should be long double */
-       } else if (strchr ("EefgG", *p)) {
--          snprintf (*va_arg (ap, double *));
-+          my_swprintf (*va_arg (ap, double *));
-       } else if (strchr ("DOU", *p)) {
--          snprintf (*va_arg (ap, long *));
-+          my_swprintf (*va_arg (ap, long *));
-       } else if (*p == 'p') {
--          snprintf (*va_arg (ap, void **));
-+          my_swprintf (*va_arg (ap, void **));
-       }
-       q = p;
-     }
-     va_end (ap);
--    sprintf (s, q);           /* print trailing leftover */
--    return s - str + strlen (s);
-+    swprintf (s, MAX_REPL_LEN - (s - str), q);                /* print trailing leftover */
-+    return s - str + wcslen (s);
- }
- static void regexp_error (WEdit *edit)
-@@ -1819,8 +1915,9 @@
-               }
-           }
-           if (replace_yes) {  /* delete then insert new */
-+              wchar_t *wexp2 = mbstr_to_wchar(exp2);
-               if (replace_scanf || replace_regexp) {
--                  char repl_str[MAX_REPL_LEN + 2];
-+                  wchar_t repl_str[MAX_REPL_LEN + 2];
-                   /* we need to fill in sargs just like with scanf */
-                   if (replace_regexp) {
-@@ -1828,12 +1925,12 @@
-                       for (k = 1;
-                            k < NUM_REPL_ARGS && pmatch[k].rm_eo >= 0;
-                            k++) {
--                          unsigned char *t;
--                          t = (unsigned char *) &sargs[k - 1][0];
-+                          wchar_t *t;
-+                          t = &sargs[k - 1][0];
-                           for (j = 0;
-                                j < pmatch[k].rm_eo - pmatch[k].rm_so
-                                && j < 255; j++, t++)
--                              *t = (unsigned char) edit_get_byte (edit,
-+                              *t = edit_get_byte (edit,
-                                                                   edit->
-                                                                   search_start
-                                                                   -
-@@ -1849,7 +1946,7 @@
-                       for (; k <= NUM_REPL_ARGS; k++)
-                           sargs[k - 1][0] = 0;
-                   }
--                  if (sprintf_p (repl_str, exp2, PRINTF_ARGS) >= 0) {
-+                  if (sprintf_p (repl_str, wexp2, PRINTF_ARGS) >= 0) {
-                       times_replaced++;
-                       while (i--)
-                           edit_delete (edit);
-@@ -1865,10 +1962,11 @@
-                   times_replaced++;
-                   while (i--)
-                       edit_delete (edit);
--                  while (exp2[++i])
--                      edit_insert (edit, exp2[i]);
-+                  while (wexp2[++i])
-+                      edit_insert (edit, wexp2[i]);
-               }
-               edit->found_len = i;
-+              g_free(wexp2);
-           }
-           /* so that we don't find the same string again */
-           if (replace_backwards) {
-@@ -2039,16 +2137,17 @@
- #define TEMP_BUF_LEN 1024
- /* Return a null terminated length of text. Result must be g_free'd */
--unsigned char *
-+wchar_t *
- edit_get_block (WEdit *edit, long start, long finish, int *l)
- {
--    unsigned char *s, *r;
--    r = s = g_malloc (finish - start + 1);
-+    wchar_t *s, *r;
-+    r = s = g_malloc ((finish - start + 1) * sizeof(wchar_t));
-     if (column_highlighting) {
-       *l = 0;
-       /* copy from buffer, excluding chars that are out of the column 'margins' */
-       while (start < finish) {
--          int c, x;
-+          wchar_t c;
-+          int x;
-           x = edit_move_forward3 (edit, edit_bol (edit, start), 0,
-                                   start);
-           c = edit_get_byte (edit, start);
-@@ -2081,11 +2180,11 @@
-       return 0;
-     if (column_highlighting) {
--      unsigned char *block, *p;
-+      wchar_t *block, *p;
-       int r;
-       p = block = edit_get_block (edit, start, finish, &len);
-       while (len) {
--          r = mc_write (file, p, len);
-+          r = wchar_write (file, p, len);
-           if (r < 0)
-               break;
-           p += r;
-@@ -2093,15 +2192,15 @@
-       }
-       g_free (block);
-     } else {
--      unsigned char *buf;
-+      wchar_t *buf;
-       int i = start, end;
-       len = finish - start;
--      buf = g_malloc (TEMP_BUF_LEN);
-+      buf = g_malloc (TEMP_BUF_LEN * sizeof(wchar_t));
-       while (start != finish) {
-           end = min (finish, start + TEMP_BUF_LEN);
-           for (; i < end; i++)
-               buf[i - start] = edit_get_byte (edit, i);
--          len -= mc_write (file, (char *) buf, end - start);
-+          len -= wchar_write (file, buf, end - start);
-           start = end;
-       }
-       g_free (buf);
-@@ -2407,16 +2506,25 @@
- /* prints at the cursor */
- /* returns the number of chars printed */
--int edit_print_string (WEdit * e, const char *s)
-+int edit_print_wstring (WEdit * e, wchar_t *s)
- {
-     int i = 0;
-     while (s[i])
--      edit_execute_cmd (e, -1, (unsigned char) s[i++]);
-+      edit_execute_cmd (e, -1, s[i++]);
-     e->force |= REDRAW_COMPLETELY;
-     edit_update_screen (e);
-     return i;
- }
-+int edit_print_string (WEdit * e, const char *s)
-+{
-+    int i;
-+    wchar_t *ws = mbstr_to_wchar(s);
-+    i = edit_print_wstring (e, ws);
-+    g_free(ws);
-+    return i;
-+}
-+
- int edit_printf (WEdit * e, const char *fmt, ...)
- {
-     int i;
-@@ -2527,15 +2635,16 @@
- /* find first character of current word */
- static int edit_find_word_start (WEdit *edit, long *word_start, int *word_len)
- {
--    int i, c, last;
-+    int i;
-+    wchar_t c, last;
-     
- /* return if at begin of file */
-     if (edit->curs1 <= 0)
-       return 0;
--    c = (unsigned char) edit_get_byte (edit, edit->curs1 - 1);
-+    c = edit_get_byte (edit, edit->curs1 - 1);
- /* return if not at end or in word */
--    if (isspace (c) || !(isalnum (c) || c == '_'))
-+    if (iswspace (c) || !(iswalnum (c) || c == '_'))
-       return 0; 
- /* search start of word to be completed */
-@@ -2545,11 +2654,11 @@
-           return 0;
-           
-       last = c;
--      c = (unsigned char) edit_get_byte (edit, edit->curs1 - i);
-+      c = edit_get_byte (edit, edit->curs1 - i);
--      if (!(isalnum (c) || c == '_')) {
-+      if (!(iswalnum (c) || c == '_')) {
- /* return if word starts with digit */
--          if (isdigit (last))
-+          if (iswdigit (last))
-               return 0;
-           *word_start = edit->curs1 - (i - 1); /* start found */
-@@ -2582,7 +2691,7 @@
-                         int *num)
- {
-     int len, max_len = 0, i, skip;
--    char *bufpos;
-+    wchar_t *bufpos;
-     /* collect max MAX_WORD_COMPLETIONS completions */
-     while (*num < MAX_WORD_COMPLETIONS) {
-@@ -2603,7 +2712,7 @@
-           buffers1[start >> S_EDIT_BUF_SIZE][start & M_EDIT_BUF_SIZE];
-       skip = 0;
-       for (i = 0; i < *num; i++) {
--          if (strncmp
-+          if (wcsncmp
-               (&compl[i].text[word_len], &bufpos[word_len],
-                max (len, compl[i].len) - word_len) == 0) {
-               skip = 1;
-@@ -2613,7 +2722,7 @@
-       if (skip)
-           continue;
--      compl[*num].text = g_malloc (len + 1);
-+      compl[*num].text = g_malloc ((len + 1) * sizeof(wchar_t));
-       compl[*num].len = len;
-       for (i = 0; i < len; i++)
-           compl[*num].text[i] = *(bufpos + i);
-@@ -2646,6 +2755,7 @@
-     WListbox *compl_list;
-     unsigned int compl_dlg_h; /* completion dialog height */
-     unsigned int compl_dlg_w; /* completion dialog width */
-+    char *mbtext;
-     /* calculate the dialog metrics */
-     compl_dlg_h = num_compl + 2;
-@@ -2682,8 +2792,11 @@
-     add_widget (compl_dlg, compl_list);
-     /* fill the listbox with the completions */
--    for (i = 0; i < num_compl; i++)
--      listbox_add_item (compl_list, 0, 0, compl[i].text, NULL);
-+    for (i = 0; i < num_compl; i++) {
-+      mbtext = wchar_to_mbstr(compl[i].text);
-+      listbox_add_item (compl_list, 0, 0, mbtext, NULL);
-+      g_free(mbtext);
-+    }
-     /* pop up the dialog */
-     run_dlg (compl_dlg);
-@@ -2710,8 +2823,9 @@
- {
-     int word_len = 0, i, num_compl = 0, max_len;
-     long word_start = 0;
--    char *bufpos;
--    char match_expr[MAX_REPL_LEN];
-+    wchar_t *bufpos;
-+    wchar_t match_expr[MAX_REPL_LEN];
-+    char *mbmatch_expr;
-     struct selection compl[MAX_WORD_COMPLETIONS];     /* completions */
-     /* don't want to disturb another search */
-@@ -2728,18 +2842,20 @@
-     /* prepare match expression */
-     bufpos = &edit->buffers1[word_start >> S_EDIT_BUF_SIZE]
-       [word_start & M_EDIT_BUF_SIZE];
--    strncpy (match_expr, bufpos, word_len);
-+    wcsncpy (match_expr, bufpos, word_len);
-     match_expr[word_len] = '\0';
--    strcat (match_expr, "[a-zA-Z_0-9]+");
-+    wcscat (match_expr, L"[a-zA-Z_0-9]+");
-     /* init search: backward, regexp, whole word, case sensitive */
-     edit_set_search_parameters (0, 1, 1, 1, 1);
-     /* collect the possible completions              */
-     /* start search from curs1 down to begin of file */
-+    mbmatch_expr = wchar_to_mbstr(match_expr);
-     max_len =
--      edit_collect_completions (edit, word_start, word_len, match_expr,
-+      edit_collect_completions (edit, word_start, word_len, mbmatch_expr,
-                                 (struct selection *) &compl, &num_compl);
-+    g_free(mbmatch_expr);
-     if (num_compl > 0) {
-       /* insert completed word if there is only one match */
---- edit/editdraw.c
-+++ edit/editdraw.c
-@@ -48,7 +48,7 @@
- static void status_string (WEdit * edit, char *s, int w, int fill)
- {
--    char byte_str[16];
-+    char byte_str[32];
-     /*
-      * If we are at the end of file, print <EOF>,
-@@ -56,9 +56,9 @@
-      * as decimal and as hex.
-      */
-     if (edit->curs1 < edit->last_byte) {
--      unsigned char cur_byte = edit_get_byte (edit, edit->curs1);
--      g_snprintf (byte_str, sizeof(byte_str), "%c %3d 0x%02X",
--                  is_printable(cur_byte) ? cur_byte : '.',
-+      wchar_t cur_byte = edit_get_byte (edit, edit->curs1);
-+      g_snprintf (byte_str, sizeof(byte_str), "%lc %3d 0x%02X",
-+                  iswprint(cur_byte) ? cur_byte : '.',
-                   cur_byte,
-                   cur_byte);
-     } else {
-@@ -175,12 +175,17 @@
- #define lowlevel_set_color(x) attrset(MY_COLOR_PAIR(color))
- #endif
-+struct line_s {
-+    wchar_t ch;
-+    unsigned int style;
-+};
-+
- static void
- print_to_widget (WEdit *edit, long row, int start_col, int start_col_real,
--               long end_col, unsigned int line[])
-+               long end_col, struct line_s line[])
- {
--    unsigned int *p;
--
-+    struct line_s *p;
-+    
-     int x = start_col_real + EDIT_TEXT_HORIZONTAL_OFFSET;
-     int x1 = start_col + EDIT_TEXT_HORIZONTAL_OFFSET;
-     int y = row + EDIT_TEXT_VERTICAL_OFFSET;
-@@ -192,10 +197,10 @@
-     edit_move (x + FONT_OFFSET_X, y + FONT_OFFSET_Y);
-     p = line;
--    while (*p) {
--      int style = *p & 0xFF00;
--      int textchar = *p & 0xFF;
--      int color = *p >> 16;
-+    while (p->ch) {
-+      int style = p->style & 0xFF00;
-+      wchar_t textchar = p->ch;
-+      int color = p->style >> 16;
-       if (style & MOD_ABNORMAL) {
-           /* Non-printable - use black background */
-@@ -209,8 +214,7 @@
-       } else {
-           lowlevel_set_color (color);
-       }
--
--      addch (textchar);
-+      SLsmg_write_char(textchar);
-       p++;
-     }
- }
-@@ -220,11 +224,11 @@
- edit_draw_this_line (WEdit *edit, long b, long row, long start_col,
-                    long end_col)
- {
--    static unsigned int line[MAX_LINE_LEN];
--    unsigned int *p = line;
-+    struct line_s line[MAX_LINE_LEN];
-+    struct line_s *p = line;
-     long m1 = 0, m2 = 0, q, c1, c2;
-     int col, start_col_real;
--    unsigned int c;
-+    wchar_t c;
-     int color;
-     int i, book_mark = -1;
-@@ -246,66 +250,86 @@
-       if (row <= edit->total_lines - edit->start_line) {
-           while (col <= end_col - edit->start_col) {
--              *p = 0;
-+              p->ch = 0;
-+              p->style = 0;
-               if (q == edit->curs1)
--                  *p |= MOD_CURSOR;
-+                  p->style |= MOD_CURSOR;
-               if (q >= m1 && q < m2) {
-                   if (column_highlighting) {
-                       int x;
-                       x = edit_move_forward3 (edit, b, 0, q);
-                       if (x >= c1 && x < c2)
--                          *p |= MOD_MARKED;
-+                          p->style |= MOD_MARKED;
-                   } else
--                      *p |= MOD_MARKED;
-+                      p->style |= MOD_MARKED;
-               }
-               if (q == edit->bracket)
--                  *p |= MOD_BOLD;
-+                  p->style |= MOD_BOLD;
-               if (q >= edit->found_start
-                   && q < edit->found_start + edit->found_len)
--                  *p |= MOD_BOLD;
-+                  p->style |= MOD_BOLD;
-               c = edit_get_byte (edit, q);
- /* we don't use bg for mc - fg contains both */
-               if (book_mark == -1) {
-                   edit_get_syntax_color (edit, q, &color);
--                  *p |= color << 16;
-+                  p->style |= color << 16;
-               } else {
--                  *p |= book_mark << 16;
-+                  p->style |= book_mark << 16;
-               }
-               q++;
-               switch (c) {
-               case '\n':
-                   col = end_col - edit->start_col + 1;        /* quit */
--                  *(p++) |= ' ';
-+                  p->ch = ' ';
-+                  p++;
-                   break;
-               case '\t':
-                   i = TAB_SIZE - ((int) col % TAB_SIZE);
--                  *p |= ' ';
--                  c = *(p++) & ~MOD_CURSOR;
-+                  p->ch = ' ';
-+                  c = p->style & ~MOD_CURSOR;
-+                  p++;
-                   col += i;
--                  while (--i)
--                      *(p++) = c;
-+                  while (--i) {
-+                      p->ch = ' '; p->style = c;
-+                      p++;
-+                  }
-                   break;
-               default:
-                   c = convert_to_display_c (c);
-                   /* Caret notation for control characters */
-                   if (c < 32) {
--                      *(p++) = '^' | MOD_ABNORMAL;
--                      *(p++) = (c + 0x40) | MOD_ABNORMAL;
-+                      p->ch = '^';
-+                      p->style = MOD_ABNORMAL;
-+                      p++;
-+                      p->ch = c + 0x40;
-+                      p->style = MOD_ABNORMAL;
-                       col += 2;
-+                      p++;
-                       break;
-                   }
-                   if (c == 127) {
--                      *(p++) = '^' | MOD_ABNORMAL;
--                      *(p++) = '?' | MOD_ABNORMAL;
-+                      p->ch = '^';
-+                      p->style = MOD_ABNORMAL;
-+                      p++;
-+                      p->ch = '?';
-+                      p->style = MOD_ABNORMAL;
-+                      p++;
-                       col += 2;
-                       break;
-                   }
--                  if (is_printable (c)) {
--                      *(p++) |= c;
-+                  if (iswprint (c)
-+#ifdef __STDC_ISO_10646__ 
-+                      && (c < BINARY_CHAR_OFFSET || c >= (BINARY_CHAR_OFFSET + 256))
-+#endif
-+                      ) {
-+                      p->ch = c;
-+                      p++;
-                   } else {
--                      *(p++) = '.' | MOD_ABNORMAL;
-+                      p->ch = '.';
-+                      p->style = MOD_ABNORMAL;
-+                      p++;
-                   }
-                   col++;
-                   break;
-@@ -315,7 +339,7 @@
-     } else {
-       start_col_real = start_col = 0;
-     }
--    *p = 0;
-+    p->ch = 0;
-     print_to_widget (edit, row, start_col, start_col_real, end_col, line);
- }
---- edit/editkeys.c
-+++ edit/editkeys.c
-@@ -200,13 +200,13 @@
-  * 'command' is one of the editor commands from editcmddef.h.
-  */
- int
--edit_translate_key (WEdit *edit, long x_key, int *cmd, int *ch)
-+edit_translate_key (WEdit *edit, long x_key, int *cmd, wchar_t *ch)
- {
-     int command = -1;
--    int char_for_insertion = -1;
-+    wchar_t char_for_insertion = -1;
-     int i = 0;
-     static const long *key_map;
--
-+    
-     switch (edit_key_emulation) {
-     case EDIT_KEY_EMULATION_NORMAL:
-       key_map = cooledit_key_map;
-@@ -279,10 +279,26 @@
-     /* an ordinary insertable character */
-     if (x_key < 256) {
--      int c = convert_from_input_c (x_key);
-+      int c = convert_from_input_c(x_key);
-+      mbstate_t mbs;
-+      int res;
-+      wchar_t wc;
-+    
-+      memset (&mbs, 0, sizeof (mbs));
-+
-+      if (edit->charpoint >= MB_CUR_MAX) edit->charpoint = 0;
-+
-+      edit->charbuf[edit->charpoint++] = c;
-+
-+      res = mbrtowc(&wc, edit->charbuf, edit->charpoint, &mbs);
-+      if (res < 0) {
-+          if (res != -2) edit->charpoint = 0; /* broken multibyte char, skip */
-+          return 0;
-+        }
-+      edit->charpoint = 0;
--      if (is_printable (c)) {
--          char_for_insertion = c;
-+      if (iswprint (wc)) {
-+          char_for_insertion = wc;
-           goto fin;
-       }
-     }
---- edit/wordproc.c
-+++ edit/wordproc.c
-@@ -19,12 +19,13 @@
-  */
- #include <config.h>
-+#include <wchar.h>
- #include "edit.h"
- #include "edit-widget.h"
- #define tab_width option_tab_spacing
--#define NO_FORMAT_CHARS_START "-+*\\,.;:&>"
-+#define NO_FORMAT_CHARS_START L"-+*\\,.;:&>"
- #define FONT_MEAN_WIDTH 1
- static long
-@@ -41,14 +42,14 @@
-       p = edit_move_forward (edit, p, line - l, 0);
-     p = edit_bol (edit, p);
--    while (strchr ("\t ", edit_get_byte (edit, p)))
-+    while (wcschr (L"\t ", edit_get_byte (edit, p)))
-       p++;
-     return p;
- }
- static int bad_line_start (WEdit * edit, long p)
- {
--    int c;
-+    wchar_t c;
-     c = edit_get_byte (edit, p);
-     if (c == '.') {           /* `...' is acceptable */
-       if (edit_get_byte (edit, p + 1) == '.')
-@@ -62,7 +63,7 @@
-               return 0;       /* `---' is acceptable */
-       return 1;
-     }
--    if (strchr (NO_FORMAT_CHARS_START, c))
-+    if (wcschr (NO_FORMAT_CHARS_START, c))
-       return 1;
-     return 0;
- }
-@@ -115,33 +116,33 @@
-                                       i - edit->curs_line, 0));
- }
--static unsigned char *
-+static wchar_t *
- get_paragraph (WEdit *edit, long p, long q, int indent, int *size)
- {
--    unsigned char *s, *t;
-+    wchar_t *s, *t;
- #if 0
--    t = g_malloc ((q - p) + 2 * (q - p) / option_word_wrap_line_length +
--                10);
-+    t = g_malloc (((q - p) + 2 * (q - p) / option_word_wrap_line_length +
-+                10) * sizeof(wchar_t));
- #else
--    t = g_malloc (2 * (q - p) + 100);
-+    t = g_malloc ((2 * (q - p) + 100) * sizeof(wchar_t));
- #endif
-     if (!t)
-       return 0;
-     for (s = t; p < q; p++, s++) {
-       if (indent)
-           if (edit_get_byte (edit, p - 1) == '\n')
--              while (strchr ("\t ", edit_get_byte (edit, p)))
-+              while (wcschr (L"\t ", edit_get_byte (edit, p)))
-                   p++;
-       *s = edit_get_byte (edit, p);
-     }
--    *size = (unsigned long) s - (unsigned long) t;
-+    *size = s - t;
-     t[*size] = '\n';
-     return t;
- }
--static void strip_newlines (unsigned char *t, int size)
-+static void strip_newlines (wchar_t *t, int size)
- {
--    unsigned char *p = t;
-+    wchar_t *p = t;
-     while (size--) {
-       *p = *p == '\n' ? ' ' : *p;
-       p++;
-@@ -158,7 +159,7 @@
- {
-     return x += tab_width - x % tab_width;
- }
--static int line_pixel_length (unsigned char *t, long b, int l)
-+static int line_pixel_length (wchar_t *t, long b, int l)
- {
-     int x = 0, c, xn = 0;
-     for (;;) {
-@@ -182,7 +183,7 @@
- }
- /* find the start of a word */
--static int next_word_start (unsigned char *t, int q, int size)
-+static int next_word_start (wchar_t *t, int q, int size)
- {
-     int i;
-     for (i = q;; i++) {
-@@ -203,13 +204,13 @@
- }
- /* find the start of a word */
--static int word_start (unsigned char *t, int q, int size)
-+static int word_start (wchar_t *t, int q, int size)
- {
-     int i = q;
-     if (t[q] == ' ' || t[q] == '\t')
-       return next_word_start (t, q, size);
-     for (;;) {
--      int c;
-+      wchar_t c;
-       if (!i)
-           return -1;
-       c = t[i - 1];
-@@ -222,7 +223,7 @@
- }
- /* replaces ' ' with '\n' to properly format a paragraph */
--static void format_this (unsigned char *t, int size, int indent)
-+static void format_this (wchar_t *t, int size, int indent)
- {
-     int q = 0, ww;
-     strip_newlines (t, size);
-@@ -250,7 +251,7 @@
-     }
- }
--static void replace_at (WEdit * edit, long q, int c)
-+static void replace_at (WEdit * edit, long q, wchar_t c)
- {
-     edit_cursor_move (edit, q - edit->curs1);
-     edit_delete (edit);
-@@ -258,18 +259,19 @@
- }
- /* replaces a block of text */
--static void put_paragraph (WEdit * edit, unsigned char *t, long p, long q, int indent, int size)
-+static void put_paragraph (WEdit * edit, wchar_t *t, long p, long q, int indent, int size)
- {
-     long cursor;
--    int i, c = 0;
-+    int i;
-+    wchar_t c = 0;
-     cursor = edit->curs1;
-     if (indent)
--      while (strchr ("\t ", edit_get_byte (edit, p)))
-+      while (wcschr (L"\t ", edit_get_byte (edit, p)))
-           p++;
-     for (i = 0; i < size; i++, p++) {
-       if (i && indent) {
-           if (t[i - 1] == '\n' && c == '\n') {
--              while (strchr ("\t ", edit_get_byte (edit, p)))
-+              while (wcschr (L"\t ", edit_get_byte (edit, p)))
-                   p++;
-           } else if (t[i - 1] == '\n') {
-               long curs;
-@@ -281,7 +283,7 @@
-               p = edit->curs1;
-           } else if (c == '\n') {
-               edit_cursor_move (edit, p - edit->curs1);
--              while (strchr ("\t ", edit_get_byte (edit, p))) {
-+              while (wcschr (L"\t ", edit_get_byte (edit, p))) {
-                   edit_delete (edit);
-                   if (cursor > edit->curs1)
-                       cursor--;
-@@ -314,7 +316,7 @@
- {
-     long p, q;
-     int size;
--    unsigned char *t;
-+    wchar_t *t;
-     int indent = 0;
-     if (option_word_wrap_line_length < 2)
-       return;
-@@ -324,17 +326,17 @@
-     q = end_paragraph (edit, force);
-     indent = test_indent (edit, p, q);
-     t = get_paragraph (edit, p, q, indent, &size);
--    if (!t)
-+    if (!t) 
-       return;
-     if (!force) {
-       int i;
--      if (strchr (NO_FORMAT_CHARS_START, *t)) {
-+      if (wcschr (NO_FORMAT_CHARS_START, *t)) {
-           g_free (t);
-           return;
-       }
-       for (i = 0; i < size - 1; i++) {
-           if (t[i] == '\n') {
--              if (strchr (NO_FORMAT_CHARS_START "\t ", t[i + 1])) {
-+              if (wcschr (NO_FORMAT_CHARS_START "\t", t[i + 1])) {
-                   g_free (t);
-                   return;
-               }
---- src/util.c
-+++ src/util.c
-@@ -96,6 +96,42 @@
-       return strlen (str);
- }
-+wchar_t *
-+mbstr_to_wchar (const char *str)
-+{
-+    int len = mbstrlen(str);
-+    wchar_t *buf = g_malloc((len+1) * sizeof(wchar_t));
-+    mbstate_t mbs;
-+    memset (&mbs, 0, sizeof (mbs));
-+    mbsrtowcs (buf, &str, len, &mbs);
-+    buf[len] = 0;
-+    return buf;
-+}
-+
-+char *
-+wchar_to_mbstr (const wchar_t *wstr)
-+{
-+    mbstate_t mbs;
-+    const wchar_t *wstr2;
-+    char * string;
-+    int len;
-+
-+    memset (&mbs, 0, sizeof (mbs));
-+    wstr2 = wstr;
-+    len = wcsrtombs(NULL, &wstr2, 0, &mbs);
-+    if (len <= 0) 
-+      return NULL;
-+      
-+    string = g_malloc(len + 1);
-+    
-+    wstr2 = wstr;
-+    wcsrtombs(string, &wstr2, len, &mbs);
-+    string[len] = 0;
-+    return string;
-+}
-+
-+
-+
- int
- is_printable (int c)
- {
---- src/util.h
-+++ src/util.h
-@@ -48,6 +48,8 @@
- char *get_owner (int);
- int mbstrlen (const char *);
-+wchar_t *mbstr_to_wchar (const char *);
-+char *wchar_to_mbstr (const wchar_t *);
- #define MAX_I18NTIMELENGTH 14
- #define MIN_I18NTIMELENGTH 10
---- src/view.c
-+++ src/view.c
-@@ -876,7 +876,7 @@
-       widget_erase ((Widget *) view);
- }
--#define view_add_character(view,c) addch (c)
-+#define view_add_character(view,c) SLsmg_write_char(c)
- #define view_add_one_vline()       one_vline()
- #define view_add_string(view,s)    addstr (s)
- #define view_gotoyx(v,r,c)    widget_move (v,r,c)
-@@ -1089,6 +1089,11 @@
-       if (view->growing_buffer && from == view->last_byte)
-           get_byte (view, from);
-       for (; row < height && from < view->last_byte; from++) {
-+          mbstate_t mbs;
-+          char mbbuf[MB_LEN_MAX];
-+          int mblen;
-+          wchar_t wc;
-+          
-           c = get_byte (view, from);
-           if ((c == '\n') || (col >= width && view->wrap_mode)) {
-               col = frame_shift;
-@@ -1102,7 +1107,36 @@
-               col = ((col - frame_shift) / 8) * 8 + 8 + frame_shift;
-               continue;
-           }
--          if (view->viewer_nroff_flag && c == '\b') {
-+          
-+          
-+          mblen = 1;
-+          mbbuf[0] = c;
-+          
-+          while (mblen < MB_LEN_MAX) {
-+              int res;
-+              memset (&mbs, 0, sizeof (mbs));
-+              res = mbrtowc(&wc, mbbuf, mblen, &mbs);
-+              if (res <= 0 && res != -2) {
-+                  wc = '.';
-+                  mblen = 1;
-+                  break;
-+              }
-+              if (res == mblen)
-+                  break;
-+              
-+              mbbuf[mblen] = get_byte (view, from + mblen);
-+              mblen++;
-+          }
-+          
-+          if (mblen == MB_LEN_MAX) {
-+                  wc = '.';
-+                  mblen = 1;
-+          }
-+          
-+          from += mblen - 1;
-+          
-+          
-+          if (view->viewer_nroff_flag && wc == '\b') {
-               int c_prev;
-               int c_next;
-@@ -1139,12 +1173,12 @@
-               && col < width - view->start_col) {
-               view_gotoyx (view, row, col + view->start_col);
--              c = convert_to_display_c (c);
-+              wc = convert_to_display_c (wc);
--              if (!is_printable (c))
--                  c = '.';
-+              if (!iswprint (wc))
-+                  wc = '.';
--              view_add_character (view, c);
-+              view_add_character (view, wc);
-           }
-           col++;
-           if (boldflag != MARK_NORMAL) {
---- src/widget.c
-+++ src/widget.c
-@@ -31,6 +31,7 @@
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <ctype.h>
-+#include <wctype.h>
- #include "global.h"
- #include "tty.h"
- #include "color.h"
-@@ -43,6 +44,7 @@
- #include "profile.h"  /* for history loading and saving */
- #include "wtools.h"           /* For common_dialog_repaint() */
-+
- static int button_event (Gpm_Event *event, WButton *b);
- int quote = 0;
-@@ -763,13 +765,37 @@
- /* Pointer to killed data */
- static char *kill_buffer = 0;
-+static int
-+charpos(WInput *in, int idx)
-+{
-+    int i, pos, l;
-+    mbstate_t mbs;
-+    memset (&mbs, 0, sizeof (mbs));
-+    i = 0;
-+    pos = 0;
-+    
-+    while (in->buffer[pos]) {
-+      if (i == idx)
-+          return pos;
-+      l = mbrlen(in->buffer + pos, strlen(in->buffer + pos), &mbs);
-+      if (l <= 0)
-+          return pos;
-+      pos+=l;
-+      i++;
-+    };
-+    return pos;
-+}
-+
- void
- update_input (WInput *in, int clear_first)
- {
-     int has_history = 0;
-     int    i, j;
--    unsigned char   c;
-+    wchar_t c;
-     int    buf_len = mbstrlen (in->buffer);
-+    mbstate_t mbs;
-+    memset (&mbs, 0, sizeof (mbs));
-+    
-     if (should_show_history_button (in))
-       has_history = HISTORY_BUTTON_WIDTH;
-@@ -799,12 +825,16 @@
-       addch (' ');
-     widget_move (&in->widget, 0, 0);
-     
--    for (i = 0, j = in->first_shown; i < in->field_len - has_history && in->buffer [j]; i++){
--      c = in->buffer [j++];
--      c = is_printable (c) ? c : '.';
-+    for (i = 0, j = in->first_shown; (i < in->field_len - has_history) && (j < buf_len); i++,j++){
-+      char * chp = in->buffer + charpos(in,j);
-+      size_t res = mbrtowc(&c, chp, strlen(chp), &mbs);
-+      c = (res && iswprint (c)) ? 0 : '.';
-       if (in->is_password)
-           c = '*';
--      addch (c);
-+      if (c)
-+          addch (c); 
-+      else
-+          SLsmg_write_nchars (chp, res);
-     }
-     widget_move (&in->widget, 0, in->point - in->first_shown);
-@@ -1136,39 +1166,74 @@
-     in->need_push = 1;
-     in->buffer [0] = 0;
-     in->point = 0;
-+    in->charpoint = 0;
-     in->mark = 0;
-     free_completions (in);
-     update_input (in, 0);
- }
-+static void
-+move_buffer_backward (WInput *in, int point)
-+{
-+    int i, pos, len;
-+    int str_len = mbstrlen (in->buffer);
-+    if (point >= str_len) return;
-+    
-+    pos = charpos(in,point);
-+    len = charpos(in,point + 1) - pos;
-+      
-+    for (i = pos; in->buffer [i + len - 1]; i++)
-+      in->buffer [i] = in->buffer [i + len];
-+}
-+
- static int
- insert_char (WInput *in, int c_code)
- {
-     int i;
-+    mbstate_t mbs;
-+    int res;
-+    
-+    memset (&mbs, 0, sizeof (mbs));
-     if (c_code == -1)
-       return 0;
-     
-+    if (in->charpoint >= MB_CUR_MAX) return 1;
-+
-+    in->charbuf[in->charpoint++] = c_code;
-+
-+    res = mbrlen(in->charbuf, in->charpoint, &mbs);
-+    if (res < 0) {
-+      if (res != -2) in->charpoint = 0; /* broken multibyte char, skip */
-+        return 1;
-+    }
-+
-     in->need_push = 1;
--    if (strlen (in->buffer)+1 == in->current_max_len){
-+    if (strlen (in->buffer) + in->charpoint >= in->current_max_len){
-       /* Expand the buffer */
--      char *narea = g_malloc (in->current_max_len + in->field_len);
-+      char *narea = g_malloc (in->current_max_len + in->field_len + in->charpoint);
-       if (narea){
-           char *p = in->buffer;
--
-+          
-           strcpy (narea, in->buffer);
-+          
-           in->buffer = narea;
--          in->current_max_len += in->field_len;
-+          in->current_max_len += in->field_len + in->charpoint;
-           g_free (p);
-       }
-     }
--    if (strlen (in->buffer)+1 < in->current_max_len){
--      int l = strlen (&in->buffer [in->point]);
--      for (i = l+1; i > 0; i--)
--          in->buffer [in->point+i] = in->buffer [in->point+i-1];
--      in->buffer [in->point] = c_code;
-+    if (strlen (in->buffer) + in->charpoint < in->current_max_len){
-+        int ins_point = charpos(in,in->point); /* bytes from begin */
-+      /* move chars */
-+      int rest_bytes = strlen (in->buffer + ins_point);
-+
-+      for (i = rest_bytes; i >= 0; i--) 
-+          in->buffer [ins_point+i+in->charpoint] = in->buffer [ins_point+i];
-+      
-+      memcpy(in->buffer + ins_point, in->charbuf, in->charpoint); 
-       in->point++;
-     }
-+    in->charpoint = 0;
-     return 1;
- }
-@@ -1176,12 +1241,14 @@
- beginning_of_line (WInput *in)
- {
-     in->point = 0;
-+    in->charpoint = 0;
- }
- static void
- end_of_line (WInput *in)
- {
--    in->point = strlen (in->buffer);
-+    in->point = mbstrlen (in->buffer);
-+    in->charpoint = 0;
- }
- static void
-@@ -1189,37 +1256,76 @@
- {
-     if (in->point)
-       in->point--;
-+    in->charpoint = 0;
- }
- static void
- forward_char (WInput *in)
- {
--    if (in->buffer [in->point])
-+    if (in->buffer [charpos(in,in->point)])
-       in->point++;
-+    in->charpoint = 0;
- }
- static void
- forward_word (WInput *in)
- {
--    unsigned char *p = in->buffer+in->point;
-+    mbstate_t mbs;
-+    int len = mbstrlen (in->buffer);
--    while (*p && (isspace (*p) || ispunct (*p)))
--      p++;
--    while (*p && isalnum (*p))
--      p++;
--    in->point = p - in->buffer;
-+    memset (&mbs, 0, sizeof (mbs));
-+
-+    while (in->point < len) {
-+      wchar_t c;
-+      char *p = in->buffer + charpos(in,in->point);
-+      size_t res = mbrtowc(&c, p, strlen(p), &mbs);
-+      if (res <= 0 || !(iswspace (c) || iswpunct (c)))
-+          break;
-+      in->point++;
-+    }
-+
-+    memset (&mbs, 0, sizeof (mbs));
-+
-+    while (in->point < len) {
-+      wchar_t c;
-+      char *p = in->buffer + charpos(in,in->point);
-+      size_t res = mbrtowc(&c, p, strlen(p), &mbs);
-+      if (res <= 0 || !iswalnum (c))
-+          break;
-+      in->point++;
-+    }
-+
-+    in->charpoint = 0;
- }
- static void
- backward_word (WInput *in)
- {
--    unsigned char *p = in->buffer+in->point;
-+    mbstate_t mbs;
-+
-+    memset (&mbs, 0, sizeof (mbs));
--    while (p-1 > in->buffer-1 && (isspace (*(p-1)) || ispunct (*(p-1))))
--      p--;
--    while (p-1 > in->buffer-1 && isalnum (*(p-1)))
--      p--;
--    in->point = p - in->buffer;
-+    while (in->point > 0) {
-+      wchar_t c;
-+      char *p = in->buffer + charpos(in,in->point);
-+      size_t res = mbrtowc(&c, p, strlen(p), &mbs);
-+      if (*p && (res <= 0 || !(iswspace (c) || iswpunct (c))))
-+          break;
-+      in->point--;
-+    }
-+
-+    memset (&mbs, 0, sizeof (mbs));
-+
-+    while (in->point > 0) {
-+      wchar_t c;
-+      char *p = in->buffer + charpos(in,in->point);
-+      size_t res = mbrtowc(&c, p, strlen(p), &mbs);
-+      if (*p && (res <= 0 || !iswalnum (c)))
-+          break;
-+      in->point--;
-+    }
-+
-+    in->charpoint = 0;
- }
- static void
-@@ -1248,24 +1354,20 @@
- static void
- backward_delete (WInput *in)
- {
--    int i;
--    
-     if (!in->point)
-       return;
--    for (i = in->point; in->buffer [i-1]; i++)
--      in->buffer [i-1] = in->buffer [i];
-+    move_buffer_backward(in, in->point - 1);    
-     in->need_push = 1;
-     in->point--;
-+    in->charpoint = 0;
- }
- static void
- delete_char (WInput *in)
- {
--    int i;
--
--    for (i = in->point; in->buffer [i]; i++)
--      in->buffer [i] = in->buffer [i+1];
-+    move_buffer_backward(in, in->point);    
-     in->need_push = 1;
-+    in->charpoint = 0;
- }
- static void
-@@ -1280,6 +1382,9 @@
-     if (kill_buffer)
-       g_free (kill_buffer);
-     
-+    first=charpos(in,first);
-+    last=charpos(in,last);
-+    
-     kill_buffer = g_malloc (last-first + 1);
-     strncpy (kill_buffer, in->buffer+first, last-first);
-     kill_buffer [last-first] = 0;
-@@ -1293,8 +1398,9 @@
-    in->point = first;
-    in->mark  = first;
--   strcpy (&in->buffer [first], &in->buffer [last]);
-+   strcpy (&in->buffer [charpos(in,first)], &in->buffer [charpos(in,last)]);
-    in->need_push = 1;
-+   in->charpoint = 0;
- }
- static void
-@@ -1310,6 +1416,7 @@
-     copy_region (in, old_point, new_point);
-     delete_region (in, old_point, new_point);
-     in->need_push = 1;
-+    in->charpoint = 0;
- }
- static void
-@@ -1325,6 +1432,7 @@
-     copy_region (in, old_point, new_point);
-     delete_region (in, old_point, new_point);
-     in->need_push = 1;
-+    in->charpoint = 0;
- }
- static void
-@@ -1353,17 +1461,21 @@
-     
-     if (!kill_buffer)
-         return;
-+    in->charpoint = 0;
-     for (p = kill_buffer; *p; p++)
-       insert_char (in, *p);
-+    in->charpoint = 0;
- }
- static void
- kill_line (WInput *in)
- {
-+    int chp = charpos(in,in->point);
-     if (kill_buffer)
-       g_free (kill_buffer);
--    kill_buffer = g_strdup (&in->buffer [in->point]);
--    in->buffer [in->point] = 0;
-+    kill_buffer = g_strdup (&in->buffer [chp]);
-+    in->buffer [chp] = 0;
-+    in->charpoint = 0;
- }
- void
-@@ -1373,9 +1485,10 @@
-     g_free (in->buffer);
-     in->buffer = g_strdup (text);     /* was in->buffer->text */
-     in->current_max_len = strlen (in->buffer) + 1;
--    in->point = strlen (in->buffer);
-+    in->point = mbstrlen (in->buffer);
-     in->mark = 0;
-     in->need_push = 1;
-+    in->charpoint = 0;
- }
- static void
-@@ -1497,6 +1610,7 @@
-     *in->buffer = 0;
-     in->point = 0;
-     in->first = 0;
-+    in->charpoint = 0;
- }
- int
-@@ -1525,7 +1639,7 @@
-       }
-     }
-     if (!input_map [i].fn){
--      if (c_code > 255 || !is_printable (c_code))
-+      if (c_code > 255)
-           return 0;
-       if (in->first){
-           port_region_marked_for_delete (in);
-@@ -1559,6 +1673,7 @@
-     if (pos != in->point)
-       free_completions (in);
-     in->point = pos;
-+    in->charpoint = 0;
-     update_input (in, 1);
- }
-@@ -1621,7 +1736,7 @@
-           && should_show_history_button (in)) {
-           do_show_hist (in);
-       } else {
--          in->point = strlen (in->buffer);
-+          in->point = mbstrlen (in->buffer);
-           if (event->x - in->first_shown - 1 < in->point)
-               in->point = event->x - in->first_shown - 1;
-           if (in->point < 0)
-@@ -1669,6 +1784,7 @@
-       INPUT_COMPLETE_VARIABLES | INPUT_COMPLETE_USERNAMES;
-     in->current_max_len = initial_buffer_len;
-     in->buffer = g_malloc (initial_buffer_len);
-+    
-     in->color = color;
-     in->field_len = len;
-     in->first = 1;
-@@ -1679,7 +1795,9 @@
-     in->is_password = 0;
-     strcpy (in->buffer, def_text);
--    in->point = strlen (in->buffer);
-+
-+    in->point = mbstrlen (in->buffer);
-+    in->charpoint = 0;
-     return in;
- }
---- src/widget.h
-+++ src/widget.h
-@@ -64,16 +64,18 @@
- typedef struct {
-     Widget widget;
--    int  point;                       /* cursor position in the input line */
--    int  mark;                        /* The mark position */
--    int  first_shown;         /* Index of the first shown character */
--    int  current_max_len;     /* Maximum length of input line */
--    int  field_len;           /* Length of the editing field */
-+    int  point;                       /* cursor position in the input line (mb chars)*/
-+    int  mark;                        /* The mark position (mb chars)*/
-+    int  first_shown;         /* Index of the first shown character (mb chars)*/
-+    int  current_max_len;     /* Maximum length of input line (bytes)*/
-+    int  field_len;           /* Length of the editing field (mb chars)*/
-     int  color;                       /* color used */
-     int  first;                       /* Is first keystroke? */
-     int  disable_update;      /* Do we want to skip updates? */
-     int  is_password;         /* Is this a password input line? */
-     unsigned char *buffer;    /* pointer to editing buffer */
-+    unsigned char charbuf[MB_LEN_MAX];
-+    int charpoint;
-     Hist *history;            /* The history */
-     int  need_push;           /* need to push the current Input on hist? */
-     char **completions;               /* Possible completions array */
diff --git a/mc-4.6.0-utf8.patch b/mc-4.6.0-utf8.patch
deleted file mode 100644 (file)
index 6d4dabc..0000000
+++ /dev/null
@@ -1,1718 +0,0 @@
-diff -urN mc-4.6.1-pre1.org/src/achown.c mc-4.6.1-pre1/src/achown.c
---- mc-4.6.1-pre1.org/src/achown.c     2004-07-04 16:14:01.694445512 +0200
-+++ mc-4.6.1-pre1/src/achown.c 2004-07-04 16:14:29.460224472 +0200
-@@ -95,13 +95,16 @@
- static void get_ownership (void)
- {                             /* set buttons  - ownership */
-     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);
- }
-@@ -562,6 +565,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);
-diff -urN mc-4.6.1-pre1.org/src/boxes.c mc-4.6.1-pre1/src/boxes.c
---- mc-4.6.1-pre1.org/src/boxes.c      2004-07-04 16:14:01.725440800 +0200
-+++ mc-4.6.1-pre1/src/boxes.c  2004-07-04 16:16:47.203284344 +0200
-@@ -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;
-@@ -596,7 +596,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;
-     }
-diff -urN mc-4.6.1-pre1.org/src/filegui.c mc-4.6.1-pre1/src/filegui.c
---- mc-4.6.1-pre1.org/src/filegui.c    2004-07-04 16:14:01.663450224 +0200
-+++ mc-4.6.1-pre1/src/filegui.c        2004-07-04 16:14:29.487220368 +0200
-@@ -559,8 +559,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]);
-@@ -571,7 +571,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 */
-@@ -589,12 +589,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 */
-@@ -613,7 +613,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);
-@@ -800,36 +800,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);
-diff -urN mc-4.6.1-pre1.org/src/find.c mc-4.6.1-pre1/src/find.c
---- mc-4.6.1-pre1.org/src/find.c       2004-07-04 16:14:01.702444296 +0200
-+++ mc-4.6.1-pre1/src/find.c   2004-07-04 16:14:29.498218696 +0200
-@@ -193,7 +193,7 @@
-       int l1, maxlen = 0;
-       while (i--) {
--          l1 = strlen (labs[i] = _(labs[i]));
-+          l1 = mbstrlen (labs[i] = _(labs[i]));
-           if (l1 > maxlen)
-               maxlen = l1;
-       }
-@@ -202,7 +202,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)
-@@ -211,8 +211,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);
-@@ -748,7 +748,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;
-     }
-diff -urN mc-4.6.1-pre1.org/src/hotlist.c mc-4.6.1-pre1/src/hotlist.c
---- mc-4.6.1-pre1.org/src/hotlist.c    2004-07-04 16:14:01.781432288 +0200
-+++ mc-4.6.1-pre1/src/hotlist.c        2004-07-04 16:14:29.512216568 +0200
-@@ -552,7 +552,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;
-               }
-@@ -577,12 +577,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);
-               }
-       }
-@@ -807,7 +807,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;
-@@ -852,7 +852,7 @@
-       static int i18n_flag = 0;
- #endif /* ENABLE_NLS */
--    len = max (strlen (header), msglen (text1, &lines1));
-+    len = max (mbstrlen (header), msglen (text1, &lines1));
-     len = max (len, msglen (text2, &lines2)) + 4;
-     len = max (len, 64);
-@@ -943,7 +943,7 @@
-       static int i18n_flag = 0;
- #endif /* ENABLE_NLS */
-     
--    len = max (strlen (header), msglen (label, &lines)) + 4;
-+    len = max (mbstrlen (header), msglen (label, &lines)) + 4;
-     len = max (len, 64);
- #ifdef ENABLE_NLS
-@@ -1000,7 +1000,7 @@
- {
-     char *prompt, *label;
-     char *cp = _("Label for \"%s\":");
--    int l = strlen (cp);
-+    int l = mbstrlen (cp);
-     prompt = g_strdup_printf (cp, name_trunc (current_panel->cwd, COLS-2*UX-(l+8)));
-     label = input_dialog (_(" Add to hotlist "), prompt, current_panel->cwd);
-diff -urN mc-4.6.1-pre1.org/src/layout.c mc-4.6.1-pre1/src/layout.c
---- mc-4.6.1-pre1.org/src/layout.c     2004-07-04 16:14:01.679447792 +0200
-+++ mc-4.6.1-pre1/src/layout.c 2004-07-04 16:18:16.521705880 +0200
-@@ -362,23 +362,23 @@
-       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;
-@@ -386,12 +386,12 @@
-       second_width = strlen (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);
-diff -urN mc-4.6.1-pre1.org/src/learn.c mc-4.6.1-pre1/src/learn.c
---- mc-4.6.1-pre1.org/src/learn.c      2004-07-04 16:14:01.668449464 +0200
-+++ mc-4.6.1-pre1/src/learn.c  2004-07-04 16:18:48.288876536 +0200
-@@ -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;
-diff -urN mc-4.6.1-pre1.org/src/menu.c mc-4.6.1-pre1/src/menu.c
---- mc-4.6.1-pre1.org/src/menu.c       2004-07-04 16:14:01.694445512 +0200
-+++ mc-4.6.1-pre1/src/menu.c   2004-07-04 16:14:29.451225840 +0200
-@@ -50,35 +50,104 @@
- {
-     Menu *menu;
-     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') {
-+                  /* FIXME: XXX */
-                   mp->hot_key = tolower (*(cp+1));
--                  menu->max_entry_len = max (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 (strlen (mp->text),
--                      menu->max_entry_len);
-+                  menu->max_entry_len = max (len, menu->max_entry_len);
-               }
-           }
-       }
-     }
--    menu->name = g_strdup (name);
--    menu_scan_hotkey(menu);
-+#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->start_x = 0;
-     menu->help_node = g_strdup (help_node);
-     return menu;
-@@ -109,8 +178,26 @@
-       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);
-diff -urN mc-4.6.1-pre1.org/src/menu.h mc-4.6.1-pre1/src/menu.h
---- mc-4.6.1-pre1.org/src/menu.h       2004-07-04 16:14:01.671449008 +0200
-+++ mc-4.6.1-pre1/src/menu.h   2004-07-04 16:14:29.570207752 +0200
-@@ -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;
-diff -urN mc-4.6.1-pre1.org/src/myslang.h mc-4.6.1-pre1/src/myslang.h
---- mc-4.6.1-pre1.org/src/myslang.h    2004-07-04 16:14:01.664450072 +0200
-+++ mc-4.6.1-pre1/src/myslang.h        2004-07-04 16:14:29.573207296 +0200
-@@ -11,6 +11,10 @@
- #    include "../slang/include/slang.h"
- #endif /* !HAVE_SYSTEM_SLANG */
-+#ifdef UTF8
-+#    include <wchar.h>
-+#endif
-+
- enum {
-     KEY_BACKSPACE = 400,
-     KEY_END, KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT,
-diff -urN mc-4.6.1-pre1.org/src/option.c mc-4.6.1-pre1/src/option.c
---- mc-4.6.1-pre1.org/src/option.c     2004-07-04 16:14:01.723441104 +0200
-+++ mc-4.6.1-pre1/src/option.c 2004-07-04 16:14:29.457224928 +0200
-@@ -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 = sizeof (pause_options) / sizeof (char *);
-       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;
-     }
-diff -urN mc-4.6.1-pre1.org/src/panelize.c mc-4.6.1-pre1/src/panelize.c
---- mc-4.6.1-pre1.org/src/panelize.c   2004-07-04 16:14:01.695445360 +0200
-+++ mc-4.6.1-pre1/src/panelize.c       2004-07-04 16:19:32.600140200 +0200
-@@ -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 */
-diff -urN mc-4.6.1-pre1.org/src/screen.c mc-4.6.1-pre1/src/screen.c
---- mc-4.6.1-pre1.org/src/screen.c     2004-07-04 16:14:01.713442624 +0200
-+++ mc-4.6.1-pre1/src/screen.c 2004-07-04 16:14:29.593204256 +0200
-@@ -169,22 +169,59 @@
- static const char *
- string_file_name (file_entry *fe, int len)
- {
--    static char buffer [BUF_SMALL];
-     int 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;
-@@ -423,42 +460,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)
- {
-@@ -510,14 +511,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);
-@@ -535,34 +539,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);
-@@ -585,7 +660,6 @@
- {
-     int    second_column = 0;
-     int          width, offset;
--    char   buffer [BUF_MEDIUM];
-     offset = 0;
-     if (!isstatus && panel->split){
-@@ -614,7 +688,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)
-@@ -718,7 +792,7 @@
-     widget_move (&panel->widget, llines (panel) + 2, 1);
- #ifdef HAVE_SLANG
-     attrset (NORMAL_COLOR);
--    hline (ACS_HLINE, panel->widget.cols - 2);
-+    hline (ACS_HLINE, panel->widget.cols - 3);
- #else
-     hline ((slow_terminal ? '-' : ACS_HLINE) | NORMAL_COLOR,
-          panel->widget.cols - 2);
-@@ -1055,13 +1129,21 @@
- }
- static void
--paint_frame (WPanel *panel)
-+paint_frame (WPanel *panel) 
- {
-     int  header_len;
-     int  spaces, extra;
-     int  side, width;
--    char *txt, buffer[30]; /*Hope that this is enough ;-) */
-+    char *txt;
-+#ifdef UTF8
-+    char buffer[30 * sizeof (wchar_t)];
-+    mbstate_t s;
-+
-+    memset (&s, 0, sizeof (s));
-+#else
-+    char buffer[30]; /*Hope that this is enough ;-) */
-+#endif
-     if (!panel->split)
-       adjust_top_file (panel);
-@@ -1086,20 +1168,41 @@
-             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){
--                  strcpy (buffer, txt);
-+                  strncpy (buffer, txt, format->field_len);
-                   txt = buffer;
-                   txt [format->field_len] = 0;
--                  header_len = strlen (txt);
-+                  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, "",
-                        txt, spaces+extra, "");
--              width -= 2 * spaces + extra + header_len;
-           } else {
-               attrset (NORMAL_COLOR);
-               one_vline ();
-diff -urN mc-4.6.1-pre1.org/src/util.c mc-4.6.1-pre1/src/util.c
---- mc-4.6.1-pre1.org/src/util.c       2004-07-04 16:14:01.667449616 +0200
-+++ mc-4.6.1-pre1/src/util.c   2004-07-04 16:14:29.445226752 +0200
-@@ -33,6 +33,7 @@
- #include <string.h>
- #include <ctype.h>
-+#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 <wctype.h>
-+#endif
-+
- static const char app_text [] = "Midnight-Commander";
- int easy_patterns = 1;
-@@ -70,8 +75,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
-@@ -214,25 +242,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 (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;
- }
-@@ -665,12 +758,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) */
-@@ -682,15 +777,12 @@
- 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 char *fmtyear, *fmttime;
-     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 */
-@@ -710,7 +802,7 @@
-     else
-       fmt = fmttime;
-     
--    strftime (timebuf, i18n_timelength, fmt, localtime(&when));
-+    strftime (timebuf, sizeof (timebuf) - 1, fmt, localtime(&when));
-     return timebuf;
- }
-diff -urN mc-4.6.1-pre1.org/src/util.h mc-4.6.1-pre1/src/util.h
---- mc-4.6.1-pre1.org/src/util.h       2004-07-04 16:14:01.734439432 +0200
-+++ mc-4.6.1-pre1/src/util.h   2004-07-04 16:14:29.598203496 +0200
-@@ -47,6 +47,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
-diff -urN mc-4.6.1-pre1.org/src/view.c mc-4.6.1-pre1/src/view.c
---- mc-4.6.1-pre1.org/src/view.c       2004-07-04 16:14:01.684447032 +0200
-+++ mc-4.6.1-pre1/src/view.c   2004-07-04 16:14:29.565208512 +0200
-@@ -773,7 +773,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)
-diff -urN mc-4.6.1-pre1.org/src/widget.c mc-4.6.1-pre1/src/widget.c
---- mc-4.6.1-pre1.org/src/widget.c     2004-07-04 16:14:01.669449312 +0200
-+++ mc-4.6.1-pre1/src/widget.c 2004-07-04 16:30:31.018045464 +0200
-@@ -147,7 +147,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;
-@@ -178,7 +182,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;
-@@ -201,14 +205,35 @@
-  * 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') {
-+#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);
-+          *hotposp = cp - text;
-+      }
-       g_strlcpy (cp, cp + 1, strlen (cp));
--      b->hotkey = tolower (*cp);
--      b->hotpos = cp - b->text;
-     }
- }
-@@ -230,18 +255,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, 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);
- }
-@@ -319,16 +345,34 @@
-           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", (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 (cp);
-       }
-       return MSG_HANDLED;
-@@ -364,7 +408,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;
-     }
-@@ -425,6 +469,9 @@
-       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]);
-       }
-       return MSG_HANDLED;
-@@ -459,31 +506,18 @@
- check_new (int y, int x, int state, char *text)
- {
-     WCheck *c =  g_new (WCheck, 1);
--    char *s, *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;
- }
-@@ -525,7 +559,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)
-@@ -560,7 +594,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;
-       }
-@@ -584,7 +618,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,
-@@ -739,7 +773,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;
-@@ -918,7 +952,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;
-@@ -931,7 +965,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);
-@@ -1126,7 +1160,7 @@
-           strcpy (narea, in->buffer);
-           in->buffer = narea;
-           in->current_max_len += in->field_len;
--         g_free (p);
-+          g_free (p);
-       }
-     }
-     if (strlen (in->buffer)+1 < in->current_max_len){
-diff -urN mc-4.6.1-pre1.org/src/widget.h mc-4.6.1-pre1/src/widget.h
---- mc-4.6.1-pre1.org/src/widget.h     2004-07-04 16:14:01.673448704 +0200
-+++ mc-4.6.1-pre1/src/widget.h 2004-07-04 16:31:15.387300312 +0200
-@@ -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 {
-diff -urN mc-4.6.1-pre1.org/src/wtools.c mc-4.6.1-pre1/src/wtools.c
---- mc-4.6.1-pre1.org/src/wtools.c     2004-07-04 16:14:01.682447336 +0200
-+++ mc-4.6.1-pre1/src/wtools.c 2004-07-04 16:20:48.858547160 +0200
-@@ -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 (strlen (header), msglen (text, &lines)));
-+    cols = 6 + max (win_len, max (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 @@
-     histname[63] = '\0';
-     quick_widgets[2].histname = histname;
--    len = max (strlen (header), msglen (text, &lines)) + 4;
-+    len = max (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 */
diff --git a/mc-64bit.patch b/mc-64bit.patch
deleted file mode 100644 (file)
index 3d1d942..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
---- mc-4.6.1a/src/mountlist.c.64bit    2005-02-08 23:33:52.000000000 +0100
-+++ mc-4.6.1a/src/mountlist.c  2005-05-10 17:09:24.122853504 +0200
-@@ -131,11 +131,19 @@ struct mount_entry
- struct fs_usage
- {
-+#ifndef HAVE_SYS_STATVFS_H
-   long fsu_blocks;            /* Total blocks. */
-   long fsu_bfree;             /* Free blocks available to superuser. */
-   long fsu_bavail;            /* Free blocks available to non-superuser. */
-   long fsu_files;             /* Total file nodes. */
-   long fsu_ffree;             /* Free file nodes. */
-+#else /* We have sys/statvfs.h, use proper data types when _FILE_OFFSET_BITS=64 */
-+  fsblkcnt_t fsu_blocks;
-+  fsblkcnt_t fsu_bfree;
-+  fsblkcnt_t fsu_bavail;
-+  fsblkcnt_t fsu_files;
-+  fsblkcnt_t fsu_ffree;
-+#endif /* HAVE_SYS_STATVFS_H */
- };
- static int get_fs_usage (char *path, struct fs_usage *fsp);
-@@ -665,6 +673,7 @@ my_statfs (struct my_statfs *myfs_stats,
-    BLOCKS FROMSIZE-byte blocks, rounding away from zero.
-    TOSIZE must be positive.  Return -1 if FROMSIZE is not positive.  */
-+#if !defined(HAVE_SYS_STATFS_H) || !defined(STAT_STATVFS)
- static long
- fs_adjust_blocks (long blocks, int fromsize, int tosize)
- {
-@@ -672,13 +681,21 @@ fs_adjust_blocks (long blocks, int froms
-       abort ();
-     if (fromsize <= 0)
-       return -1;
--
-+#else
-+static fsblkcnt_t
-+fs_adjust_blocks (fsblkcnt_t blocks, unsigned long fromsize, unsigned long tosize)
-+{
-+    if (!tosize)
-+        abort ();
-+    if (!fromsize)
-+        return -1;
-+#endif
-     if (fromsize == tosize)   /* E.g., from 512 to 512.  */
-       return blocks;
-     else if (fromsize > tosize)       /* E.g., from 2048 to 512.  */
-       return blocks * (fromsize / tosize);
-     else                      /* E.g., from 256 to 512.  */
--      return (blocks + (blocks < 0 ? -1 : 1)) / (tosize / fromsize);
-+      return (blocks + 1) / (tosize / fromsize);
- }
- #if defined(_AIX) && defined(_I386)
---- mc-4.6.1a/acinclude.m4.64bit       2005-05-10 17:09:24.084859280 +0200
-+++ mc-4.6.1a/acinclude.m4     2005-05-10 17:09:24.124853200 +0200
-@@ -501,7 +501,7 @@ dnl job is to detect a method to get fil
-       if test $ac_cv_func_statvfs = yes; then
-       space=yes
-       AC_DEFINE(STAT_STATVFS, 1,
--                [Define if function `statfs' can be used])
-+                [Define if function `statvfs' can be used])
-       fi
-     fi
diff --git a/mc-BINDIR.patch b/mc-BINDIR.patch
deleted file mode 100644 (file)
index 3196cae..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
---- mc-4.5.54/Make.common.in~.~        Mon Oct  9 01:58:39 2000
-+++ mc-4.5.54/Make.common.in   Fri Jul 13 08:59:12 2001
-@@ -58,7 +58,6 @@
- # something to these, so that's why there is a leading _
- XCFLAGS = @CFLAGS@
- XCPPFLAGS = @CPPFLAGS@ @MCCPPFLAGS@ -I.. \
--      -DBINDIR=\""$(bindir)/"\" \
-       -DLIBDIR=\""$(mclibdir)/"\" \
-       -DICONDIR=\""$(icondir)/"\" \
-       -DLOCALEDIR=\""$(localedir)/"\" \
diff --git a/mc-extention.patch b/mc-extention.patch
deleted file mode 100644 (file)
index d687719..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-diff -urN mc-4.5.52.org/lib/mc.ext.in mc-4.5.52/lib/mc.ext.in
---- mc-4.5.52.org/lib/mc.ext.in        Mon Mar 19 20:44:46 2001
-+++ mc-4.5.52/lib/mc.ext.in    Mon Mar 19 20:53:54 2001
-@@ -350,7 +350,7 @@
- regex/\.([Dd]oc|DOC)$
-       #View=%view{ascii} catdoc -w %f
-       View=%view{ascii} word2x -f text %f -
--type/Microsoft Word Document
-+type/Microsoft\ Word\ Document
-       #View=%view{ascii} catdoc -w %f
-       View=%view{ascii} word2x -f text %f -
-  
-@@ -377,7 +377,7 @@
-       Start Emacs on this RMAIL file=emacs %f
-       Open=emacs %f
--type/mail
-+type/Mail
-       Open=elm -f %f
-       View=%view{ascii} mcmfmt < %f
-@@ -496,14 +496,14 @@
-       Extract=cat '%f' | cpio -ic
- # gzip
--type/gzip
-+type/gzip\ compressed\ data
-       Open=gzip -dc %f | %var{PAGER:more}
-       View=%view{ascii} gzip -dc %f 2>/dev/null
-       Edit=I=`date +%%s`; export I; gzip -cd %f >/tmp/gzed.$I && %var{EDITOR:vi} /tmp/gzed.$I && gzip -c /tmp/gzed.$I > %f; rm -f /tmp/gzed.$I
-       Uncompress=gunzip %f
- # bzip2
--type/bzip2
-+type/bzip2\ compressed\ data
-       Open=bzip2 -dc %f | %var{PAGER:more}
-       View=%view{ascii} bzip2 -dc %f 2>/dev/null
-       Edit=I=`date +%%s`; export I; bzip2 -cd %f >/tmp/bzed.$I && %var{EDITOR:vi} /tmp/bzed.$I && bzip2 -c /tmp/bzed.$I > %f; rm -f /tmp/bzed.$I
-@@ -517,7 +517,7 @@
-       Uncompress=bunzip %f
- # compress
--type/compress
-+type/compress\'d\ data
-       Open=gzip -dc %f | %var{PAGER:more}
-       View=%view{ascii} gzip -dc %f 2>/dev/null
-       Edit=I=`date +%%s`; export I; gzip -cd %f >/tmp/gzed.$I && %var{EDITOR:vi} /tmp/gzed.$I && gzip -c /tmp/gzed.$I > %f; rm -f /tmp/gzed.$I
diff --git a/mc-ftpcrash.patch b/mc-ftpcrash.patch
deleted file mode 100644 (file)
index 6ca8cfb..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
---- mc-2004-12-01-22/vfs/ftpfs.c       2004-11-03 03:54:00.000000000 +0200
-+++ mc-2004-12-01-22-new/vfs/ftpfs.c   2005-02-07 17:34:25.000000000 +0200
-@@ -316,6 +316,8 @@
-     va_list ap;
-     char *cmdstr;
-     int status, cmdlen;
-+    static int retry = 0;
-+    static int level = 0;     /* ftpfs_login_server() use ftpfs_command() */
-     va_start (ap, fmt);
-     cmdstr = g_strdup_vprintf (fmt, ap);
-@@ -343,7 +345,6 @@
-       code = 421;
-       if (errno == EPIPE) {   /* Remote server has closed connection */
--          static int level = 0;       /* ftpfs_login_server() use ftpfs_command() */
-           if (level == 0) {
-               level = 1;
-               status = ftpfs_reconnect (me, super);
-@@ -359,14 +360,30 @@
-       disable_interrupt_key ();
-       return TRANSIENT;
-     }
-+    retry = 0;
-   ok:
--    g_free (cmdstr);
-     disable_interrupt_key ();
-     if (wait_reply)
--      return ftpfs_get_reply (me, SUP.sock,
-+    {
-+      status = ftpfs_get_reply (me, SUP.sock,
-                         (wait_reply & WANT_STRING) ? reply_str : NULL,
-                         sizeof (reply_str) - 1);
-+      if ((wait_reply & WANT_STRING) && !retry && !level && code == 421)
-+      {
-+          retry = 1;
-+          level = 1;
-+          status = ftpfs_reconnect (me, super);           
-+          level = 0;
-+          if (status && (write (SUP.sock, cmdstr, cmdlen) > 0)) {
-+              goto ok;
-+          }
-+      }
-+      retry = 0;
-+        g_free (cmdstr);      
-+      return status;
-+    }
-+    g_free (cmdstr);    
-     return COMPLETE;
- }
diff --git a/mc-showagain.patch b/mc-showagain.patch
deleted file mode 100644 (file)
index e2b7286..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
---- mc-4.5.51/gnome/gmain.c.showagain  Mon Jul 17 12:54:28 2000
-+++ mc-4.5.51/gnome/gmain.c    Mon Jul 17 13:15:00 2000
-@@ -555,10 +555,20 @@
- gnome_check_super_user (void)
- {
-       GtkWidget *warning_dlg;
-+      GtkWidget *cbox;
--      if (geteuid () != 0)
-+      gboolean show_dialog;
-+
-+      if (geteuid () != 0)
-+              return;
-+
-+      gnome_config_push_prefix( "/gmc/Root/");
-+      show_dialog = gnome_config_get_bool ("show_dialog=true");
-+      gnome_config_pop_prefix ();
-+      if (!show_dialog)
-               return;
-+      cbox = gtk_check_button_new_with_label (_("Don't show this window again"));
-       warning_dlg = gnome_message_box_new (
-               _("You are running the GNOME File Manager as root.\n\n"
-                 "As root, you can damage your system, and the "
-@@ -567,6 +577,16 @@
-                 "account to the system.\n"),
-               GNOME_MESSAGE_BOX_WARNING,
-               GNOME_STOCK_BUTTON_OK, NULL);
--
-+      gtk_widget_show (cbox);
-+      gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (warning_dlg)->vbox), cbox, FALSE, FALSE, 0);
-+      gnome_dialog_close_hides (GNOME_DIALOG (warning_dlg), TRUE);
-       gnome_dialog_run_and_close (GNOME_DIALOG (warning_dlg));
-+      if (GTK_TOGGLE_BUTTON (cbox)->active) {
-+              gnome_config_push_prefix( "/gmc/Root/");
-+              gnome_config_set_bool ("show_dialog", FALSE);
-+              gnome_config_pop_prefix ();
-+      }
-+      gnome_config_sync ();
-+      gtk_widget_destroy (warning_dlg);
- }
-+
diff --git a/mc-slang2.patch b/mc-slang2.patch
deleted file mode 100644 (file)
index 8ee7b0f..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-diff -urbB mc-4.6.1.org/src/global.h mc-4.6.1/src/global.h
---- mc-4.6.1.org/src/global.h  2005-09-19 22:32:27.799047000 +0200
-+++ mc-4.6.1/src/global.h      2005-09-19 22:37:41.188405176 +0200
-@@ -146,6 +146,13 @@
- #   define N_(String) (String)
- #endif /* !ENABLE_NLS */
-+#include <slang/slang.h>
-+#if SLANG_VERSION >= 20000
-+#define UTF8 1
-+#define SLsmg_Is_Unicode SLsmg_is_utf8_mode()
-+void SLsmg_write_nwchars(wchar_t *s, size_t n);
-+#endif
-+    
- #include "fs.h"
- #include "util.h"
-diff -urbB mc-4.6.1.org/src/help.c mc-4.6.1/src/help.c
---- mc-4.6.1.org/src/help.c    2005-09-19 22:32:27.941026000 +0200
-+++ mc-4.6.1/src/help.c        2005-09-19 22:36:33.341719440 +0200
-@@ -445,7 +445,7 @@
- #ifndef HAVE_SLANG
-                       addch (acs_map [c]);
- #else
--#ifdef UTF8
-+#if defined(UTF8) && SLANG_VERSION < 20000
-                       SLsmg_draw_object (h->y + line + 2, h->x + col + 2, acs_map [c]);
- #else
-                       SLsmg_draw_object (h->y + line + 2, h->x + col + 2, c);
-diff -urbB mc-4.6.1.org/src/slint.c mc-4.6.1/src/slint.c
---- mc-4.6.1.org/src/slint.c   2005-05-27 16:19:18.000000000 +0200
-+++ mc-4.6.1/src/slint.c       2005-09-19 22:34:33.333963392 +0200
-@@ -180,6 +180,9 @@
-     struct sigaction act, oact;
-     
-     SLtt_get_terminfo ();
-+#if SLANG_VERSION >= 20000
-+    SLutf8_enable (-1);
-+#endif
-    /*
-     * If the terminal in not in terminfo but begins with a well-known
-diff -urbB mc-4.6.1.org/src/util.c mc-4.6.1/src/util.c
---- mc-4.6.1.org/src/util.c    2005-09-19 22:32:27.943025000 +0200
-+++ mc-4.6.1/src/util.c        2005-09-19 22:37:11.447926416 +0200
-@@ -55,6 +55,14 @@
- static const char app_text [] = "Midnight-Commander";
- int easy_patterns = 1;
-+#if SLANG_VERSION >= 20000
-+void SLsmg_write_nwchars(wchar_t *s, size_t n)
-+{
-+    while(n--)
-+      SLsmg_write_char(*s++);
-+}
-+#endif
-+      
- extern void str_replace(char *s, char from, char to)
- {
-     for (; *s != '\0'; s++) {
diff --git a/mc-stderr.patch b/mc-stderr.patch
deleted file mode 100644 (file)
index f75672c..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
---- mc-4.5.51/src/background.c.stderr  Mon Jul  3 15:32:10 2000
-+++ mc-4.5.51/src/background.c Fri Aug  4 13:38:01 2000
-@@ -146,7 +146,7 @@
-       close (1);
-       close (2);
--      if ((nullfd = open ("/dev/null", O_RDONLY)) != -1){
-+      if ((nullfd = open ("/dev/null", O_RDWR)) != -1){
-           while (dup2 (nullfd, 0) == -1 && errno == EINTR)
-                   ;
-           while (dup2 (nullfd, 1) == -1 && errno == EINTR)
---- mc-4.5.51/gnome/gutil.c.stderr     Fri Aug  4 13:47:52 2000
-+++ mc-4.5.51/gnome/gutil.c    Fri Aug  4 13:48:13 2000
-@@ -159,10 +159,10 @@
-               open ("/dev/null", O_APPEND);
-               /* stdout */
--              open ("/dev/null", O_RDONLY);
-+              open ("/dev/null", O_WRONLY);
-               /* stderr */
--              open ("/dev/null", O_RDONLY);
-+              open ("/dev/null", O_WRONLY);
-               
-               if (!(flags & EXECUTE_WAIT))
-                       *pid = fork ();
diff --git a/mc-symcrash.patch b/mc-symcrash.patch
deleted file mode 100644 (file)
index cef80ca..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
---- mc-4.6.1/src/util.c.symcrash       2005-09-13 12:41:54.000000000 +0200
-+++ mc-4.6.1/src/util.c        2005-09-13 12:41:54.000000000 +0200
-@@ -1406,21 +1406,23 @@
-  * as needed up in first and then goes down using second */
- char *diff_two_paths (const char *first, const char *second) 
- {
--    char *p, *q, *r, *s, *buf = 0;
-+    char *p, *q, *r, *s, *buf = NULL;
-     int i, j, prevlen = -1, currlen;
-     char *my_first = NULL, *my_second = NULL;
-     
-     my_first = resolve_symlinks (first);
-     if (my_first == NULL)
-         return NULL;
-+    my_second= resolve_symlinks (second);
-+    if (my_second == NULL) {
-+      g_free (my_first);
-+      return NULL;
-+    }
-     for (j = 0; j < 2; j++) {
-       p = my_first;
-       if (j) {
--          my_second = resolve_symlinks (second);
--          if (my_second == NULL) {
--              g_free (my_first);
-+          if (my_second == NULL)
-               return buf;
--          }
-       }
-       q = my_second;
-       for (;;) {
---- mc-4.6.1/src/file.c.symcrash       2005-09-13 12:41:54.000000000 +0200
-+++ mc-4.6.1/src/file.c        2005-09-13 12:51:44.000000000 +0200
-@@ -389,7 +389,7 @@
-       const char *r = strrchr (src_path, PATH_SEP);
-       if (r) {
--          p = g_strndup (src_path, r - src_path);
-+          p = g_strndup (src_path, r - src_path + 1);
-           if (*dst_path == PATH_SEP)
-               q = g_strdup (dst_path);
-           else
diff --git a/mc-use_AM_GNU_GETTEXT.patch b/mc-use_AM_GNU_GETTEXT.patch
deleted file mode 100644 (file)
index 1500073..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
---- mc-4.5.53/configure.in     Sat Apr 14 02:40:35 2001
-+++ mc-4.5.53.new/configure.in~        Fri Apr 13 03:05:02 2001
-@@ -50,7 +50,7 @@
- ALL_LINGUAS="az ca cs da de el es es_ES fi fr hu it ja ko lv nl no pl pt_BR ro ru sl sv sk uk ta tr wa zh_TW.Big5 zh_CN.GB2312"
--AM_GNOME_GETTEXT
-+AM_GNU_GETTEXT
- dnl
- dnl Enforce coding standards
---- mc-4.5.53/src/Makefile.in~ Sat Apr 14 02:42:51 2001
-+++ mc-4.5.53/src/Makefile.in  Sun Apr 22 07:37:06 2001
-@@ -14,7 +14,7 @@
- LIBS     = $(XLIBS) @TERMNET@ $(XLIB) @TERMNET@ @MCLIBS@ -lpopt
- OURLIBS  = @LVFS@ @LSLANG@ @LEDIT@ @LGPM@ @LINTL@
- DEPLIBS  = $(top_builddir)/vfs/@LIBVFS@ $(top_builddir)/slang/@LIBSLANG@ \
--      $(top_builddir)/edit/@LIBEDIT_A@ @INTLDEPS@
-+      $(top_builddir)/edit/@LIBEDIT_A@
- INSTALL  = @INSTALL@
- INSTALL_PROGRAM = @INSTALL_PROGRAM@
---- mc-4.5.53/gnome/Makefile.in~       Sat Apr 14 02:42:52 2001
-+++ mc-4.5.53/gnome/Makefile.in        Sun Apr 22 07:38:19 2001
-@@ -17,7 +17,7 @@
- LIBS = $(XLIBS) @TERMNET@
- EXTRALIBS = -L../vfs @LVFS@ -L../gtkedit -lgtkedit @LINTL@
- DEPLIBS = $(top_builddir)/vfs/@LIBVFS@ \
--      $(top_builddir)/gtkedit/@libgtkedit@ @INTLDEPS@
-+      $(top_builddir)/gtkedit/@libgtkedit@
- INSTALL = @INSTALL@
- INSTALL_PROGRAM = @INSTALL_PROGRAM@
- INSTALL_DATA = @INSTALL_DATA@
diff --git a/mc-use_old_sorting.patch b/mc-use_old_sorting.patch
deleted file mode 100644 (file)
index 24f3187..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -urN mc-4.5.52.org/src/dir.c mc-4.5.52/src/dir.c
---- mc-4.5.52.org/src/dir.c    Mon Mar 19 20:44:47 2001
-+++ mc-4.5.52/src/dir.c        Mon Mar 19 21:04:25 2001
-@@ -82,7 +82,7 @@
-  * Ideally, the user should be able to select between all three functions -
-  * strcoll() (if available), strcmp() and g_strcasecmp().
-  */
--#ifdef HAVE_STRCOLL
-+#if defined(HAVE_STRCOLL) && 0
- #define string_sortcomp(a,b) (case_sensitive ? strcoll (a,b) : g_strcasecmp (a,b))
- #else
- #define string_sortcomp(a,b) (case_sensitive ? strcmp (a,b) : g_strcasecmp (a,b))
This page took 0.408502 seconds and 4 git commands to generate.