From 63def9a2fad44b70c314e07f67a38493151e98c4 Mon Sep 17 00:00:00 2001 From: Jindrich Novy Date: Wed, 27 May 2009 05:49:13 +0000 Subject: [PATCH] - update to mc-4.6.2 release - drop .8bit-hex, .preserveattrs, .cloexec, .7zip and part of .utf8-look-and-feel patch, applied upstream - sync the rest of patches, adopt upstream version of UTF8 patch - update URL and source links - add required BR --- .cvsignore | 2 +- mc-utf8.patch => mc-4.6.2-utf8.patch | 4207 ++++++++++++++++++-------- mc-7zip.patch | 23 - mc-cloexec.patch | 18 - mc-concat.patch | 20 - mc-etcmc.patch | 510 ++-- mc-extensions.patch | 44 +- mc-newlinedir.patch | 9 +- mc-preserveattr.patch | 12 - mc-showfree.patch | 410 +-- mc-userhost.patch | 147 +- mc-utf8-8bit-hex.patch | 26 - mc-utf8-look-and-feel.patch | 204 -- mc.spec | 34 +- sources | 2 +- 15 files changed, 3489 insertions(+), 2179 deletions(-) rename mc-utf8.patch => mc-4.6.2-utf8.patch (64%) delete mode 100644 mc-7zip.patch delete mode 100644 mc-cloexec.patch delete mode 100644 mc-concat.patch delete mode 100644 mc-preserveattr.patch delete mode 100644 mc-utf8-8bit-hex.patch delete mode 100644 mc-utf8-look-and-feel.patch diff --git a/.cvsignore b/.cvsignore index 772bd89..cbe4b3f 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1 +1 @@ -mc-4.6.2-pre1.tar.gz +mc-4.6.2.tar.gz diff --git a/mc-utf8.patch b/mc-4.6.2-utf8.patch similarity index 64% rename from mc-utf8.patch rename to mc-4.6.2-utf8.patch index 34d8064..66472af 100644 --- a/mc-utf8.patch +++ b/mc-4.6.2-utf8.patch @@ -1,6 +1,7 @@ -diff -up mc-4.6.2-pre1/acinclude.m4.utf8 mc-4.6.2-pre1/acinclude.m4 ---- mc-4.6.2-pre1/acinclude.m4.utf8 2006-09-07 17:59:51.000000000 +0200 -+++ mc-4.6.2-pre1/acinclude.m4 2008-12-04 13:25:34.000000000 +0100 +diff --git a/acinclude.m4 b/acinclude.m4 +index f4c0e3b..f7f4fd4 100644 +--- a/acinclude.m4 ++++ b/acinclude.m4 @@ -399,14 +399,14 @@ AC_DEFUN([MC_WITH_SLANG], [ fi @@ -24,11 +25,856 @@ diff -up mc-4.6.2-pre1/acinclude.m4.utf8 mc-4.6.2-pre1/acinclude.m4 if test x$with_screen = xslang; then AC_DEFINE(HAVE_SYSTEM_SLANG, 1, -diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c ---- mc-4.6.2-pre1/edit/editcmd.c.utf8 2007-05-02 13:22:01.000000000 +0200 -+++ mc-4.6.2-pre1/edit/editcmd.c 2008-12-04 13:25:34.000000000 +0100 -@@ -61,7 +61,7 @@ - #define edit_get_save_file(f,h) input_expand_dialog (h, _(" Enter file name: "), f) +diff --git a/edit/edit-widget.h b/edit/edit-widget.h +index ab55764..fd51aaa 100644 +--- a/edit/edit-widget.h ++++ b/edit/edit-widget.h +@@ -30,6 +30,11 @@ typedef struct edit_key_map_type { + long command; + } edit_key_map_type; + ++struct action { ++ mc_wchar_t ch; ++ long flags; ++}; ++ + struct WEdit { + Widget widget; + +@@ -42,8 +47,17 @@ struct WEdit { + /* 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 */ ++#ifndef UTF8 + unsigned char *buffers1[MAXBUFF + 1]; /* all data up to curs1 */ + unsigned char *buffers2[MAXBUFF + 1]; /* all data from end of file down to curs2 */ ++#else /* UTF8 */ ++ mc_wchar_t *buffers1[MAXBUFF + 1]; /* all data up to curs1 */ ++ mc_wchar_t *buffers2[MAXBUFF + 1]; /* all data from end of file down to curs2 */ ++ ++ unsigned char charbuf[MB_LEN_MAX]; ++ int charpoint; ++#endif /* UTF8 */ ++ + + /* search variables */ + long search_start; /* First character to start searching from */ +@@ -87,7 +101,7 @@ struct WEdit { + + /* 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; +diff --git a/edit/edit.c b/edit/edit.c +index bec84d7..8df473b 100644 +--- a/edit/edit.c ++++ b/edit/edit.c +@@ -105,7 +105,11 @@ char *option_backup_ext = NULL; + + static void user_menu (WEdit *edit); + ++#ifndef UTF8 + int edit_get_byte (WEdit * edit, long byte_index) ++#else ++mc_wchar_t edit_get_byte (WEdit * edit, long byte_index) ++#endif + { + unsigned long p; + if (byte_index >= (edit->curs1 + edit->curs2) || byte_index < 0) +@@ -134,7 +138,7 @@ edit_init_buffers (WEdit *edit) + + edit->curs1 = 0; + edit->curs2 = 0; +- edit->buffers2[0] = g_malloc (EDIT_BUF_SIZE); ++ edit->buffers2[0] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t)); + } + + /* +@@ -159,7 +163,7 @@ edit_load_file_fast (WEdit *edit, const char *filename) + } + + if (!edit->buffers2[buf2]) +- edit->buffers2[buf2] = g_malloc (EDIT_BUF_SIZE); ++ edit->buffers2[buf2] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t)); + + mc_read (file, + (char *) edit->buffers2[buf2] + EDIT_BUF_SIZE - +@@ -169,7 +173,7 @@ edit_load_file_fast (WEdit *edit, const char *filename) + 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(mc_wchar_t)); + mc_read (file, (char *) edit->buffers2[buf], EDIT_BUF_SIZE); + } + +@@ -242,9 +246,44 @@ edit_insert_stream (WEdit * edit, FILE * f) + { + int c; + long i = 0; +- while ((c = fgetc (f)) >= 0) { ++#ifndef UTF8 ++ while ((c = fgetc (f)) != EOF) { + edit_insert (edit, c); + i++; ++#else /* UTF8 */ ++ unsigned char buf[MB_LEN_MAX]; ++ int charpos = 0; ++ mbstate_t mbs; ++ ++ while ((c = fgetc (f)) != EOF) { ++ mc_wchar_t wc; ++ int size; ++ int j; ++ ++ buf[charpos++] = c; ++ ++ memset (&mbs, 0, sizeof (mbs)); ++ size = mbrtowc(&wc, (char *)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; jlast_byte; i++) + if (fputc (edit_get_byte (edit, i), f) < 0) + break; ++#else /* UTF8 */ ++ for (i = 0; i < edit->last_byte; i++) { ++ mc_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; ++ } ++ } ++#endif /* UTF8 */ + return i; + } + +@@ -293,12 +355,46 @@ edit_insert_file (WEdit *edit, const char *filename) + int i, file, blocklen; + long current = edit->curs1; + unsigned char *buf; ++#ifdef UTF8 ++ mbstate_t mbs; ++ int bufstart = 0; ++ ++ memset (&mbs, 0, sizeof (mbs)); ++#endif /* UTF8 */ + if ((file = mc_open (filename, O_RDONLY | O_BINARY)) == -1) + return 0; + buf = g_malloc (TEMP_BUF_LEN); ++#ifndef UTF8 + while ((blocklen = mc_read (file, (char *) buf, TEMP_BUF_LEN)) > 0) { + for (i = 0; i < blocklen; i++) + edit_insert (edit, buf[i]); ++#else /* UTF8 */ ++ while ((blocklen = mc_read (file, (char *) buf + bufstart, TEMP_BUF_LEN - bufstart)) > 0) { ++ blocklen += bufstart; ++ bufstart = 0; ++ for (i = 0; i < blocklen; ) { ++ mc_wchar_t wc; ++ int j; ++ int size = mbrtowc(&wc, (char *)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 + (mc_wchar_t)buf[i]); ++#endif ++ memset (&mbs, 0, sizeof (mbs)); ++ i++; /* skip broken char */ ++ } ++ else { ++ edit_insert (edit, wc); ++ i+=size; ++ } ++ } ++#endif /* UTF8 */ + } + edit_cursor_move (edit, current - edit->curs1); + g_free (buf); +@@ -388,7 +484,11 @@ cleanup: + static int + edit_load_file (WEdit *edit) + { ++#ifndef UTF8 + int fast_load = 1; ++#else /* UTF8 */ ++ int fast_load = 0; /* can't be used with multibyte characters */ ++#endif /* UTF8 */ + + /* Cannot do fast load if a filter is used */ + if (edit_find_filter (edit->filename) >= 0) +@@ -454,6 +554,7 @@ edit_load_position (WEdit *edit) + edit->prev_col = column; + edit_move_to_prev_col (edit, edit_bol (edit, edit->curs1)); + edit_move_display (edit, line - (edit->num_widget_lines / 2)); ++ edit->charpoint = 0; + } + + /* Save cursor position in the file */ +@@ -537,7 +638,7 @@ edit_init (WEdit *edit, int lines, int columns, const char *filename, + 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) +@@ -692,14 +793,23 @@ void edit_push_action (WEdit * edit, long c,...) + { + unsigned long sp = edit->stack_pointer; + unsigned long spm1; +- long *t; ++ ++ struct action *t; ++ mc_wchar_t ch = 0; ++ ++ if (c == CHAR_INSERT || c == CHAR_INSERT_AHEAD) { ++ va_list ap; ++ va_start (ap, c); ++ ch = va_arg (ap, mc_wint_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 < (unsigned long) 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; +@@ -714,7 +824,7 @@ void edit_push_action (WEdit * edit, long c,...) + #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)); +@@ -725,12 +835,14 @@ void edit_push_action (WEdit * edit, long c,...) + && 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) { ++ mc_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; + } + } +@@ -738,19 +850,20 @@ void edit_push_action (WEdit * edit, long c,...) + #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 +@@ -762,7 +875,9 @@ void edit_push_action (WEdit * edit, long c,...) + #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; +@@ -775,10 +890,10 @@ void edit_push_action (WEdit * edit, long c,...) + (((unsigned long) 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; + } + +@@ -787,30 +902,30 @@ void edit_push_action (WEdit * edit, long c,...) + 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) { +-/* edit->undo_stack[sp] = '@'; */ ++ *c = edit->undo_stack[sp]; ++ if (edit->undo_stack[sp].flags >= 0) { + 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) { +-/* edit->undo_stack[sp] = '@'; */ ++ *c = edit->undo_stack[(sp - 1) & edit->stack_size_mask]; ++ ++ if (edit->undo_stack[sp].flags == -2) { + 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 */ +@@ -831,7 +946,7 @@ static inline void edit_modification (WEdit * edit) + */ + + void +-edit_insert (WEdit *edit, int c) ++edit_insert (WEdit *edit, mc_wchar_t c) + { + /* check if file has grown to large */ + if (edit->last_byte >= SIZE_LIMIT) +@@ -869,12 +984,11 @@ edit_insert (WEdit *edit, int c) + /* 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(mc_wchar_t)); + + /* perform the insertion */ +- edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE][edit-> +- curs1 & M_EDIT_BUF_SIZE] +- = (unsigned char) c; ++ edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] ++ [edit->curs1 & M_EDIT_BUF_SIZE] = c; + + /* update file length */ + edit->last_byte++; +@@ -885,7 +999,7 @@ edit_insert (WEdit *edit, int c) + + + /* same as edit_insert and move left */ +-void edit_insert_ahead (WEdit * edit, int c) ++void edit_insert_ahead (WEdit * edit, mc_wchar_t c) + { + if (edit->last_byte >= SIZE_LIMIT) + return; +@@ -908,7 +1022,7 @@ void edit_insert_ahead (WEdit * edit, int c) + 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(mc_wchar_t)); + edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE - (edit->curs2 & M_EDIT_BUF_SIZE) - 1] = c; + + edit->last_byte++; +@@ -918,7 +1032,7 @@ void edit_insert_ahead (WEdit * edit, int c) + + int edit_delete (WEdit * edit) + { +- int p; ++ mc_wint_t p; + if (!edit->curs2) + return 0; + +@@ -942,7 +1056,7 @@ int edit_delete (WEdit * edit) + 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') +@@ -956,7 +1070,7 @@ int edit_delete (WEdit * edit) + static int + edit_backspace (WEdit * edit) + { +- int p; ++ mc_wint_t p; + if (!edit->curs1) + return 0; + +@@ -980,7 +1094,7 @@ edit_backspace (WEdit * edit) + 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--; +@@ -993,10 +1107,18 @@ edit_backspace (WEdit * edit) + + #ifdef FAST_MOVE_CURSOR + +-static void memqcpy (WEdit * edit, unsigned char *dest, unsigned char *src, int n) ++static void memqcpy (WEdit * edit, mc_wchar_t *dest, mc_wchar_t *src, int n) + { + unsigned long next; ++#ifndef UTF8 + while ((next = (unsigned long) memccpy (dest, src, '\n', n))) { ++#else /* UTF8 */ ++ while (n) { ++ next = 0; ++ while (next < n && src[next]!='\n') next++; ++ if (next < n) next++; ++ wmemcpy (dest, src, next) ++#endif /* UTF8 */ + edit->curs_line--; + next -= (unsigned long) dest; + n -= next; +@@ -1009,7 +1131,7 @@ int + edit_move_backward_lots (WEdit *edit, long increment) + { + int r, s, t; +- unsigned char *p; ++ mc_wchar_t *p; + + if (increment > edit->curs1) + increment = edit->curs1; +@@ -1049,7 +1171,7 @@ edit_move_backward_lots (WEdit *edit, long increment) + 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(mc_wchar_t)); + } else { + g_free (p); + } +@@ -1087,7 +1209,7 @@ edit_move_backward_lots (WEdit *edit, long increment) + 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(mc_wchar_t)); + } else { + g_free (p); + } +@@ -1120,7 +1242,7 @@ void edit_cursor_move (WEdit * edit, long increment) + + 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(mc_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]; +@@ -1144,7 +1266,7 @@ void edit_cursor_move (WEdit * edit, long increment) + + 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(mc_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]; +@@ -1249,7 +1371,7 @@ long edit_move_forward3 (WEdit * edit, long current, int cols, long upto) + q = edit->last_byte + 2; + + for (col = 0, p = current; p < q; p++) { +- int c; ++ mc_wchar_t c; + if (cols != -10) { + if (col == cols) + return p; +@@ -1267,7 +1389,7 @@ long edit_move_forward3 (WEdit * edit, long current, int cols, long upto) + } else if (c < 32 || c == 127) + col += 2; /* Caret notation for control characters */ + else +- col++; ++ col += wcwidth(c); + } + return col; + } +@@ -1400,12 +1522,16 @@ static int + is_blank (WEdit *edit, long offset) + { + long s, f; +- int c; ++ mc_wchar_t c; + s = edit_bol (edit, offset); + f = edit_eol (edit, offset) - 1; + while (s <= f) { + c = edit_get_byte (edit, s++); ++#ifndef UTF8 + if (!isspace (c)) ++#else ++ if (!iswspace (c)) ++#endif /* UTF8 */ + return 0; + } + return 1; +@@ -1660,6 +1786,7 @@ my_type_of (int c) + return 2; + return 0x80000000UL; + } ++#ifndef UTF8 + if (isupper (c)) + c = 'A'; + else if (islower (c)) +@@ -1670,6 +1797,18 @@ my_type_of (int c) + c = '0'; + else if (isspace (c)) + c = ' '; ++#else ++ if (iswupper (c)) ++ c = 'A'; ++ else if (iswlower (c)) ++ c = 'a'; ++ else if (iswalpha (c)) ++ c = 'a'; ++ else if (iswdigit (c)) ++ c = '0'; ++ else if (iswspace (c)) ++ c = ' '; ++#endif /* UTF8 */ + q = strchr (option_chars_move_whole_word, c); + if (!q) + return 0xFFFFFFFFUL; +@@ -1694,10 +1833,18 @@ edit_left_word_move (WEdit *edit, int s) + c2 = edit_get_byte (edit, edit->curs1); + if (!(my_type_of (c1) & my_type_of (c2))) + break; ++#ifndef UTF8 + if (isspace (c1) && !isspace (c2)) ++#else ++ if (iswspace (c1) && !iswspace (c2)) ++#endif /* UTF8 */ + break; + if (s) ++#ifndef UTF8 + if (!isspace (c1) && isspace (c2)) ++#else ++ if (!iswspace (c1) && iswspace (c2)) ++#endif /* UTF8 */ + break; + } + } +@@ -1720,10 +1867,18 @@ edit_right_word_move (WEdit *edit, int s) + c2 = edit_get_byte (edit, edit->curs1); + if (!(my_type_of (c1) & my_type_of (c2))) + break; ++#ifndef UTF8 + if (isspace (c1) && !isspace (c2)) ++#else ++ if (iswspace (c1) && !iswspace (c2)) ++#endif /* UTF8 */ + break; + if (s) ++#ifndef UTF8 + if (!isspace (c1) && isspace (c2)) ++#else ++ if (!iswspace (c1) && iswspace (c2)) ++#endif /* UTF8 */ + break; + } + } +@@ -1743,7 +1898,11 @@ static void edit_right_delete_word (WEdit * edit) + break; + c1 = edit_delete (edit); + c2 = edit_get_byte (edit, edit->curs1); ++#ifndef UTF8 + if ((isspace (c1) == 0) != (isspace (c2) == 0)) ++#else ++ if ((iswspace (c1) == 0) != (iswspace (c2) == 0)) ++#endif /* UTF8 */ + break; + if (!(my_type_of (c1) & my_type_of (c2))) + break; +@@ -1758,7 +1917,11 @@ static void edit_left_delete_word (WEdit * edit) + break; + c1 = edit_backspace (edit); + c2 = edit_get_byte (edit, edit->curs1 - 1); ++#ifndef UTF8 + if ((isspace (c1) == 0) != (isspace (c2) == 0)) ++#else ++ if ((iswspace (c1) == 0) != (iswspace (c2) == 0)) ++#endif /* UTF8 */ + break; + if (!(my_type_of (c1) & my_type_of (c2))) + break; +@@ -1772,13 +1935,13 @@ static void edit_left_delete_word (WEdit * edit) + 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: +@@ -1799,31 +1962,33 @@ edit_do_undo (WEdit * edit) + 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:; +@@ -2103,7 +2268,7 @@ static void edit_goto_matching_bracket (WEdit *edit) + * passed as -1. Commands are executed, and char_for_insertion is + * inserted at the cursor. + */ +-void edit_execute_key_command (WEdit *edit, int command, int char_for_insertion) ++void edit_execute_key_command (WEdit *edit, int command, mc_wint_t char_for_insertion) + { + if (command == CK_Begin_Record_Macro) { + edit->macro_i = 0; +@@ -2138,7 +2303,7 @@ static const char * const shell_cmd[] = SHELL_COMMANDS_i; + all of them. It also does not check for the Undo command. + */ + void +-edit_execute_cmd (WEdit *edit, int command, int char_for_insertion) ++edit_execute_cmd (WEdit *edit, int command, mc_wint_t char_for_insertion) + { + edit->force |= REDRAW_LINE; + +@@ -2171,7 +2336,7 @@ edit_execute_cmd (WEdit *edit, int command, int char_for_insertion) + } + + /* An ordinary key press */ +- if (char_for_insertion >= 0) { ++ if (char_for_insertion != (mc_wint_t) -1) { + if (edit->overwrite) { + if (edit_get_byte (edit, edit->curs1) != '\n') + edit_delete (edit); +diff --git a/edit/edit.h b/edit/edit.h +index 4a1c39b..672bf3d 100644 +--- a/edit/edit.h ++++ b/edit/edit.h +@@ -25,6 +25,27 @@ + + #include + ++#include "src/tty.h" ++ ++#ifdef UTF8 ++#include ++#include ++ ++#define mc_wchar_t wchar_t ++#define mc_wint_t wint_t ++ ++#else ++ ++#define mc_wchar_t unsigned char ++#define mc_wint_t int ++ ++#endif ++ ++ ++/* unicode private use area */ ++#define BINARY_CHAR_OFFSET 0xFFE00 ++ ++ + #define N_menus 5 + + #define SEARCH_DIALOG_OPTION_NO_SCANF (1 << 0) +@@ -86,6 +107,8 @@ + #define START_STACK_SIZE 32 + + /* 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 +@@ -105,7 +128,7 @@ + + struct macro { + short command; +- short ch; ++ mc_wchar_t ch; + }; + + struct WEdit; +@@ -120,8 +143,12 @@ void edit_reload_menu (void); + void menu_save_mode_cmd (void); + int edit_raw_key_query (const char *heading, const char *query, int cancel); + int edit_file (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, mc_wint_t *ch); ++#ifndef UTF8 + int edit_get_byte (WEdit * edit, long byte_index); ++#else /* UTF8 */ ++mc_wchar_t edit_get_byte (WEdit * edit, long byte_index); ++#endif /* UTF8 */ + int edit_count_lines (WEdit * edit, long current, int upto); + long edit_move_forward (WEdit * edit, long current, int lines, long upto); + long edit_move_forward3 (WEdit * edit, long current, int cols, long upto); +@@ -148,11 +175,11 @@ int edit_block_delete_cmd (WEdit * edit); + void edit_delete_line (WEdit * edit); + + int edit_delete (WEdit * edit); +-void edit_insert (WEdit * edit, int c); ++void edit_insert (WEdit * edit, mc_wchar_t c); + void 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, mc_wchar_t c); + long edit_write_stream (WEdit * edit, FILE * f); + char *edit_get_write_filter (const char *writename, const char *filename); + int edit_save_confirm_cmd (WEdit * edit); +@@ -183,7 +210,7 @@ void edit_goto_cmd (WEdit * edit); + int eval_marks (WEdit * edit, long *start_mark, long *end_mark); + void edit_status (WEdit * edit); + void edit_execute_key_command (WEdit *edit, int command, +- int char_for_insertion); ++ mc_wint_t char_for_insertion); + void edit_update_screen (WEdit * edit); + int edit_print_string (WEdit * e, const char *s); + void edit_move_to_line (WEdit * e, long line); +@@ -233,7 +260,7 @@ void edit_mail_dialog (WEdit *edit); + void format_paragraph (WEdit *edit, int force); + + /* either command or char_for_insertion must be passed as -1 */ +-void edit_execute_cmd (WEdit *edit, int command, int char_for_insertion); ++void edit_execute_cmd (WEdit *edit, int command, mc_wint_t char_for_insertion); + + #define get_sys_error(s) (s) + +diff --git a/edit/editcmd.c b/edit/editcmd.c +index d223c35..b85d9cd 100644 +--- a/edit/editcmd.c ++++ b/edit/editcmd.c +@@ -60,7 +60,7 @@ + #include "../src/selcodepage.h" struct selection { - unsigned char * text; @@ -36,7 +882,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c int len; }; -@@ -84,12 +84,16 @@ int edit_confirm_save = 1; +@@ -83,21 +83,16 @@ int edit_confirm_save = 1; #define MAX_REPL_LEN 1024 static int edit_save_cmd (WEdit *edit); @@ -49,13 +895,22 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c { +#ifndef UTF8 return tolower(c & 0xFF); +-} +- +-static const char * +-strcasechr (const char *s, int c) +-{ +- for (c = my_lower_case (c); my_lower_case ((int) *s) != c; ++s) +- if (*s == '\0') +- return 0; +- return s; +#else + return towlower(c); -+#endif ++#endif } - static const char * -@@ -124,11 +128,11 @@ static void *memmove (void *dest, const + #ifndef HAVE_MEMMOVE +@@ -123,11 +118,11 @@ static void *memmove (void *dest, const void *src, size_t n) #endif /* !HAVE_MEMMOVE */ /* #define itoa MY_itoa <---- this line is now in edit.h */ @@ -70,7 +925,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c int j = i; *s-- = 0; do { -@@ -213,6 +217,48 @@ void edit_refresh_cmd (WEdit * edit) +@@ -212,6 +207,48 @@ void edit_refresh_cmd (WEdit * edit) doupdate(); } @@ -94,7 +949,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c + outlen = 0; + } + memset (&mbs, 0, sizeof (mbs)); -+#ifdef __STDC_ISO_10646__ ++#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); @@ -119,7 +974,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c /* If 0 (quick save) then a) create/truncate file, b) save to ; if 1 (safe save) then a) save to , -@@ -360,32 +406,48 @@ edit_save_file (WEdit *edit, const char +@@ -359,32 +396,48 @@ edit_save_file (WEdit *edit, const char *filename) buf = 0; filelen = edit->last_byte; while (buf <= (edit->curs1 >> S_EDIT_BUF_SIZE) - 1) { @@ -171,7 +1026,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c EDIT_BUF_SIZE) != EDIT_BUF_SIZE) { filelen = -1; break; -@@ -705,13 +767,21 @@ edit_delete_macro (WEdit * edit, int k) +@@ -705,13 +758,21 @@ edit_delete_macro (WEdit * edit, int k) if (!n || n == EOF) break; n = 0; @@ -193,7 +1048,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c fprintf (g, ";\n"); } } -@@ -744,7 +814,11 @@ int edit_save_macro_cmd (WEdit * edit, s +@@ -744,7 +805,11 @@ int edit_save_macro_cmd (WEdit * edit, struct macro macro[], int n) if (f) { fprintf (f, ("key '%d 0': "), s); for (i = 0; i < n; i++) @@ -205,7 +1060,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c fprintf (f, ";\n"); fclose (f); if (saved_macros_loaded) { -@@ -794,10 +868,18 @@ int edit_load_macro_cmd (WEdit * edit, s +@@ -794,10 +859,18 @@ int edit_load_macro_cmd (WEdit * edit, struct macro macro[], int *n, int k) saved_macro[i++] = s; if (!found) { *n = 0; @@ -224,7 +1079,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c } fscanf (f, ";\n"); if (s == k) -@@ -944,7 +1026,7 @@ int eval_marks (WEdit * edit, long *star +@@ -945,7 +1018,7 @@ int eval_marks (WEdit * edit, long *start_mark, long *end_mark) #define space_width 1 static void @@ -233,7 +1088,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c { long cursor; int i, col; -@@ -992,7 +1074,7 @@ edit_block_copy_cmd (WEdit *edit) +@@ -993,7 +1066,7 @@ edit_block_copy_cmd (WEdit *edit) { long start_mark, end_mark, current = edit->curs1; int size; @@ -242,7 +1097,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c edit_update_curs_col (edit); if (eval_marks (edit, &start_mark, &end_mark)) -@@ -1032,7 +1114,7 @@ edit_block_move_cmd (WEdit *edit) +@@ -1033,7 +1106,7 @@ edit_block_move_cmd (WEdit *edit) { long count; long current; @@ -251,7 +1106,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c long start_mark, end_mark; int deleted = 0; int x = 0; -@@ -1093,7 +1175,7 @@ edit_block_move_cmd (WEdit *edit) +@@ -1094,7 +1167,7 @@ edit_block_move_cmd (WEdit *edit) edit_push_action (edit, COLUMN_ON); column_highlighting = 0; } else { @@ -260,7 +1115,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c edit_cursor_move (edit, start_mark - edit->curs1); edit_scroll_screen_over_cursor (edit); count = start_mark; -@@ -1432,7 +1514,11 @@ static long sargs[NUM_REPL_ARGS][256 / s +@@ -1433,7 +1506,11 @@ static long sargs[NUM_REPL_ARGS][256 / sizeof (long)]; /* 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 @@ -272,7 +1127,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c int match_bol, int icase, int *found_len, void *d) { static regex_t r; -@@ -1441,6 +1527,11 @@ string_regexp_search (char *pattern, cha +@@ -1442,6 +1519,11 @@ string_regexp_search (char *pattern, char *string, int match_type, regmatch_t *pmatch; static regmatch_t s[1]; @@ -284,7 +1139,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c pmatch = (regmatch_t *) d; if (!pmatch) pmatch = s; -@@ -1460,13 +1551,51 @@ string_regexp_search (char *pattern, cha +@@ -1462,13 +1544,51 @@ string_regexp_search (char *pattern, char *string, int match_type, old_type = match_type; old_icase = icase; } @@ -319,7 +1174,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c + string[pmatch[i].rm_so] = 0; + new_o = mbstrlen(string); + string[pmatch[i].rm_so] = tmp; -+ pmatch[i].rm_so = new_o; ++ pmatch[i].rm_so = new_o; + + if (pmatch[i].rm_eo < 0) + continue; @@ -327,7 +1182,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c + string[pmatch[i].rm_eo] = 0; + new_o = mbstrlen(string); + string[pmatch[i].rm_eo] = tmp; -+ pmatch[i].rm_eo = new_o; ++ pmatch[i].rm_eo = new_o; + } + + g_free(string); @@ -336,7 +1191,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c *found_len = pmatch[0].rm_eo - pmatch[0].rm_so; return (pmatch[0].rm_so); } -@@ -1474,13 +1603,29 @@ string_regexp_search (char *pattern, cha +@@ -1476,13 +1596,29 @@ string_regexp_search (char *pattern, char *string, int match_type, /* thanks to Liviu Daia for getting this (and the above) routines to work properly - paul */ @@ -367,7 +1222,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c int n = 0; for (p = 0; p < l; p++) /* count conversions... */ -@@ -1489,19 +1634,22 @@ edit_find_string (long start, unsigned c +@@ -1491,19 +1627,22 @@ edit_find_string (long start, unsigned char *exp, int *len, long last_byte, edit n++; if (replace_scanf || replace_regexp) { @@ -397,7 +1252,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c if (replace_case) { for (p = start; p < last_byte && p < start + MAX_REPL_LEN; p++) buf[p - start] = (*get_byte) (data, p); -@@ -1515,20 +1663,36 @@ edit_find_string (long start, unsigned c +@@ -1517,20 +1656,36 @@ edit_find_string (long start, unsigned char *exp, int *len, long last_byte, edit } buf[(q = p - start)] = 0; @@ -435,7 +1290,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c if (q + start < last_byte) { if (replace_case) { buf[q] = (*get_byte) (data, q + start); -@@ -1542,7 +1706,11 @@ edit_find_string (long start, unsigned c +@@ -1544,7 +1699,11 @@ edit_find_string (long start, unsigned char *exp, int *len, long last_byte, edit start++; buf++; /* move the window along */ if (buf == mbuf + MAX_REPL_LEN) { /* the window is about to go past the end of array, so... */ @@ -447,7 +1302,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c buf = mbuf; } q--; -@@ -1569,10 +1737,16 @@ edit_find_string (long start, unsigned c +@@ -1571,10 +1730,16 @@ edit_find_string (long start, unsigned char *exp, int *len, long last_byte, edit buf = mbuf; while (q) { @@ -465,7 +1320,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c return -3; } else if (found_start == -1) /* not found: try next line */ -@@ -1583,15 +1757,27 @@ edit_find_string (long start, unsigned c +@@ -1585,15 +1750,27 @@ edit_find_string (long start, unsigned char *exp, int *len, long last_byte, edit match_bol = 0; continue; } @@ -495,7 +1350,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c memmove (mbuf, buf, q); p = start + q; move_win = 1; -@@ -1601,36 +1787,59 @@ edit_find_string (long start, unsigned c +@@ -1603,36 +1780,59 @@ edit_find_string (long start, unsigned char *exp, int *len, long last_byte, edit } } } else { @@ -563,7 +1418,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c return -2; } -@@ -1644,9 +1853,14 @@ edit_find_forwards (long search_start, u +@@ -1646,9 +1846,14 @@ edit_find_forwards (long search_start, unsigned char *exp, int *len, long last_b while ((p = edit_find_string (p, exp, len, last_byte, get_byte, data, once_only, d)) >= 0) { if (replace_whole) { @@ -578,7 +1433,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c return p; if (once_only) return -2; -@@ -1678,6 +1892,7 @@ edit_find (long search_start, unsigned c +@@ -1680,6 +1885,7 @@ edit_find (long search_start, unsigned char *exp, int *len, long last_byte, edit #define is_digit(x) ((x) >= '0' && (x) <= '9') @@ -586,7 +1441,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c #define snprint(v) { \ *p1++ = *p++; \ *p1 = '\0'; \ -@@ -1685,33 +1900,48 @@ edit_find (long search_start, unsigned c +@@ -1687,33 +1893,48 @@ edit_find (long search_start, unsigned char *exp, int *len, long last_byte, edit if (n >= (size_t) (e - s)) goto nospc; \ s += n; \ } @@ -643,7 +1498,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c s += n; q = p; p1 = q1; -@@ -1739,45 +1969,78 @@ static int snprintf_p (char *str, size_t +@@ -1741,45 +1962,78 @@ static int snprintf_p (char *str, size_t size, const char *fmt,...) *p1++ = *p++; if (*p == '*') { p++; @@ -663,9 +1518,8 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c +#endif /* UTF8 */ + && p1 < q1 + 20) *p1++ = *p++; -- if (is_digit (*p)) +#ifndef UTF8 -+ if (is_digit (*p)) + if (is_digit (*p)) +#else /* UTF8 */ + if (iswdigit (*p)) +#endif /* UTF8 */ @@ -691,9 +1545,8 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c +#endif /* UTF8 */ + && p1 < q1 + 32) *p1++ = *p++; -- if (is_digit (*p)) +#ifndef UTF8 -+ if (is_digit (*p)) + if (is_digit (*p)) +#else /* UTF8 */ + if (iswdigit (*p)) +#endif /* UTF8 */ @@ -732,7 +1585,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c snprint (*va_arg (ap, long *)); } else if (*p == 'p') { snprint (*va_arg (ap, void **)); -@@ -1786,10 +2049,17 @@ static int snprintf_p (char *str, size_t +@@ -1788,10 +2042,17 @@ static int snprintf_p (char *str, size_t size, const char *fmt,...) q = p; } va_end (ap); @@ -750,7 +1603,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c return s + n - str; nospc: va_end (ap); -@@ -1968,8 +2238,11 @@ edit_replace_cmd (WEdit *edit, int again +@@ -1970,8 +2231,11 @@ edit_replace_cmd (WEdit *edit, int again) } } if (replace_yes) { /* delete then insert new */ @@ -763,7 +1616,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c int ret = 0; /* we need to fill in sargs just like with scanf */ -@@ -1978,17 +2251,25 @@ edit_replace_cmd (WEdit *edit, int again +@@ -1980,17 +2244,25 @@ edit_replace_cmd (WEdit *edit, int again) for (k = 1; k < NUM_REPL_ARGS && pmatch[k].rm_eo >= 0; k++) { @@ -790,7 +1643,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c edit-> search_start - -@@ -2006,14 +2287,23 @@ edit_replace_cmd (WEdit *edit, int again +@@ -2008,14 +2280,23 @@ edit_replace_cmd (WEdit *edit, int again) } if (!ret) ret = @@ -814,7 +1667,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c } else { edit_error_dialog (_(" Replace "), ret == -@@ -2027,10 +2317,18 @@ edit_replace_cmd (WEdit *edit, int again +@@ -2029,10 +2310,18 @@ edit_replace_cmd (WEdit *edit, int again) times_replaced++; while (i--) edit_delete (edit); @@ -833,7 +1686,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c } /* so that we don't find the same string again */ if (replace_backwards) { -@@ -2203,16 +2501,17 @@ edit_ok_to_exit (WEdit *edit) +@@ -2205,16 +2494,17 @@ edit_ok_to_exit (WEdit *edit) #define TEMP_BUF_LEN 1024 /* Return a null terminated length of text. Result must be g_free'd */ @@ -855,7 +1708,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c x = edit_move_forward3 (edit, edit_bol (edit, start), 0, start); c = edit_get_byte (edit, start); -@@ -2245,11 +2544,15 @@ edit_save_block (WEdit * edit, const cha +@@ -2247,11 +2537,15 @@ edit_save_block (WEdit * edit, const char *filename, long start, return 0; if (column_highlighting) { @@ -872,7 +1725,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c if (r < 0) break; p += r; -@@ -2257,15 +2560,19 @@ edit_save_block (WEdit * edit, const cha +@@ -2259,15 +2553,19 @@ edit_save_block (WEdit * edit, const char *filename, long start, } g_free (block); } else { @@ -894,7 +1747,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c start = end; } g_free (buf); -@@ -2603,17 +2910,20 @@ edit_block_process_cmd (WEdit *edit, con +@@ -2609,17 +2907,20 @@ edit_block_process_cmd (WEdit *edit, const char *shell_cmd, int block) /* prints at the cursor */ /* returns the number of chars printed */ @@ -917,7 +1770,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c static void pipe_mail (WEdit *edit, char *to, char *subject, char *cc) { FILE *p = 0; -@@ -2707,15 +3017,20 @@ void edit_mail_dialog (WEdit * edit) +@@ -2713,15 +3014,20 @@ void edit_mail_dialog (WEdit * edit) /* find first character of current word */ static int edit_find_word_start (WEdit *edit, long *word_start, int *word_len) { @@ -940,7 +1793,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c return 0; /* search start of word to be completed */ -@@ -2725,11 +3040,19 @@ static int edit_find_word_start (WEdit * +@@ -2731,11 +3037,19 @@ static int edit_find_word_start (WEdit *edit, long *word_start, int *word_len) return 0; last = c; @@ -961,7 +1814,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c return 0; *word_start = edit->curs1 - (i - 1); /* start found */ -@@ -2762,7 +3085,7 @@ edit_collect_completions (WEdit *edit, l +@@ -2768,7 +3082,7 @@ edit_collect_completions (WEdit *edit, long start, int word_len, int *num) { int len, max_len = 0, i, skip; @@ -970,7 +1823,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c /* collect max MAX_WORD_COMPLETIONS completions */ while (*num < MAX_WORD_COMPLETIONS) { -@@ -2781,11 +3104,16 @@ edit_collect_completions (WEdit *edit, l +@@ -2787,11 +3101,16 @@ edit_collect_completions (WEdit *edit, long start, int word_len, buffers1[start >> S_EDIT_BUF_SIZE][start & M_EDIT_BUF_SIZE]; skip = 0; for (i = 0; i < *num; i++) { @@ -990,7 +1843,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c skip = 1; break; /* skip it, already added */ } -@@ -2793,7 +3121,7 @@ edit_collect_completions (WEdit *edit, l +@@ -2799,7 +3118,7 @@ edit_collect_completions (WEdit *edit, long start, int word_len, if (skip) continue; @@ -999,7 +1852,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c compl[*num].len = len; for (i = 0; i < len; i++) compl[*num].text[i] = *(bufpos + i); -@@ -2807,6 +3135,18 @@ edit_collect_completions (WEdit *edit, l +@@ -2813,6 +3132,18 @@ edit_collect_completions (WEdit *edit, long start, int word_len, return max_len; } @@ -1018,7 +1871,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c /* let the user select its preferred completion */ static void -@@ -2819,6 +3159,9 @@ edit_completion_dialog (WEdit * edit, in +@@ -2825,6 +3156,9 @@ edit_completion_dialog (WEdit * edit, int max_len, int word_len, WListbox *compl_list; int compl_dlg_h; /* completion dialog height */ int compl_dlg_w; /* completion dialog width */ @@ -1028,7 +1881,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c /* calculate the dialog metrics */ compl_dlg_h = num_compl + 2; -@@ -2854,9 +3197,18 @@ edit_completion_dialog (WEdit * edit, in +@@ -2860,9 +3194,18 @@ edit_completion_dialog (WEdit * edit, int max_len, int word_len, add_widget (compl_dlg, compl_list); /* fill the listbox with the completions */ @@ -1047,7 +1900,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c /* pop up the dialog */ run_dlg (compl_dlg); -@@ -2864,9 +3216,17 @@ edit_completion_dialog (WEdit * edit, in +@@ -2870,9 +3213,17 @@ edit_completion_dialog (WEdit * edit, int max_len, int word_len, /* apply the choosen completion */ if (compl_dlg->ret_value == B_ENTER) { listbox_get_current (compl_list, &curr, NULL); @@ -1066,7 +1919,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c } /* destroy dialog before return */ -@@ -2883,8 +3243,9 @@ edit_complete_word_cmd (WEdit *edit) +@@ -2889,8 +3240,9 @@ edit_complete_word_cmd (WEdit *edit) { int word_len = 0, i, num_compl = 0, max_len; long word_start = 0; @@ -1078,7 +1931,7 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c struct selection compl[MAX_WORD_COMPLETIONS]; /* completions */ /* don't want to disturb another search */ -@@ -2901,16 +3262,32 @@ edit_complete_word_cmd (WEdit *edit) +@@ -2907,16 +3259,32 @@ edit_complete_word_cmd (WEdit *edit) /* prepare match expression */ bufpos = &edit->buffers1[word_start >> S_EDIT_BUF_SIZE] [word_start & M_EDIT_BUF_SIZE]; @@ -1111,734 +1964,50 @@ diff -up mc-4.6.2-pre1/edit/editcmd.c.utf8 mc-4.6.2-pre1/edit/editcmd.c if (num_compl > 0) { /* insert completed word if there is only one match */ -diff -up mc-4.6.2-pre1/edit/edit.c.utf8 mc-4.6.2-pre1/edit/edit.c ---- mc-4.6.2-pre1/edit/edit.c.utf8 2007-01-04 16:37:23.000000000 +0100 -+++ mc-4.6.2-pre1/edit/edit.c 2008-12-04 13:25:34.000000000 +0100 -@@ -102,7 +102,11 @@ char *option_backup_ext = NULL; - - static void user_menu (WEdit *edit); - -+#ifndef UTF8 - int edit_get_byte (WEdit * edit, long byte_index) -+#else -+mc_wchar_t edit_get_byte (WEdit * edit, long byte_index) -+#endif +@@ -2951,7 +3319,7 @@ void + edit_select_codepage_cmd (WEdit *edit) { - unsigned long p; - if (byte_index >= (edit->curs1 + edit->curs2) || byte_index < 0) -@@ -131,7 +135,7 @@ edit_init_buffers (WEdit *edit) - - edit->curs1 = 0; - edit->curs2 = 0; -- edit->buffers2[0] = g_malloc (EDIT_BUF_SIZE); -+ edit->buffers2[0] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t)); - } - - /* -@@ -156,7 +160,7 @@ edit_load_file_fast (WEdit *edit, const - } - - if (!edit->buffers2[buf2]) -- edit->buffers2[buf2] = g_malloc (EDIT_BUF_SIZE); -+ edit->buffers2[buf2] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t)); - - mc_read (file, - (char *) edit->buffers2[buf2] + EDIT_BUF_SIZE - -@@ -166,7 +170,7 @@ edit_load_file_fast (WEdit *edit, const - 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(mc_wchar_t)); - mc_read (file, (char *) edit->buffers2[buf], EDIT_BUF_SIZE); - } - -@@ -239,9 +243,44 @@ edit_insert_stream (WEdit * edit, FILE * - { - int c; - long i = 0; -- while ((c = fgetc (f)) >= 0) { -+#ifndef UTF8 -+ while ((c = fgetc (f)) != EOF) { - edit_insert (edit, c); - i++; -+#else /* UTF8 */ -+ unsigned char buf[MB_LEN_MAX]; -+ int charpos = 0; -+ mbstate_t mbs; -+ -+ while ((c = fgetc (f)) != EOF) { -+ mc_wchar_t wc; -+ int size; -+ int j; -+ -+ buf[charpos++] = c; -+ -+ memset (&mbs, 0, sizeof (mbs)); -+ size = mbrtowc(&wc, (char *)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; jlast_byte; i++) - if (fputc (edit_get_byte (edit, i), f) < 0) - break; -+#else /* UTF8 */ -+ for (i = 0; i < edit->last_byte; i++) { -+ mc_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; -+ } -+ } -+#endif /* UTF8 */ - return i; - } - -@@ -290,12 +352,46 @@ edit_insert_file (WEdit *edit, const cha - int i, file, blocklen; - long current = edit->curs1; - unsigned char *buf; -+#ifdef UTF8 -+ mbstate_t mbs; -+ int bufstart = 0; -+ -+ memset (&mbs, 0, sizeof (mbs)); -+#endif /* UTF8 */ - if ((file = mc_open (filename, O_RDONLY | O_BINARY)) == -1) - return 0; - buf = g_malloc (TEMP_BUF_LEN); -+#ifndef UTF8 - while ((blocklen = mc_read (file, (char *) buf, TEMP_BUF_LEN)) > 0) { - for (i = 0; i < blocklen; i++) - edit_insert (edit, buf[i]); -+#else /* UTF8 */ -+ while ((blocklen = mc_read (file, (char *) buf + bufstart, TEMP_BUF_LEN - bufstart)) > 0) { -+ blocklen += bufstart; -+ bufstart = 0; -+ for (i = 0; i < blocklen; ) { -+ mc_wchar_t wc; -+ int j; -+ int size = mbrtowc(&wc, (char *)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 + (mc_wchar_t)buf[i]); -+#endif -+ memset (&mbs, 0, sizeof (mbs)); -+ i++; /* skip broken char */ -+ } -+ else { -+ edit_insert (edit, wc); -+ i+=size; -+ } -+ } -+#endif /* UTF8 */ - } - edit_cursor_move (edit, current - edit->curs1); - g_free (buf); -@@ -385,7 +481,11 @@ cleanup: - static int - edit_load_file (WEdit *edit) - { -+#ifndef UTF8 - int fast_load = 1; -+#else /* UTF8 */ -+ int fast_load = 0; /* can't be used with multibyte characters */ -+#endif /* UTF8 */ - - /* Cannot do fast load if a filter is used */ - if (edit_find_filter (edit->filename) >= 0) -@@ -451,6 +551,7 @@ edit_load_position (WEdit *edit) - edit->prev_col = column; - edit_move_to_prev_col (edit, edit_bol (edit, edit->curs1)); - edit_move_display (edit, line - (edit->num_widget_lines / 2)); -+ edit->charpoint = 0; - } - - /* Save cursor position in the file */ -@@ -534,7 +635,7 @@ edit_init (WEdit *edit, int lines, int c - 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) -@@ -689,14 +790,23 @@ void edit_push_action (WEdit * edit, lon - { - unsigned long sp = edit->stack_pointer; - unsigned long spm1; -- long *t; -+ -+ struct action *t; -+ mc_wchar_t ch = 0; -+ -+ if (c == CHAR_INSERT || c == CHAR_INSERT_AHEAD) { -+ va_list ap; -+ va_start (ap, c); -+ ch = va_arg (ap, mc_wint_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 < (unsigned long) 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 +821,7 @@ void edit_push_action (WEdit * edit, lon - #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 +832,14 @@ void edit_push_action (WEdit * edit, lon - && 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) { -+ mc_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 +847,20 @@ void edit_push_action (WEdit * edit, lon - #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; - } + #ifdef HAVE_CHARSET +- do_select_codepage (); ++ do_select_codepage (_(" Choose codepage ")); + edit->force = REDRAW_COMPLETELY; + edit_refresh_cmd (edit); #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 +872,9 @@ void edit_push_action (WEdit * edit, lon - #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; -@@ -772,10 +887,10 @@ void edit_push_action (WEdit * edit, lon - (((unsigned long) 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; - } - -@@ -784,30 +899,30 @@ void edit_push_action (WEdit * edit, lon - 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) { --/* edit->undo_stack[sp] = '@'; */ -+ *c = edit->undo_stack[sp]; -+ if (edit->undo_stack[sp].flags >= 0) { - 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) { --/* edit->undo_stack[sp] = '@'; */ -+ *c = edit->undo_stack[(sp - 1) & edit->stack_size_mask]; -+ -+ if (edit->undo_stack[sp].flags == -2) { - 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 */ -@@ -828,7 +943,7 @@ static inline void edit_modification (WE - */ - - void --edit_insert (WEdit *edit, int c) -+edit_insert (WEdit *edit, mc_wchar_t c) - { - /* check if file has grown to large */ - if (edit->last_byte >= SIZE_LIMIT) -@@ -866,12 +981,11 @@ edit_insert (WEdit *edit, int c) - /* 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(mc_wchar_t)); - - /* perform the insertion */ -- edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE][edit-> -- curs1 & M_EDIT_BUF_SIZE] -- = (unsigned char) c; -+ edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] -+ [edit->curs1 & M_EDIT_BUF_SIZE] = c; - - /* update file length */ - edit->last_byte++; -@@ -882,7 +996,7 @@ edit_insert (WEdit *edit, int c) - - - /* same as edit_insert and move left */ --void edit_insert_ahead (WEdit * edit, int c) -+void edit_insert_ahead (WEdit * edit, mc_wchar_t c) - { - if (edit->last_byte >= SIZE_LIMIT) - return; -@@ -905,7 +1019,7 @@ void edit_insert_ahead (WEdit * edit, in - 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(mc_wchar_t)); - edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE - (edit->curs2 & M_EDIT_BUF_SIZE) - 1] = c; - - edit->last_byte++; -@@ -915,7 +1029,7 @@ void edit_insert_ahead (WEdit * edit, in - - int edit_delete (WEdit * edit) - { -- int p; -+ mc_wint_t p; - if (!edit->curs2) - return 0; - -@@ -939,7 +1053,7 @@ int edit_delete (WEdit * edit) - 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') -@@ -953,7 +1067,7 @@ int edit_delete (WEdit * edit) - static int - edit_backspace (WEdit * edit) - { -- int p; -+ mc_wint_t p; - if (!edit->curs1) - return 0; - -@@ -977,7 +1091,7 @@ edit_backspace (WEdit * edit) - 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--; -@@ -990,10 +1104,18 @@ edit_backspace (WEdit * edit) - - #ifdef FAST_MOVE_CURSOR - --static void memqcpy (WEdit * edit, unsigned char *dest, unsigned char *src, int n) -+static void memqcpy (WEdit * edit, mc_wchar_t *dest, mc_wchar_t *src, int n) - { - unsigned long next; -+#ifndef UTF8 - while ((next = (unsigned long) memccpy (dest, src, '\n', n))) { -+#else /* UTF8 */ -+ while (n) { -+ next = 0; -+ while (next < n && src[next]!='\n') next++; -+ if (next < n) next++; -+ wmemcpy (dest, src, next) -+#endif /* UTF8 */ - edit->curs_line--; - next -= (unsigned long) dest; - n -= next; -@@ -1006,7 +1128,7 @@ int - edit_move_backward_lots (WEdit *edit, long increment) - { - int r, s, t; -- unsigned char *p; -+ mc_wchar_t *p; - - if (increment > edit->curs1) - increment = edit->curs1; -@@ -1046,7 +1168,7 @@ edit_move_backward_lots (WEdit *edit, lo - 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(mc_wchar_t)); - } else { - g_free (p); - } -@@ -1084,7 +1206,7 @@ edit_move_backward_lots (WEdit *edit, lo - 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(mc_wchar_t)); - } else { - g_free (p); - } -@@ -1116,7 +1238,7 @@ int edit_cursor_move (WEdit * edit, long - - 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(mc_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]; -@@ -1141,7 +1263,7 @@ int edit_cursor_move (WEdit * edit, long - - 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(mc_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]; -@@ -1248,7 +1370,7 @@ long edit_move_forward3 (WEdit * edit, l - q = edit->last_byte + 2; - - for (col = 0, p = current; p < q; p++) { -- int c; -+ mc_wchar_t c; - if (cols != -10) { - if (col == cols) - return p; -@@ -1266,7 +1388,7 @@ long edit_move_forward3 (WEdit * edit, l - } else if (c < 32 || c == 127) - col += 2; /* Caret notation for control characters */ - else -- col++; -+ col += wcwidth(c); - } - return col; - } -@@ -1399,12 +1521,16 @@ static int - is_blank (WEdit *edit, long offset) - { - long s, f; -- int c; -+ mc_wchar_t c; - s = edit_bol (edit, offset); - f = edit_eol (edit, offset) - 1; - while (s <= f) { - c = edit_get_byte (edit, s++); -+#ifndef UTF8 - if (!isspace (c)) -+#else -+ if (!iswspace (c)) -+#endif /* UTF8 */ - return 0; - } - return 1; -@@ -1659,6 +1785,7 @@ my_type_of (int c) - return 2; - return 0x80000000UL; - } -+#ifndef UTF8 - if (isupper (c)) - c = 'A'; - else if (islower (c)) -@@ -1669,6 +1796,18 @@ my_type_of (int c) - c = '0'; - else if (isspace (c)) - c = ' '; -+#else -+ if (iswupper (c)) -+ c = 'A'; -+ else if (iswlower (c)) -+ c = 'a'; -+ else if (iswalpha (c)) -+ c = 'a'; -+ else if (iswdigit (c)) -+ c = '0'; -+ else if (iswspace (c)) -+ c = ' '; -+#endif /* UTF8 */ - q = strchr (option_chars_move_whole_word, c); - if (!q) - return 0xFFFFFFFFUL; -@@ -1693,10 +1832,18 @@ edit_left_word_move (WEdit *edit, int s) - c2 = edit_get_byte (edit, edit->curs1); - if (!(my_type_of (c1) & my_type_of (c2))) - break; -+#ifndef UTF8 - if (isspace (c1) && !isspace (c2)) -+#else -+ if (iswspace (c1) && !iswspace (c2)) -+#endif /* UTF8 */ - break; - if (s) -+#ifndef UTF8 - if (!isspace (c1) && isspace (c2)) -+#else -+ if (!iswspace (c1) && iswspace (c2)) -+#endif /* UTF8 */ - break; - } - } -@@ -1719,10 +1866,18 @@ edit_right_word_move (WEdit *edit, int s - c2 = edit_get_byte (edit, edit->curs1); - if (!(my_type_of (c1) & my_type_of (c2))) - break; -+#ifndef UTF8 - if (isspace (c1) && !isspace (c2)) -+#else -+ if (iswspace (c1) && !iswspace (c2)) -+#endif /* UTF8 */ - break; - if (s) -+#ifndef UTF8 - if (!isspace (c1) && isspace (c2)) -+#else -+ if (!iswspace (c1) && iswspace (c2)) -+#endif /* UTF8 */ - break; - } - } -@@ -1742,7 +1897,11 @@ static void edit_right_delete_word (WEdi - break; - c1 = edit_delete (edit); - c2 = edit_get_byte (edit, edit->curs1); -+#ifndef UTF8 - if ((isspace (c1) == 0) != (isspace (c2) == 0)) -+#else -+ if ((iswspace (c1) == 0) != (iswspace (c2) == 0)) -+#endif /* UTF8 */ - break; - if (!(my_type_of (c1) & my_type_of (c2))) - break; -@@ -1757,7 +1916,11 @@ static void edit_left_delete_word (WEdit - break; - c1 = edit_backspace (edit); - c2 = edit_get_byte (edit, edit->curs1 - 1); -+#ifndef UTF8 - if ((isspace (c1) == 0) != (isspace (c2) == 0)) -+#else -+ if ((iswspace (c1) == 0) != (iswspace (c2) == 0)) -+#endif /* UTF8 */ - break; - if (!(my_type_of (c1) & my_type_of (c2))) - break; -@@ -1771,13 +1934,13 @@ static void edit_left_delete_word (WEdit - 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: -@@ -1798,31 +1961,33 @@ edit_do_undo (WEdit * edit) - 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:; -@@ -2102,7 +2267,7 @@ static void edit_goto_matching_bracket ( - * passed as -1. Commands are executed, and char_for_insertion is - * inserted at the cursor. - */ --void edit_execute_key_command (WEdit *edit, int command, int char_for_insertion) -+void edit_execute_key_command (WEdit *edit, int command, mc_wint_t char_for_insertion) - { - if (command == CK_Begin_Record_Macro) { - edit->macro_i = 0; -@@ -2137,7 +2302,7 @@ static const char * const shell_cmd[] = - all of them. It also does not check for the Undo command. - */ - void --edit_execute_cmd (WEdit *edit, int command, int char_for_insertion) -+edit_execute_cmd (WEdit *edit, int command, mc_wint_t char_for_insertion) - { - edit->force |= REDRAW_LINE; - -@@ -2170,7 +2335,7 @@ edit_execute_cmd (WEdit *edit, int comma - } - - /* An ordinary key press */ -- if (char_for_insertion >= 0) { -+ if (char_for_insertion != (mc_wint_t) -1) { - if (edit->overwrite) { - if (edit_get_byte (edit, edit->curs1) != '\n') - edit_delete (edit); -diff -up mc-4.6.2-pre1/edit/editdraw.c.utf8 mc-4.6.2-pre1/edit/editdraw.c ---- mc-4.6.2-pre1/edit/editdraw.c.utf8 2007-08-27 14:06:03.000000000 +0200 -+++ mc-4.6.2-pre1/edit/editdraw.c 2008-12-04 13:25:34.000000000 +0100 -@@ -70,11 +70,16 @@ static void status_string (WEdit * edit, +diff --git a/edit/editdraw.c b/edit/editdraw.c +index 86ea3f9..654f0b3 100644 +--- a/edit/editdraw.c ++++ b/edit/editdraw.c +@@ -71,11 +71,26 @@ static void status_string (WEdit * edit, char *s, int w) * as decimal and as hex. */ if (edit->curs1 < edit->last_byte) { - unsigned char cur_byte = edit_get_byte (edit, edit->curs1); + mc_wchar_t cur_byte = edit_get_byte (edit, edit->curs1); ++ mc_wchar_t cur_byte2 = cur_byte; +#ifndef UTF8 g_snprintf (byte_str, sizeof (byte_str), "%c %3d 0x%02X", is_printable (cur_byte) ? cur_byte : '.', - (int) cur_byte, - (unsigned) cur_byte); +#else /* UTF8 */ ++ /* In 8-bit locales show the byte itself instead of its Unicode value */ ++ if (MB_CUR_MAX == 1) { ++ unsigned char cur_8bit_byte; ++ mbstate_t mbs; ++ memset (&mbs, 0, sizeof (mbs)); ++ if (wcrtomb(&cur_8bit_byte, cur_byte, &mbs) == 1) { ++ cur_byte = cur_8bit_byte; ++ } ++ } + g_snprintf (byte_str, sizeof(byte_str), "%lc %3d 0x%02X", -+ iswprint(cur_byte) ? cur_byte : '.', ++ iswprint(cur_byte2) ? cur_byte2 : '.', +#endif /* UTF8 */ + (int) cur_byte, + (unsigned) cur_byte); } else { strcpy (byte_str, ""); } -@@ -206,11 +211,16 @@ void edit_scroll_screen_over_cursor (WEd +@@ -207,11 +222,16 @@ void edit_scroll_screen_over_cursor (WEdit * edit) #define lowlevel_set_color(x) attrset(MY_COLOR_PAIR(color)) #endif @@ -1857,7 +2026,7 @@ diff -up mc-4.6.2-pre1/edit/editdraw.c.utf8 mc-4.6.2-pre1/edit/editdraw.c int x = start_col_real + EDIT_TEXT_HORIZONTAL_OFFSET; int x1 = start_col + EDIT_TEXT_HORIZONTAL_OFFSET; -@@ -224,9 +234,9 @@ print_to_widget (WEdit *edit, long row, +@@ -225,9 +245,9 @@ print_to_widget (WEdit *edit, long row, int start_col, int start_col_real, edit_move (x1 + FONT_OFFSET_X, y + FONT_OFFSET_Y); p = line; @@ -1869,7 +2038,7 @@ diff -up mc-4.6.2-pre1/edit/editdraw.c.utf8 mc-4.6.2-pre1/edit/editdraw.c int color; if (cols_to_skip) { -@@ -235,9 +245,9 @@ print_to_widget (WEdit *edit, long row, +@@ -236,9 +256,9 @@ print_to_widget (WEdit *edit, long row, int start_col, int start_col_real, continue; } @@ -1882,7 +2051,7 @@ diff -up mc-4.6.2-pre1/edit/editdraw.c.utf8 mc-4.6.2-pre1/edit/editdraw.c if (style & MOD_ABNORMAL) { /* Non-printable - use black background */ -@@ -266,8 +276,11 @@ print_to_widget (WEdit *edit, long row, +@@ -267,8 +287,11 @@ print_to_widget (WEdit *edit, long row, int start_col, int start_col_real, lowlevel_set_color (color); } } @@ -1895,7 +2064,7 @@ diff -up mc-4.6.2-pre1/edit/editdraw.c.utf8 mc-4.6.2-pre1/edit/editdraw.c p++; } } -@@ -279,11 +292,11 @@ static void +@@ -280,11 +303,11 @@ static void edit_draw_this_line (WEdit *edit, long b, long row, long start_col, long end_col) { @@ -1903,14 +2072,14 @@ diff -up mc-4.6.2-pre1/edit/editdraw.c.utf8 mc-4.6.2-pre1/edit/editdraw.c - unsigned int *p = line; + struct line_s line[MAX_LINE_LEN]; + struct line_s *p = line; - long m1 = 0, m2 = 0, q, c1, c2, tws; + long m1 = 0, m2 = 0, q, c1, c2; int col, start_col_real; - unsigned int c; + mc_wint_t c; int color; int i; -@@ -307,62 +320,89 @@ edit_draw_this_line (WEdit *edit, long b +@@ -309,62 +332,88 @@ edit_draw_this_line (WEdit *edit, long b, long row, long start_col, } while (col <= end_col - edit->start_col) { @@ -1955,38 +2124,37 @@ diff -up mc-4.6.2-pre1/edit/editdraw.c.utf8 mc-4.6.2-pre1/edit/editdraw.c col += i; if (use_colors && visible_tabs) { - c = (*p & ~MOD_CURSOR) | MOD_WHITESPACE; -+// c = (p->style & ~MOD_CURSOR) | MOD_WHITESPACE; -+ c = 0; ++ c = (p->style & ~MOD_CURSOR) | MOD_WHITESPACE; if (i > 2) { - *(p++) |= '<' | MOD_WHITESPACE; - while (--i > 1) - *(p++) = c | '-'; - *(p++) = c | '>'; -+ p->ch |= '<'; -+ p->style = MOD_WHITESPACE; ++ p->ch = '<'; ++ p->style |= MOD_WHITESPACE; + p++; + while (--i > 1) { -+ p->ch = c | '-'; -+ p->style = MOD_WHITESPACE; ++ p->ch = '-'; ++ p->style = c; + p++; + } -+ p->ch = c | '>'; -+ p->style = MOD_WHITESPACE; ++ p->ch = '>'; ++ p->style = c; + p++; } else if (i > 1) { - *(p++) |= '<' | MOD_WHITESPACE; - *(p++) = c | '>'; - } else - *(p++) |= '>' | MOD_WHITESPACE; -+ p->ch |= '<'; -+ p->style = MOD_WHITESPACE; ++ p->ch = '<'; ++ p->style |= MOD_WHITESPACE; + p++; -+ p->ch = c | '>'; -+ p->style = MOD_WHITESPACE; ++ p->ch = '>'; ++ p->style = c; + p++; + } else { -+ p->ch |= '>'; -+ p->style = MOD_WHITESPACE; ++ p->ch = '>'; ++ p->style |= MOD_WHITESPACE; + p++; + } } else if (use_colors && visible_tws && q >= tws) { @@ -1994,12 +2162,13 @@ diff -up mc-4.6.2-pre1/edit/editdraw.c.utf8 mc-4.6.2-pre1/edit/editdraw.c - c = *(p++) & ~MOD_CURSOR; - while (--i) - *(p++) = c; -+ p->ch |= '.'; -+ p->style = MOD_WHITESPACE; ++ p->ch = '.'; ++ p->style |= MOD_WHITESPACE; + c = p->style & ~MOD_CURSOR; + p++; + while (--i) { -+ p->ch = c; ++ p->ch = '.'; ++ p->style = c; + p++; + } } else { @@ -2007,12 +2176,11 @@ diff -up mc-4.6.2-pre1/edit/editdraw.c.utf8 mc-4.6.2-pre1/edit/editdraw.c - c = *(p++) & ~MOD_CURSOR; - while (--i) - *(p++) = c; -+ p->ch |= ' '; -+ p->style = ' '; ++ p->ch = ' '; + c = p->style & ~MOD_CURSOR; + p++; + while (--i) { -+ p->ch = c; ++ p->ch = ' '; p->style = c; + p++; + } } @@ -2020,13 +2188,13 @@ diff -up mc-4.6.2-pre1/edit/editdraw.c.utf8 mc-4.6.2-pre1/edit/editdraw.c case ' ': if (use_colors && visible_tws && q >= tws) { - *(p++) |= '.' | MOD_WHITESPACE; -+ p->ch |= '.'; -+ p->style = MOD_WHITESPACE; ++ p->ch = '.'; ++ p->style |= MOD_WHITESPACE; + p++; col++; break; } -@@ -372,22 +412,47 @@ edit_draw_this_line (WEdit *edit, long b +@@ -374,22 +423,47 @@ edit_draw_this_line (WEdit *edit, long b, long row, long start_col, /* Caret notation for control characters */ if (c < 32) { @@ -2037,17 +2205,16 @@ diff -up mc-4.6.2-pre1/edit/editdraw.c.utf8 mc-4.6.2-pre1/edit/editdraw.c + p++; + p->ch = c + 0x40; + p->style = MOD_ABNORMAL; -+ p++; col += 2; break; } if (c == 127) { - *(p++) = '^' | MOD_ABNORMAL; - *(p++) = '?' | MOD_ABNORMAL; -+ p->ch = '^'; ++ p->ch = '^'; + p->style = MOD_ABNORMAL; + p++; -+ p->ch = '?'; ++ p->ch = '?'; + p->style = MOD_ABNORMAL; + p++; col += 2; @@ -2067,6 +2234,7 @@ diff -up mc-4.6.2-pre1/edit/editdraw.c.utf8 mc-4.6.2-pre1/edit/editdraw.c + ) { + p->ch = c; + p++; ++ +#ifdef UTF8 + i = wcwidth(c); + if (i > 1) { @@ -2075,13 +2243,13 @@ diff -up mc-4.6.2-pre1/edit/editdraw.c.utf8 mc-4.6.2-pre1/edit/editdraw.c +#endif /* UTF8 */ } else { - *(p++) = '.' | MOD_ABNORMAL; -+ p->ch = '.'; ++ p->ch = '.'; + p->style = MOD_ABNORMAL; + p++; } col++; break; -@@ -398,7 +463,7 @@ edit_draw_this_line (WEdit *edit, long b +@@ -400,7 +474,7 @@ edit_draw_this_line (WEdit *edit, long b, long row, long start_col, } else { start_col_real = start_col = 0; } @@ -2090,105 +2258,11 @@ diff -up mc-4.6.2-pre1/edit/editdraw.c.utf8 mc-4.6.2-pre1/edit/editdraw.c print_to_widget (edit, row, start_col, start_col_real, end_col, line); } -diff -up mc-4.6.2-pre1/edit/edit.h.utf8 mc-4.6.2-pre1/edit/edit.h ---- mc-4.6.2-pre1/edit/edit.h.utf8 2006-12-10 23:07:28.000000000 +0100 -+++ mc-4.6.2-pre1/edit/edit.h 2008-12-04 13:25:34.000000000 +0100 -@@ -25,6 +25,27 @@ - - #include - -+#include "src/tty.h" -+ -+#ifdef UTF8 -+#include -+#include -+ -+#define mc_wchar_t wchar_t -+#define mc_wint_t wint_t -+ -+#else -+ -+#define mc_wchar_t unsigned char -+#define mc_wint_t int -+ -+#endif -+ -+ -+/* unicode private use area */ -+#define BINARY_CHAR_OFFSET 0xFFE00 -+ -+ - #define N_menus 5 - - #define SEARCH_DIALOG_OPTION_NO_SCANF (1 << 0) -@@ -86,6 +107,8 @@ - #define START_STACK_SIZE 32 - - /* 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 -@@ -105,7 +128,7 @@ - - struct macro { - short command; -- short ch; -+ mc_wchar_t ch; - }; - - struct WEdit; -@@ -120,8 +143,12 @@ void edit_reload_menu (void); - void menu_save_mode_cmd (void); - int edit_raw_key_query (const char *heading, const char *query, int cancel); - int edit_file (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, mc_wint_t *ch); -+#ifndef UTF8 - int edit_get_byte (WEdit * edit, long byte_index); -+#else /* UTF8 */ -+mc_wchar_t edit_get_byte (WEdit * edit, long byte_index); -+#endif /* UTF8 */ - int edit_count_lines (WEdit * edit, long current, int upto); - long edit_move_forward (WEdit * edit, long current, int lines, long upto); - long edit_move_forward3 (WEdit * edit, long current, int cols, long upto); -@@ -148,11 +175,11 @@ int edit_block_delete_cmd (WEdit * edit) - void edit_delete_line (WEdit * edit); - - int edit_delete (WEdit * edit); --void edit_insert (WEdit * edit, int c); -+void edit_insert (WEdit * edit, mc_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, mc_wchar_t c); - long edit_write_stream (WEdit * edit, FILE * f); - char *edit_get_write_filter (const char *writename, const char *filename); - int edit_save_confirm_cmd (WEdit * edit); -@@ -183,7 +210,7 @@ void edit_goto_cmd (WEdit * edit); - int eval_marks (WEdit * edit, long *start_mark, long *end_mark); - void edit_status (WEdit * edit); - void edit_execute_key_command (WEdit *edit, int command, -- int char_for_insertion); -+ mc_wint_t char_for_insertion); - void edit_update_screen (WEdit * edit); - int edit_print_string (WEdit * e, const char *s); - void edit_move_to_line (WEdit * e, long line); -@@ -233,7 +260,7 @@ void edit_mail_dialog (WEdit *edit); - void format_paragraph (WEdit *edit, int force); - - /* either command or char_for_insertion must be passed as -1 */ --void edit_execute_cmd (WEdit *edit, int command, int char_for_insertion); -+void edit_execute_cmd (WEdit *edit, int command, mc_wint_t char_for_insertion); - - #define get_sys_error(s) (s) - -diff -up mc-4.6.2-pre1/edit/editkeys.c.utf8 mc-4.6.2-pre1/edit/editkeys.c ---- mc-4.6.2-pre1/edit/editkeys.c.utf8 2006-02-01 18:07:11.000000000 +0100 -+++ mc-4.6.2-pre1/edit/editkeys.c 2008-12-04 13:25:34.000000000 +0100 -@@ -182,10 +182,10 @@ static const edit_key_map_type common_ke +diff --git a/edit/editkeys.c b/edit/editkeys.c +index 2cc6add..111d377 100644 +--- a/edit/editkeys.c ++++ b/edit/editkeys.c +@@ -183,10 +183,10 @@ static const edit_key_map_type common_key_map[] = { * 'command' is one of the editor commands from editcmddef.h. */ int @@ -2201,16 +2275,15 @@ diff -up mc-4.6.2-pre1/edit/editkeys.c.utf8 mc-4.6.2-pre1/edit/editkeys.c int i = 0; int extmod = 0; const edit_key_map_type *key_map = NULL; -@@ -242,9 +242,30 @@ edit_translate_key (WEdit *edit, long x_ +@@ -243,9 +243,30 @@ edit_translate_key (WEdit *edit, long x_key, int *cmd, int *ch) /* an ordinary insertable character */ if (x_key < 256 && !extmod) { int c = convert_from_input_c (x_key); -- +#ifdef UTF8 + mbstate_t mbs; + int res; + mc_wchar_t wc; -+ + + memset (&mbs, 0, sizeof (mbs)); + + if (edit->charpoint >= MB_CUR_MAX) edit->charpoint = 0; @@ -2220,20 +2293,20 @@ diff -up mc-4.6.2-pre1/edit/editkeys.c.utf8 mc-4.6.2-pre1/edit/editkeys.c + res = mbrtowc(&wc, (char *)edit->charbuf, edit->charpoint, &mbs); + if (res < 0) { + if (res != -2) edit->charpoint = 0; /* broken multibyte char, skip */ -+ return 0; ++ return 0; + } + edit->charpoint = 0; + + if (iswprint (wc)) { + char_for_insertion = wc; -+#else ++#else if (is_printable (c)) { char_for_insertion = c; +#endif /* UTF8 */ goto fin; } } -@@ -283,7 +304,7 @@ edit_translate_key (WEdit *edit, long x_ +@@ -284,7 +305,7 @@ edit_translate_key (WEdit *edit, long x_key, int *cmd, int *ch) *cmd = command; *ch = char_for_insertion; @@ -2242,10 +2315,11 @@ diff -up mc-4.6.2-pre1/edit/editkeys.c.utf8 mc-4.6.2-pre1/edit/editkeys.c /* unchanged, key has no function here */ return 0; } -diff -up mc-4.6.2-pre1/edit/editwidget.c.utf8 mc-4.6.2-pre1/edit/editwidget.c ---- mc-4.6.2-pre1/edit/editwidget.c.utf8 2006-12-10 23:07:28.000000000 +0100 -+++ mc-4.6.2-pre1/edit/editwidget.c 2008-12-04 13:25:34.000000000 +0100 -@@ -331,7 +331,8 @@ edit_callback (Widget *w, widget_msg_t m +diff --git a/edit/editwidget.c b/edit/editwidget.c +index 8ae8cf0..286a844 100644 +--- a/edit/editwidget.c ++++ b/edit/editwidget.c +@@ -333,7 +333,8 @@ edit_callback (Widget *w, widget_msg_t msg, int parm) case WIDGET_KEY: { @@ -2255,51 +2329,10 @@ diff -up mc-4.6.2-pre1/edit/editwidget.c.utf8 mc-4.6.2-pre1/edit/editwidget.c /* The user may override the access-keys for the menu bar. */ if (edit_translate_key (e, parm, &cmd, &ch)) { -diff -up mc-4.6.2-pre1/edit/edit-widget.h.utf8 mc-4.6.2-pre1/edit/edit-widget.h ---- mc-4.6.2-pre1/edit/edit-widget.h.utf8 2007-02-03 02:03:53.000000000 +0100 -+++ mc-4.6.2-pre1/edit/edit-widget.h 2008-12-04 13:25:34.000000000 +0100 -@@ -30,6 +30,11 @@ typedef struct edit_key_map_type { - long command; - } edit_key_map_type; - -+struct action { -+ mc_wchar_t ch; -+ long flags; -+}; -+ - struct WEdit { - Widget widget; - -@@ -42,8 +47,17 @@ struct WEdit { - /* 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 */ -+#ifndef UTF8 - unsigned char *buffers1[MAXBUFF + 1]; /* all data up to curs1 */ - unsigned char *buffers2[MAXBUFF + 1]; /* all data from end of file down to curs2 */ -+#else /* UTF8 */ -+ mc_wchar_t *buffers1[MAXBUFF + 1]; /* all data up to curs1 */ -+ mc_wchar_t *buffers2[MAXBUFF + 1]; /* all data from end of file down to curs2 */ -+ -+ unsigned char charbuf[MB_LEN_MAX]; -+ int charpoint; -+#endif /* UTF8 */ -+ - - /* search variables */ - long search_start; /* First character to start searching from */ -@@ -87,7 +101,7 @@ struct WEdit { - - /* 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; -diff -up mc-4.6.2-pre1/edit/wordproc.c.utf8 mc-4.6.2-pre1/edit/wordproc.c ---- mc-4.6.2-pre1/edit/wordproc.c.utf8 2006-06-16 22:01:29.000000000 +0200 -+++ mc-4.6.2-pre1/edit/wordproc.c 2008-12-04 13:25:34.000000000 +0100 +diff --git a/edit/wordproc.c b/edit/wordproc.c +index fc16136..25a534e 100644 +--- a/edit/wordproc.c ++++ b/edit/wordproc.c @@ -40,7 +40,12 @@ #define tab_width option_tab_spacing @@ -2336,11 +2369,11 @@ diff -up mc-4.6.2-pre1/edit/wordproc.c.utf8 mc-4.6.2-pre1/edit/wordproc.c c = edit_get_byte (edit, p); if (c == '.') { /* `...' is acceptable */ if (edit_get_byte (edit, p + 1) == '.') -@@ -78,7 +90,13 @@ static int bad_line_start (WEdit * edit, +@@ -78,7 +90,13 @@ static int bad_line_start (WEdit * edit, long p) return 0; /* `---' is acceptable */ return 1; } -+ ++ +#ifndef UTF8 if (strchr (NO_FORMAT_CHARS_START, c)) +#else /* UTF8 */ @@ -2405,7 +2438,7 @@ diff -up mc-4.6.2-pre1/edit/wordproc.c.utf8 mc-4.6.2-pre1/edit/wordproc.c { int x = 0, c, xn = 0; for (;;) { -@@ -198,7 +220,7 @@ static int line_pixel_length (unsigned c +@@ -198,7 +220,7 @@ static int line_pixel_length (unsigned char *t, long b, int l) } static int @@ -2414,7 +2447,7 @@ diff -up mc-4.6.2-pre1/edit/wordproc.c.utf8 mc-4.6.2-pre1/edit/wordproc.c { int i; int saw_ws = 0; -@@ -222,7 +244,7 @@ next_word_start (unsigned char *t, int q +@@ -222,7 +244,7 @@ next_word_start (unsigned char *t, int q, int size) /* find the start of a word */ static int @@ -2423,7 +2456,7 @@ diff -up mc-4.6.2-pre1/edit/wordproc.c.utf8 mc-4.6.2-pre1/edit/wordproc.c { int i = q; if (t[q] == ' ' || t[q] == '\t') -@@ -241,7 +263,7 @@ word_start (unsigned char *t, int q, int +@@ -241,7 +263,7 @@ word_start (unsigned char *t, int q, int size) } /* replaces ' ' with '\n' to properly format a paragraph */ @@ -2432,7 +2465,7 @@ diff -up mc-4.6.2-pre1/edit/wordproc.c.utf8 mc-4.6.2-pre1/edit/wordproc.c { int q = 0, ww; strip_newlines (t, size); -@@ -269,7 +291,7 @@ static void format_this (unsigned char * +@@ -269,7 +291,7 @@ static void format_this (unsigned char *t, int size, int indent) } } @@ -2441,7 +2474,7 @@ diff -up mc-4.6.2-pre1/edit/wordproc.c.utf8 mc-4.6.2-pre1/edit/wordproc.c { edit_cursor_move (edit, q - edit->curs1); edit_delete (edit); -@@ -278,18 +300,27 @@ static void replace_at (WEdit * edit, lo +@@ -278,18 +300,27 @@ static void replace_at (WEdit * edit, long q, int c) /* replaces a block of text */ static void @@ -2471,7 +2504,7 @@ diff -up mc-4.6.2-pre1/edit/wordproc.c.utf8 mc-4.6.2-pre1/edit/wordproc.c p++; } else if (t[i - 1] == '\n') { long curs; -@@ -301,7 +332,11 @@ put_paragraph (WEdit * edit, unsigned ch +@@ -301,7 +332,11 @@ put_paragraph (WEdit * edit, unsigned char *t, long p, int indent, int size) p = edit->curs1; } else if (c == '\n') { edit_cursor_move (edit, p - edit->curs1); @@ -2483,7 +2516,7 @@ diff -up mc-4.6.2-pre1/edit/wordproc.c.utf8 mc-4.6.2-pre1/edit/wordproc.c edit_delete (edit); if (cursor > edit->curs1) cursor--; -@@ -334,7 +369,7 @@ format_paragraph (WEdit *edit, int force +@@ -334,7 +369,7 @@ format_paragraph (WEdit *edit, int force) { long p, q; int size; @@ -2492,12 +2525,7 @@ diff -up mc-4.6.2-pre1/edit/wordproc.c.utf8 mc-4.6.2-pre1/edit/wordproc.c int indent = 0; if (option_word_wrap_line_length < 2) return; -@@ -344,17 +379,25 @@ format_paragraph (WEdit *edit, int force - q = end_paragraph (edit, force); - indent = test_indent (edit, p, q); - t = get_paragraph (edit, p, q, indent, &size); -- if (!t) -+ if (!t) +@@ -348,13 +383,21 @@ format_paragraph (WEdit *edit, int force) return; if (!force) { int i; @@ -2519,10 +2547,71 @@ diff -up mc-4.6.2-pre1/edit/wordproc.c.utf8 mc-4.6.2-pre1/edit/wordproc.c g_free (t); return; } -diff -up mc-4.6.2-pre1/src/achown.c.utf8 mc-4.6.2-pre1/src/achown.c ---- mc-4.6.2-pre1/src/achown.c.utf8 2005-09-05 03:36:58.000000000 +0200 -+++ mc-4.6.2-pre1/src/achown.c 2008-12-04 13:25:34.000000000 +0100 -@@ -584,6 +584,12 @@ init_chown_advanced (void) +diff --git a/po/ru.po b/po/ru.po +index 5ee11d0..76c3a6b 100644 +--- a/po/ru.po ++++ b/po/ru.po +@@ -3650,5 +3650,30 @@ msgstr " + #~ " ÔÅÐÅÒØ ÈÒÁÎÑÔÓÑ × ËÁÔÁÌÏÇÅ ~/.mc, ÓÔÁÒÙÅ \n" + #~ " ÆÁÊÌÙ ÓÅÊÞÁÓ ÔÕÄÁ ÐÅÒÅÍÅÝÅÎÙ\n" + +-#~ msgid "%s bytes in %d files" +-#~ msgstr "%s ÂÁÊÔ × %d ÆÁÊÌÁÈ" ++#: messages for recode patch ++msgid "Panel &codepage" ++msgstr "ëÏÄÉÒÏ×ËÁ ÐÁÎÅÌÉ" ++ ++msgid " Choose codepage " ++msgstr " ÷ÙÂÅÒÉÔÅ ËÏÄÉÒÏ×ËÕ" ++ ++msgid " Choose panel codepage " ++msgstr " ÷ÙÂÅÒÉÔÅ ËÏÄÉÒÏ×ËÕ ÐÁÎÅÌÉ " ++ ++msgid " Choose default FTP codepage " ++msgstr " ÷ÙÂÅÒÉÔÅ ËÏÄÉÒÏ×ËÕ FTP ÐÏ ÕÍÏÌÞÁÎÉÀ " ++ ++msgid "FTP default codepage:" ++msgstr "ëÏÄÉÒÏ×ËÁ FTP ÐÏ ÕÍÏÌÞÁÎÉÀ:" ++ ++msgid "Recode file names:" ++msgstr "ðÅÒÅËÏÄÉÒÏ×ÁÔØ ÉÍÅÎÁ:" ++ ++msgid "Recoding works only with COPY/MOVE operation" ++msgstr "ðÅÒÅËÏÄÉÒÏ×ËÁ ÒÁÂÏÔÁÅÔ ÔÏÌØËÏ ÄÌÑ ÏÐÅÒÁÃÉÊ ËÏÐÉÒÏ×ÁÎÉÑ/ÐÅÒÅÍÅÝÅÎÉÑ" ++ ++msgid " Choose \"FROM\" codepage for COPY/MOVE operaion " ++msgstr" ÷ÙÂÅÒÉÔÅ ÎÁÞÁÌØÎÕÀ ËÏÄÉÒÏ×ËÕ ÄÌÑ ÏÐÅÒÁÃÉÉ ËÏÐÉÒÏ×ÁÎÉÑ/ÐÅÒÅÍÅÝÅÎÉÑ " ++ ++msgid " Choose \"TO\" codepage for COPY/MOVE operaion " ++msgstr" ÷ÙÂÅÒÉÔÅ ËÏÎÅÞÎÕÀ ËÏÄÉÒÏ×ËÕ ÄÌÑ ÏÐÅÒÁÃÉÉ ËÏÐÉÒÏ×ÁÎÉÑ/ÐÅÒÅÍÅÝÅÎÉÑ " +diff --git a/src/Makefile.am b/src/Makefile.am +index d43b198..90bd1b1 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -41,7 +41,8 @@ endif + mc_LDADD = $(EDITLIB) $(SLANGLIB) $(VFSLIB) \ + $(INTLLIBS) $(GLIB_LIBS) $(MCLIBS) $(LIBICONV) + +-CHARSET_SRC = charsets.c charsets.h selcodepage.c selcodepage.h ++CHARSET_SRC = charsets.c charsets.h selcodepage.c selcodepage.h \ ++ recode.c recode.h + + SRCS = achown.c achown.h background.c background.h boxes.c boxes.h \ + chmod.c chmod.h chown.c chown.h cmd.c cmd.h color.c color.h \ +@@ -58,7 +59,7 @@ SRCS = achown.c achown.h background.c background.h boxes.c boxes.h \ + menu.c menu.h mountlist.c mountlist.h mouse.c mouse.h myslang.h \ + option.c option.h panel.h panelize.c panelize.h poptalloca.h \ + popt.c poptconfig.c popt.h popthelp.c poptint.h poptparse.c \ +- profile.c profile.h regex.c rxvt.c screen.c setup.c setup.h \ ++ profile.c profile.h regex.c rxvt.c screen.c screen.h setup.c setup.h \ + slint.c subshell.c subshell.h textconf.c textconf.h \ + tree.c tree.h treestore.c treestore.h timefmt.h tty.c tty.h user.c \ + user.h util.c util.h utilunix.c view.c view.h vfsdummy.h widget.c \ +diff --git a/src/achown.c b/src/achown.c +index 72ddcad..f1f3024 100644 +--- a/src/achown.c ++++ b/src/achown.c +@@ -585,6 +585,12 @@ init_chown_advanced (void) b_att[2] = button_new (XTRACT (6)); b_user = button_new (XTRACT (5)); b_group = button_new (XTRACT (4)); @@ -2535,10 +2624,19 @@ diff -up mc-4.6.2-pre1/src/achown.c.utf8 mc-4.6.2-pre1/src/achown.c add_widget (ch_dlg, b_group); add_widget (ch_dlg, b_user); -diff -up mc-4.6.2-pre1/src/boxes.c.utf8 mc-4.6.2-pre1/src/boxes.c ---- mc-4.6.2-pre1/src/boxes.c.utf8 2006-02-28 17:15:21.000000000 +0100 -+++ mc-4.6.2-pre1/src/boxes.c 2008-12-04 13:25:34.000000000 +0100 -@@ -153,23 +153,23 @@ display_init (int radio_sel, char *init_ +diff --git a/src/boxes.c b/src/boxes.c +index 0ff72d4..82a0e1b 100644 +--- a/src/boxes.c ++++ b/src/boxes.c +@@ -53,6 +53,7 @@ + #ifdef HAVE_CHARSET + #include "charsets.h" + #include "selcodepage.h" ++#include "recode.h" + #endif + + #ifdef USE_NETCODE +@@ -154,23 +155,23 @@ display_init (int radio_sel, char *init_text, int _check_status, display_title = _(display_title); for (i = 0; i < LIST_TYPES; i++) { displays[i] = _(displays[i]); @@ -2567,7 +2665,7 @@ diff -up mc-4.6.2-pre1/src/boxes.c.utf8 mc-4.6.2-pre1/src/boxes.c if (i > DISPLAY_X) DISPLAY_X = i; -@@ -288,20 +288,20 @@ sort_box (sortfn *sort_fn, int *reverse, +@@ -290,20 +291,20 @@ sort_box (sortfn *sort_fn, int *reverse, int *case_sensitive, int *exec_first) int maxlen = 0; for (i = SORT_TYPES - 1; i >= 0; i--) { sort_orders_names[i] = _(sort_orders[i].sort_name); @@ -2593,7 +2691,7 @@ diff -up mc-4.6.2-pre1/src/boxes.c.utf8 mc-4.6.2-pre1/src/boxes.c if (i > l) l = i; -@@ -310,7 +310,7 @@ sort_box (sortfn *sort_fn, int *reverse, +@@ -312,7 +313,7 @@ sort_box (sortfn *sort_fn, int *reverse, int *case_sensitive, int *exec_first) if (i > SORT_X) SORT_X = i; @@ -2602,7 +2700,7 @@ diff -up mc-4.6.2-pre1/src/boxes.c.utf8 mc-4.6.2-pre1/src/boxes.c if (i > SORT_X) SORT_X = i; -@@ -408,7 +408,7 @@ confirm_box (void) +@@ -413,7 +414,7 @@ confirm_box (void) while (i--) { conf_widgets [i].text = _(conf_widgets [i].text); @@ -2611,7 +2709,7 @@ diff -up mc-4.6.2-pre1/src/boxes.c.utf8 mc-4.6.2-pre1/src/boxes.c if (l1 > maxlen) maxlen = l1; } -@@ -423,8 +423,8 @@ confirm_box (void) +@@ -428,8 +429,8 @@ confirm_box (void) * And this for the case when buttons with some space to the right * do not fit within 2/6 */ @@ -2622,7 +2720,18 @@ diff -up mc-4.6.2-pre1/src/boxes.c.utf8 mc-4.6.2-pre1/src/boxes.c if (i > l1) l1 = i; -@@ -497,11 +497,11 @@ display_bits_box (void) +@@ -459,8 +460,8 @@ confirm_box (void) + } + } + +-#define DISPY 11 +-#define DISPX 46 ++#define DISPY 13 ++#define DISPX 35 + + + #ifndef HAVE_CHARSET +@@ -502,11 +503,11 @@ display_bits_box (void) { display_widgets [i].text = _(display_widgets[i].text); display_bits_str [i] = _(display_bits_str [i]); @@ -2636,7 +2745,7 @@ diff -up mc-4.6.2-pre1/src/boxes.c.utf8 mc-4.6.2-pre1/src/boxes.c if (l1 > maxlen) maxlen = l1; -@@ -509,8 +509,8 @@ display_bits_box (void) +@@ -514,8 +515,8 @@ display_bits_box (void) display_bits.xlen = (maxlen + 5) * 6 / 4; /* See above confirm_box */ @@ -2647,16 +2756,142 @@ diff -up mc-4.6.2-pre1/src/boxes.c.utf8 mc-4.6.2-pre1/src/boxes.c if (i > l1) l1 = i; -@@ -605,7 +605,7 @@ init_disp_bits_box (void) +@@ -556,23 +557,58 @@ display_bits_box (void) - cpname = _("&Select"); + + static int new_display_codepage; ++static int new_ftp_codepage; + +-static WLabel *cplabel; + static WCheck *inpcheck; + ++static WButton *cpbutton; ++static WButton *cpbutton_ftp; ++ + static int + sel_charset_button (int action) + { + const char *cpname; + char buf[64]; +- new_display_codepage = select_charset (new_display_codepage, 1); ++ new_display_codepage = select_charset (new_display_codepage, 1, _(" Choose input codepage ")); + cpname = (new_display_codepage < 0) + ? _("Other 8 bit") + : codepages[new_display_codepage].name; + + /* avoid strange bug with label repainting */ +- g_snprintf (buf, sizeof (buf), "%-27s", cpname); +- label_set_text (cplabel, buf); ++ sprintf( buf, "%s", cpname ); ++ button_set_text (cpbutton, buf); ++ ++ if(new_display_codepage<0) new_ftp_codepage=-1; ++ cpname = (new_ftp_codepage < 0) ++ ? _("Other 8 bit") ++ : codepages[ new_ftp_codepage ].name; ++ sprintf( buf, "%s", cpname ); ++ button_set_text (cpbutton_ftp, buf); ++ ++ return 0; ++} ++ ++static int sel_charset_button_ftp(int action) { ++ char *cpname, buf[64]; ++ if(new_display_codepage>0) { ++ new_ftp_codepage = select_charset(new_ftp_codepage, 0, _(" Choose default FTP codepage ")); ++ cpname = (new_display_codepage < 0) ++ ? _("Other 8 bit") ++ : codepages[ new_display_codepage ].name; ++ sprintf( buf, "%s", cpname ); ++ button_set_text( cpbutton, buf ); ++ cpname = (new_ftp_codepage < 0) ++ ? _("Other 8 bit") ++ : codepages[ new_ftp_codepage ].name; ++ sprintf( buf, "%s", cpname ); ++ button_set_text( cpbutton_ftp, buf ); ++ } ++ else { ++ message( 1, _(" Warning "), ++ _("To use this feature select your codepage in\n" ++ "Setup / Display Bits dialog!\n" ++ "Do not forget to save options." )); ++ } + return 0; + } + +@@ -594,9 +630,6 @@ init_disp_bits_box (void) + cpname = (new_display_codepage < 0) + ? _("Other 8 bit") + : codepages[new_display_codepage].name; +- cplabel = label_new (4, 4, cpname); +- add_widget (dbits_dlg, cplabel); +- add_widget (dbits_dlg, + button_new (DISPY - 3, DISPX / 2 + 3, B_CANCEL, + NORMAL_BUTTON, _("&Cancel"), 0)); +@@ -605,13 +638,30 @@ init_disp_bits_box (void) + 0)); + + inpcheck = +- check_new (6, 4, !use_8th_bit_as_meta, _("F&ull 8 bits input")); ++ check_new (8, 4, !use_8th_bit_as_meta, _("F&ull 8 bits input")); + add_widget (dbits_dlg, inpcheck); + +- 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)); +- NORMAL_BUTTON, cpname, sel_charset_button)); ++ ++ add_widget( dbits_dlg, label_new( 5, 4, _("FTP default codepage:"))); ++ if(n_codepages>0) { ++ cpname = (new_display_codepage < 0) ++ ? _("Other 8 bit") ++ : codepages[ new_display_codepage ].name; ++ } ++ else cpname= _("Other 8 bit"); ++ cpbutton=button_new(4, 5, B_USER, ++ NORMAL_BUTTON, cpname, sel_charset_button); ++ ++ if(n_codepages>0) { ++ cpname = (new_ftp_codepage < 0) ++ ? _("Other 8 bit") ++ : codepages[ new_ftp_codepage ].name; ++ } ++ else cpname= _("Other 8 bit"); ++ cpbutton_ftp=button_new(6, 5, B_USER, ++ NORMAL_BUTTON, cpname, sel_charset_button_ftp); ++ add_widget( dbits_dlg, cpbutton_ftp); ++ add_widget (dbits_dlg, cpbutton); return dbits_dlg; -@@ -816,7 +816,7 @@ cd_dialog (void) + } +@@ -621,6 +671,7 @@ display_bits_box (void) + { + Dlg_head *dbits_dlg; + new_display_codepage = display_codepage; ++ new_ftp_codepage = ftp_codepage; + + application_keypad_mode (); + dbits_dlg = init_disp_bits_box (); +@@ -641,6 +692,17 @@ display_bits_box (void) + && display_codepage != 1) ? 128 : 160; + #endif + use_8th_bit_as_meta = !(inpcheck->state & C_BOOL); ++ ++ ftp_codepage=new_ftp_codepage; ++ if(display_codepage<=0) { ++ panel_reset_codepage(left_panel); ++ paint_dir(left_panel); ++ display_mini_info(left_panel); ++ panel_reset_codepage(right_panel); ++ paint_dir(right_panel); ++ display_mini_info(right_panel); ++ } ++ + } + destroy_dlg (dbits_dlg); + repaint_screen (); +@@ -821,7 +883,7 @@ cd_dialog (void) quick_widgets [1].y_divisions = quick_widgets [0].y_divisions = Quick_input.ylen = 5; @@ -2665,7 +2900,7 @@ diff -up mc-4.6.2-pre1/src/boxes.c.utf8 mc-4.6.2-pre1/src/boxes.c quick_widgets [0].relative_x = quick_widgets [1].relative_x + len + 1; -@@ -975,7 +975,7 @@ jobs_cmd (void) +@@ -980,7 +1042,7 @@ jobs_cmd (void) { job_buttons [i].name = _(job_buttons [i].name); @@ -2674,7 +2909,7 @@ diff -up mc-4.6.2-pre1/src/boxes.c.utf8 mc-4.6.2-pre1/src/boxes.c JOBS_X = max (JOBS_X, startx + len + 3); job_buttons [i].xpos = startx; -@@ -984,7 +984,7 @@ jobs_cmd (void) +@@ -989,7 +1051,7 @@ jobs_cmd (void) /* Last button - Ok a.k.a. Cancel :) */ job_buttons [n_buttons - 1].xpos = @@ -2683,7 +2918,7 @@ diff -up mc-4.6.2-pre1/src/boxes.c.utf8 mc-4.6.2-pre1/src/boxes.c i18n_flag = 1; } -@@ -1042,7 +1042,7 @@ vfs_smb_get_authinfo (const char *host, +@@ -1047,7 +1109,7 @@ vfs_smb_get_authinfo (const char *host, const char *share, const char *domain, while (i--) { @@ -2692,7 +2927,7 @@ diff -up mc-4.6.2-pre1/src/boxes.c.utf8 mc-4.6.2-pre1/src/boxes.c if (l1 > maxlen) maxlen = l1; } -@@ -1052,7 +1052,7 @@ vfs_smb_get_authinfo (const char *host, +@@ -1057,7 +1119,7 @@ vfs_smb_get_authinfo (const char *host, const char *share, const char *domain, for (i = sizeof(buts)/sizeof(buts[0]), l1 = 0; i--; ) { @@ -2701,7 +2936,7 @@ diff -up mc-4.6.2-pre1/src/boxes.c.utf8 mc-4.6.2-pre1/src/boxes.c } l1 += 15; if (l1 > dialog_x) -@@ -1061,7 +1061,7 @@ vfs_smb_get_authinfo (const char *host, +@@ -1066,7 +1128,7 @@ vfs_smb_get_authinfo (const char *host, const char *share, const char *domain, ilen = dialog_x - 7 - maxlen; /* for the case of very long buttons :) */ istart = dialog_x - 3 - ilen; @@ -2710,10 +2945,99 @@ diff -up mc-4.6.2-pre1/src/boxes.c.utf8 mc-4.6.2-pre1/src/boxes.c i18n_flag = 1; } -diff -up mc-4.6.2-pre1/src/dialog.c.utf8 mc-4.6.2-pre1/src/dialog.c ---- mc-4.6.2-pre1/src/dialog.c.utf8 2005-09-05 05:20:27.000000000 +0200 -+++ mc-4.6.2-pre1/src/dialog.c 2008-12-04 13:25:34.000000000 +0100 -@@ -166,7 +166,7 @@ common_dialog_repaint (struct Dlg_head * +diff --git a/src/charsets.c b/src/charsets.c +index f2e69e0..bac7b3b 100644 +--- a/src/charsets.c ++++ b/src/charsets.c +@@ -123,8 +123,6 @@ free_codepages_list (void) + } + } + +-#define OTHER_8BIT "Other_8_bit" +- + const char * + get_codepage_id (int n) + { +@@ -143,7 +141,7 @@ get_codepage_index (const char *id) + return -1; + } + +-static char ++char + translate_character (iconv_t cd, char c) + { + char outbuf[4], *obuf; +diff --git a/src/charsets.h b/src/charsets.h +index b701d5a..0698dc2 100644 +--- a/src/charsets.h ++++ b/src/charsets.h +@@ -6,6 +6,7 @@ + #define UNKNCHAR '\001' + + #define CHARSETS_INDEX "mc.charsets" ++#define OTHER_8BIT "Other_8_bit" + + extern int n_codepages; + +@@ -19,6 +20,10 @@ struct codepage_desc { + + extern struct codepage_desc *codepages; + ++#include ++extern char translate_character(iconv_t cd, char c); ++extern char errbuf[255]; ++ + const char *get_codepage_id (int n); + int get_codepage_index (const char *id); + int load_codepages_list (void); +diff --git a/src/cmd.c b/src/cmd.c +index f82165c..e24d563 100644 +--- a/src/cmd.c ++++ b/src/cmd.c +@@ -73,6 +73,10 @@ + # include "../edit/edit.h" + #endif + ++#ifdef HAVE_CHARSET ++#include "recode.h" ++#endif ++ + /* If set and you don't have subshell support,then C-o will give you a shell */ + int output_starts_shell = 0; + +@@ -353,6 +357,9 @@ void + mkdir_cmd (void) + { + char *dir, *absdir; ++#ifdef HAVE_CHARSET ++ char *recoded_dir; ++#endif + + dir = + input_expand_dialog (_("Create a new Directory"), +@@ -363,8 +370,16 @@ mkdir_cmd (void) + + if (dir[0] == '/' || dir[0] == '~') + absdir = g_strdup (dir); +- else ++ else { ++#ifdef HAVE_CHARSET ++ recoded_dir=g_strdup(dir); ++ my_translate_string(dir,strlen(dir), recoded_dir,current_panel->tr_table_input); ++ absdir = mhl_str_dir_plus_file (current_panel->cwd, recoded_dir); ++ g_free(recoded_dir); ++#else + absdir = mhl_str_dir_plus_file (current_panel->cwd, dir); ++#endif ++ } + + save_cwds_stat (); + if (my_mkdir (absdir, 0777) == 0) { +diff --git a/src/dialog.c b/src/dialog.c +index f8467b9..43d117f 100644 +--- a/src/dialog.c ++++ b/src/dialog.c +@@ -167,7 +167,7 @@ common_dialog_repaint (struct Dlg_head *h) if (h->title) { attrset (DLG_HOT_NORMALC (h)); @@ -2722,10 +3046,21 @@ diff -up mc-4.6.2-pre1/src/dialog.c.utf8 mc-4.6.2-pre1/src/dialog.c addstr (h->title); } } -diff -up mc-4.6.2-pre1/src/file.c.utf8 mc-4.6.2-pre1/src/file.c ---- mc-4.6.2-pre1/src/file.c.utf8 2007-02-22 15:29:11.000000000 +0100 -+++ mc-4.6.2-pre1/src/file.c 2008-12-04 13:25:34.000000000 +0100 -@@ -161,15 +161,20 @@ static const char * +diff --git a/src/file.c b/src/file.c +index 6400e3e..056aa11 100644 +--- a/src/file.c ++++ b/src/file.c +@@ -79,6 +79,9 @@ + #include "../vfs/vfs-impl.h" + + /* }}} */ ++#ifdef HAVE_CHARSET ++#include "recode.h" ++#endif + + /* Hack: the vfs code should not rely on this */ + #define WITH_FULL_PATHS 1 +@@ -167,15 +170,20 @@ static const char * do_transform_source (FileOpContext *ctx, const char *source) { size_t j, k, l, len; @@ -2747,7 +3082,7 @@ diff -up mc-4.6.2-pre1/src/file.c.utf8 mc-4.6.2-pre1/src/file.c return NULL; } for (next_reg = 1, j = 0, k = 0; j < strlen (ctx->dest_mask); j++) { -@@ -213,6 +218,7 @@ do_transform_source (FileOpContext *ctx, +@@ -225,6 +233,7 @@ do_transform_source (FileOpContext *ctx, const char *source) || ctx->regs.start[next_reg] < 0) { message (1, MSG_ERROR, _(" Invalid target mask ")); transform_error = FILE_ABORT; @@ -2755,7 +3090,7 @@ diff -up mc-4.6.2-pre1/src/file.c.utf8 mc-4.6.2-pre1/src/file.c return NULL; } for (l = (size_t) ctx->regs.start[next_reg]; -@@ -227,6 +233,7 @@ do_transform_source (FileOpContext *ctx, +@@ -239,6 +248,7 @@ do_transform_source (FileOpContext *ctx, const char *source) } } fntarget[k] = 0; @@ -2763,7 +3098,57 @@ diff -up mc-4.6.2-pre1/src/file.c.utf8 mc-4.6.2-pre1/src/file.c return fntarget; } -@@ -1688,13 +1695,13 @@ panel_operate_generate_prompt (const WPa +@@ -922,7 +932,12 @@ copy_dir_dir (FileOpContext *ctx, const char *s, const char *d, int toplevel, + } + /* Dive into subdir if exists */ + if (toplevel && ctx->dive_into_subdirs) { ++#ifdef HAVE_CHARSET ++ /*FIXME: Use here somehow mhl_str_dir_plus_file */ ++ dest_dir = concat_dir_and_recoded_fname(d, x_basename (s), ctx); ++#else + dest_dir = mhl_str_dir_plus_file (d, x_basename (s)); ++#endif + } else { + dest_dir = g_strdup (d); + goto dont_mkdir; +@@ -972,7 +987,11 @@ copy_dir_dir (FileOpContext *ctx, const char *s, const char *d, int toplevel, + + (*ctx->stat_func) (path, &buf); + if (S_ISDIR (buf.st_mode)) { ++#ifdef HAVE_CHARSET ++ mdpath = concat_dir_and_recoded_fname(dest_dir, next->d_name, ctx); ++#else + mdpath = mhl_str_dir_plus_file (dest_dir, next->d_name); ++#endif + /* + * From here, we just intend to recursively copy subdirs, not + * the double functionality of copying different when the target +@@ -983,7 +1002,11 @@ copy_dir_dir (FileOpContext *ctx, const char *s, const char *d, int toplevel, + parent_dirs, progress_count, progress_bytes); + g_free (mdpath); + } else { ++#ifdef HAVE_CHARSET ++ dest_file=concat_dir_and_recoded_fname(dest_dir, x_basename(path),ctx); ++#else + dest_file = mhl_str_dir_plus_file (dest_dir, x_basename (path)); ++#endif + return_status = copy_file_file (ctx, path, dest_file, 1, + progress_count, progress_bytes, 0); + g_free (dest_file); +@@ -1173,7 +1196,12 @@ move_dir_dir (FileOpContext *ctx, const char *s, const char *d, + destdir = g_strdup (d); + move_over = 1; + } else ++#ifdef HAVE_CHARSET ++ destdir = concat_dir_and_recoded_fname(d, x_basename (s), ctx); ++#else + destdir = mhl_str_dir_plus_file (d, x_basename (s)); ++#endif ++ + + if (sbuf.st_dev == dbuf.st_dev && sbuf.st_ino == dbuf.st_ino) { + int msize = COLS - 36; +@@ -1700,13 +1728,13 @@ panel_operate_generate_prompt (const WPanel *panel, const int operation, *dp = '\0'; if (single_source) { @@ -2779,18 +3164,49 @@ diff -up mc-4.6.2-pre1/src/file.c.utf8 mc-4.6.2-pre1/src/file.c if (i > 0) { fmd_xlen += i; fmd_init_i18n (TRUE); /* to recalculate positions of child widgets */ -diff -up mc-4.6.2-pre1/src/filegui.c.utf8 mc-4.6.2-pre1/src/filegui.c ---- mc-4.6.2-pre1/src/filegui.c.utf8 2007-08-23 15:16:39.000000000 +0200 -+++ mc-4.6.2-pre1/src/filegui.c 2008-12-04 13:25:34.000000000 +0100 -@@ -65,6 +65,7 @@ +@@ -1901,7 +1929,12 @@ panel_operate (void *source_panel, FileOperation operation, + if (temp == NULL) { + value = transform_error; + } else { ++#ifdef HAVE_CHARSET ++ char *temp2 = concat_dir_and_recoded_fname (dest, temp, ctx); ++#else + char *temp2 = mhl_str_dir_plus_file (dest, temp); ++#endif ++ + g_free (dest); + dest = temp2; + temp = NULL; +@@ -1995,7 +2028,12 @@ panel_operate (void *source_panel, FileOperation operation, + if (temp == NULL) + value = transform_error; + else { ++#ifdef HAVE_CHARSET ++ char *temp2 = concat_dir_and_recoded_fname(dest, temp, ctx); ++#else + char *temp2 = mhl_str_dir_plus_file (dest, temp); ++#endif ++ + + source_with_path = mhl_shell_unescape_buf(source_with_path); + temp2 = mhl_shell_unescape_buf(temp2); +diff --git a/src/filegui.c b/src/filegui.c +index 441adb7..e9920d0 100644 +--- a/src/filegui.c ++++ b/src/filegui.c +@@ -66,6 +66,11 @@ #include "filegui.h" #include "key.h" /* get_event */ #include "util.h" /* strip_password() */ +#include "tty.h" ++ ++#ifdef HAVE_CHARSET ++#include "recode.h" ++#endif /* }}} */ -@@ -563,8 +564,8 @@ init_replace (FileOpContext *ctx, enum O +@@ -564,8 +569,8 @@ init_replace (FileOpContext *ctx, enum OperationMode mode) * longest of "Overwrite..." labels * (assume "Target date..." are short enough) */ @@ -2801,7 +3217,7 @@ diff -up mc-4.6.2-pre1/src/filegui.c.utf8 mc-4.6.2-pre1/src/filegui.c /* longest of button rows */ i = sizeof (rd_widgets) / sizeof (rd_widgets[0]); -@@ -575,7 +576,7 @@ init_replace (FileOpContext *ctx, enum O +@@ -576,7 +581,7 @@ init_replace (FileOpContext *ctx, enum OperationMode mode) l2 = max (l2, l); l = 0; } @@ -2810,7 +3226,7 @@ diff -up mc-4.6.2-pre1/src/filegui.c.utf8 mc-4.6.2-pre1/src/filegui.c } } l2 = max (l2, l); /* last row */ -@@ -593,12 +594,12 @@ init_replace (FileOpContext *ctx, enum O +@@ -594,12 +599,12 @@ init_replace (FileOpContext *ctx, enum OperationMode mode) l = l1; } rd_widgets[i].xpos = l; @@ -2825,7 +3241,7 @@ diff -up mc-4.6.2-pre1/src/filegui.c.utf8 mc-4.6.2-pre1/src/filegui.c } #endif /* ENABLE_NLS */ -@@ -617,7 +618,7 @@ init_replace (FileOpContext *ctx, enum O +@@ -618,7 +623,7 @@ init_replace (FileOpContext *ctx, enum OperationMode mode) ADD_RD_LABEL (ui, 0, name_trunc (ui->replace_filename, @@ -2834,54 +3250,200 @@ diff -up mc-4.6.2-pre1/src/filegui.c.utf8 mc-4.6.2-pre1/src/filegui.c ADD_RD_BUTTON (1); ADD_RD_BUTTON (2); -@@ -804,36 +805,36 @@ fmd_init_i18n (int force) +@@ -721,57 +726,79 @@ file_progress_real_query_replace (FileOpContext *ctx, + } + } + ++#ifdef HAVE_CHARSET ++#define FMDY 15 ++#else + #define FMDY 13 ++#endif ++ + #define FMD_XLEN 64 + extern int fmd_xlen; + static QuickWidget fmd_widgets[] = { + +-#define FMCB0 FMDC +-#define FMCB12 0 +-#define FMCB11 1 +- /* follow symlinks and preserve Attributes must be the first */ +- {quick_checkbox, 3, 64, 8, FMDY, N_("preserve &Attributes"), 9, 0, +- 0 /* &op_preserve */ , 0, NULL}, +- {quick_checkbox, 3, 64, 7, FMDY, N_("follow &Links"), 7, 0, +- 0 /* &file_mask_op_follow_links */ , 0, NULL}, +- {quick_label, 3, 64, 5, FMDY, N_("to:"), 0, 0, 0, 0, NULL}, +- {quick_checkbox, 37, 64, 4, FMDY, N_("&Using shell patterns"), 0, 0, +- 0 /* &source_easy_patterns */ , 0, NULL}, +- {quick_input, 3, 64, 3, FMDY, "", 58, +- 0, 0, 0, "input-def"}, +-#define FMDI1 4 +-#define FMDI2 5 +-#define FMDC 3 +- {quick_input, 3, 64, 6, FMDY, "", 58, 0, +- 0, 0, "input2"}, +-#define FMDI0 6 +- {quick_label, 3, 64, 2, FMDY, "", 0, 0, 0, 0, NULL}, +-#define FMBRGT 7 +- {quick_button, 42, 64, 9, FMDY, N_("&Cancel"), 0, B_CANCEL, 0, 0, +- NULL}, +-#undef SKIP ++#ifdef HAVE_CHARSET ++ #define Y_OK 12 ++#else ++ #define Y_OK 9 ++#endif ++ + #ifdef WITH_BACKGROUND +-# define SKIP 5 +-# define FMCB21 11 +-# define FMCB22 10 +-# define FMBLFT 9 +-# define FMBMID 8 +- {quick_button, 25, 64, 9, FMDY, N_("&Background"), 0, B_USER, 0, 0, +- NULL}, +-#else /* WITH_BACKGROUND */ +-# define SKIP 4 +-# define FMCB21 10 +-# define FMCB22 9 +-# define FMBLFT 8 +-# undef FMBMID ++ #define ADD 0 ++#else ++ #define ADD -1 + #endif +- {quick_button, 14, 64, 9, FMDY, N_("&OK"), 0, B_ENTER, 0, 0, NULL}, +- {quick_checkbox, 42, 64, 8, FMDY, N_("&Stable Symlinks"), 0, 0, +- 0 /* &file_mask_stable_symlinks */ , 0, NULL}, +- {quick_checkbox, 31, 64, 7, FMDY, N_("&Dive into subdir if exists"), 0, +- 0, +- 0 /* &dive_into_subdirs */ , 0, NULL}, +- NULL_QuickWidget ++ ++ #define FM_STAB_SYM 0 ++ #define FM_DIVE_INTO_SUBDIR 1 ++ #define FM_PRES_ATTR 2 ++ #define FM_FOLLOW_LINKS 3 ++ #define FM_DST_INPUT 4 ++ #define FM_DST_TITLE 5 ++ #define FM_USING_SHELL_PATT 6 ++ #define FM_SRC_INPUT 7 ++ #define FM_SRC_TITLE 8 ++ #define FM_CANCEL 9 ++#ifdef WITH_BACKGROUND ++ #define FM_BKGND 10 ++#endif ++ #define FM_OK 11+ADD ++#ifdef HAVE_CHARSET ++ #define FM_TO_CODEPAGE 12+ADD ++ #define FM_FROM_CODEPAGE 13+ADD ++ #define FM_RECODE_TITLE 14+ADD ++ #define FM_RECODE_ARROW 15+ADD ++#endif // HAVE_CHARSET ++ ++ ++#ifdef HAVE_CHARSET ++ #define SKIP 10 ++ #define B_FROM B_USER+1 ++ #define B_TO B_USER+2 ++#else ++ #define SKIP 10 ++#endif ++ ++ {quick_checkbox, 42,64, 8, FMDY, N_("&Stable Symlinks"),0,0,0,0,"stab-sym"}, ++ {quick_checkbox, 31,64, 7, FMDY, N_("&Dive into subdir if exists"),0,0,0,0,"dive"}, ++ {quick_checkbox, 3, 64, 8, FMDY, N_("preserve &Attributes"),9,0,0,0,"preserve"}, ++ {quick_checkbox, 3, 64, 7, FMDY, N_("follow &Links"),7,0,0,0,"follow"}, ++ {quick_input, 3, 64, 6, FMDY, "", 58, 0, 0, 0, "input2"}, ++ {quick_label, 3, 64, 5, FMDY, N_("to:"), 0, 0, 0, 0, "to"}, ++ {quick_checkbox, 37,64, 4, FMDY, N_("&Using shell patterns"),0,0, 0,0,"us-sh"}, ++ {quick_input, 3, 64, 3, FMDY, "", 58, 0, 0, 0, "input-def"}, ++ {quick_label, 3, 64, 2, FMDY, "", 0, 0, 0, 0, "ql"}, ++ {quick_button, 42,64, Y_OK, FMDY, N_("&Cancel"), 0, B_CANCEL, 0,0, "cancel"}, ++#ifdef WITH_BACKGROUND ++ {quick_button, 25,64, Y_OK, FMDY, N_("&Background"), 0, B_USER, 0,0, "back"}, ++#endif ++ {quick_button, 14,64, Y_OK, FMDY, N_("&OK"), 0, B_ENTER, 0, 0, "ok"}, ++#ifdef HAVE_CHARSET ++ {quick_button, 46,64, 10, FMDY,"to codepage", 0, B_TO, 0, 0, "ql"}, ++ {quick_button, 25,64, 10, FMDY, "from codepage", 0, B_FROM, 0, 0, "ql"}, ++ {quick_label, 3, 64, 10, FMDY, N_("Recode file names:"), 0, 0, 0, 0, "ql"}, ++ {quick_label, 42,64, 10, FMDY, "->", 0, 0, 0, 0, "ql"}, ++#endif ++ {0} + }; + + static int +@@ -805,48 +832,48 @@ fmd_init_i18n (int force) 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; ++ len = mbstrlen (fmd_widgets[FM_FOLLOW_LINKS].text) ++ + mbstrlen (fmd_widgets[FM_DIVE_INTO_SUBDIR].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; ++ len = mbstrlen (fmd_widgets[FM_PRES_ATTR].text) ++ + mbstrlen (fmd_widgets[FM_STAB_SYM].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; ++ len = mbstrlen (fmd_widgets[FM_CANCEL].text) ++ + mbstrlen (fmd_widgets[FM_OK].text) + 11; - #ifdef FMBMID +-#ifdef FMBMID - len += strlen (fmd_widgets[FMBMID].text) + 6; -+ len += mbstrlen (fmd_widgets[FMBMID].text) + 6; ++#ifdef FM_BKGND ++ len += mbstrlen (fmd_widgets[FM_BKGND].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 = fmd_widgets[FMBLFT].relative_x = len + 3; - i += strlen (fmd_widgets[FMBLFT].text) + 8; -+ i += mbstrlen (fmd_widgets[FMBLFT].text) + 8; ++ i = fmd_widgets[FM_OK].relative_x = len + 3; ++ i += mbstrlen (fmd_widgets[FM_OK].text) + 8; - #ifdef FMBMID - fmd_widgets[FMBMID].relative_x = i; +-#ifdef FMBMID +- fmd_widgets[FMBMID].relative_x = i; - i += strlen (fmd_widgets[FMBMID].text) + 6; -+ i += mbstrlen (fmd_widgets[FMBMID].text) + 6; ++#ifdef FM_BKGND ++ fmd_widgets[FM_BKGND].relative_x = i; ++ i += mbstrlen (fmd_widgets[FM_BKGND].text) + 6; #endif - fmd_widgets[FMBRGT].relative_x = i; +- fmd_widgets[FMBRGT].relative_x = i; ++ fmd_widgets[FM_CANCEL].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); -@@ -855,7 +856,7 @@ fmd_init_i18n (int force) +- chkbox_xpos (FMCB0); +- chkbox_xpos (FMCB21); +- chkbox_xpos (FMCB22); ++ chkbox_xpos (FM_USING_SHELL_PATT); ++ chkbox_xpos (FM_DIVE_INTO_SUBDIR); ++ chkbox_xpos (FM_STAB_SYM); + + if (fmd_xlen != FMD_XLEN) { + i = sizeof (fmd_widgets) / sizeof (fmd_widgets[0]) - 1; + while (i--) + fmd_widgets[i].x_divisions = fmd_xlen; + +- fmd_widgets[FMDI1].hotkey_pos = +- fmd_widgets[FMDI2].hotkey_pos = fmd_xlen - 6; ++ fmd_widgets[FM_SRC_INPUT].hotkey_pos = ++ fmd_widgets[FM_DST_INPUT].hotkey_pos = fmd_xlen - 6; + } + #undef chkbox_xpos + +@@ -856,7 +883,7 @@ fmd_init_i18n (int force) char * file_mask_dialog (FileOpContext *ctx, FileOperation operation, const char *text, @@ -2890,12 +3452,15 @@ diff -up mc-4.6.2-pre1/src/filegui.c.utf8 mc-4.6.2-pre1/src/filegui.c { int source_easy_patterns = easy_patterns; char *source_mask, *orig_mask, *dest_dir, *tmpdest; -@@ -864,12 +865,20 @@ file_mask_dialog (FileOpContext *ctx, Fi +@@ -865,20 +892,32 @@ file_mask_dialog (FileOpContext *ctx, FileOperation operation, const char *text, struct stat buf; int val; QuickDialog Quick_input; - + char *def_text; ++#ifdef HAVE_CHARSET ++ char *errmsg; ++#endif g_return_val_if_fail (ctx != NULL, NULL); + + def_text = g_strdup(def_text_orig); @@ -2912,25 +3477,187 @@ diff -up mc-4.6.2-pre1/src/filegui.c.utf8 mc-4.6.2-pre1/src/filegui.c fmd_init_i18n (FALSE); /* Set up the result pointers */ -@@ -928,6 +937,7 @@ file_mask_dialog (FileOpContext *ctx, Fi + +- fmd_widgets[FMCB12].result = &ctx->op_preserve; +- fmd_widgets[FMCB11].result = &ctx->follow_links; +- fmd_widgets[FMCB22].result = &ctx->stable_symlinks; +- fmd_widgets[FMCB21].result = &ctx->dive_into_subdirs; ++ fmd_widgets[FM_PRES_ATTR].result = &ctx->op_preserve; ++ fmd_widgets[FM_FOLLOW_LINKS].result = &ctx->follow_links; ++ fmd_widgets[FM_STAB_SYM].result = &ctx->stable_symlinks; ++ fmd_widgets[FM_DIVE_INTO_SUBDIR].result = &ctx->dive_into_subdirs; ++ + + /* filter out a possible password from def_text */ + def_text_secure = strip_password (g_strdup (def_text), 1); +@@ -886,8 +925,9 @@ file_mask_dialog (FileOpContext *ctx, FileOperation operation, const char *text, + /* Create the dialog */ + + ctx->stable_symlinks = 0; +- fmd_widgets[FMDC].result = &source_easy_patterns; +- fmd_widgets[FMDI1].text = easy_patterns ? "*" : "^\\(.*\\)$"; ++ fmd_widgets[FM_USING_SHELL_PATT].result = &source_easy_patterns; ++ fmd_widgets[FM_SRC_INPUT].text = easy_patterns ? "*" : "^\\(.*\\)$"; ++ + Quick_input.xlen = fmd_xlen; + Quick_input.xpos = -1; + Quick_input.title = op_names[operation]; +@@ -895,19 +935,37 @@ file_mask_dialog (FileOpContext *ctx, FileOperation operation, const char *text, + Quick_input.ylen = FMDY; + Quick_input.i18n = 1; + Quick_input.widgets = fmd_widgets; +- fmd_widgets[FMDI0].text = text; +- fmd_widgets[FMDI2].text = def_text_secure; +- fmd_widgets[FMDI2].str_result = &dest_dir; +- fmd_widgets[FMDI1].str_result = &source_mask; ++ fmd_widgets[FM_SRC_TITLE].text = text; ++ fmd_widgets[FM_DST_INPUT].text = def_text_secure; ++ fmd_widgets[FM_DST_INPUT].str_result = &dest_dir; ++ fmd_widgets[FM_SRC_INPUT].str_result = &source_mask; + + *do_background = 0; ++ ++#ifdef HAVE_CHARSET ++ ctx->from_codepage=current_panel->src_codepage; ++ ctx->to_codepage=left_panel->src_codepage; ++ if (left_panel) { ++ ctx->to_codepage=left_panel->src_codepage; ++ if( (current_panel==left_panel) && right_panel ) ctx->to_codepage=right_panel->src_codepage; ++ } ++#endif ++ + ask_file_mask: + ++#ifdef HAVE_CHARSET ++ if(operation!=OP_COPY && operation!=OP_MOVE) { ++ ctx->from_codepage=-1; ++ ctx->to_codepage=-1; ++ } ++ fmd_widgets[FM_FROM_CODEPAGE].text=get_codepage_id(ctx->from_codepage); ++ fmd_widgets[FM_TO_CODEPAGE].text=get_codepage_id(ctx->to_codepage); ++#endif ++ + if ((val = quick_dialog_skip (&Quick_input, SKIP)) == B_CANCEL) { + g_free (def_text_secure); + return 0; + } +- g_free (def_text_secure); + + if (ctx->follow_links) + ctx->stat_func = mc_stat; +@@ -929,6 +987,8 @@ file_mask_dialog (FileOpContext *ctx, FileOperation operation, const char *text, orig_mask = source_mask; if (!dest_dir || !*dest_dir) { g_free (source_mask); ++ g_free (def_text_secure); + g_free(def_text); return dest_dir; } if (source_easy_patterns) { -@@ -981,5 +991,6 @@ file_mask_dialog (FileOpContext *ctx, Fi +@@ -982,5 +1042,48 @@ file_mask_dialog (FileOpContext *ctx, FileOperation operation, const char *text, } if (val == B_USER) *do_background = 1; ++#ifdef HAVE_CHARSET ++ if(val == B_FROM) { ++ if(operation==OP_COPY || operation==OP_MOVE) { ++ if(display_codepage<=0) { ++ message( 1, _(" Warning "), ++ _("To use this feature select your codepage in\n" ++ "Setup / Display Bits dialog!\n" ++ "Do not forget to save options." )); ++ goto ask_file_mask; ++ } ++ ctx->from_codepage=select_charset(ctx->from_codepage,0, ++ _(" Choose \"FROM\" codepage for COPY/MOVE operaion ")); ++ } ++ else ++ message(1,"Warning",_("Recoding works only with COPY or MOVE operation")); ++ goto ask_file_mask; ++ } ++ if(val == B_TO) { ++ if(operation==OP_COPY || operation==OP_MOVE) { ++ if(display_codepage<=0) { ++ message( 1, _(" Warning "), ++ _("To use this feature select your codepage in\n" ++ "Setup / Display Bits dialog!\n" ++ "Do not forget to save options." )); ++ goto ask_file_mask; ++ } ++ ctx->to_codepage=select_charset(ctx->to_codepage,0, ++ _(" Choose \"TO\" codepage for COPY/MOVE operaion ")); ++ } ++ else ++ message(1,"Warning",_("Recoding works only with COPY or MOVE operation")); ++ goto ask_file_mask; ++ } ++ ++ errmsg=my_init_tt(ctx->to_codepage,ctx->from_codepage,ctx->tr_table); ++ if(errmsg) { ++ my_reset_tt(ctx->tr_table,256); ++ message( 1, MSG_ERROR, "%s", errmsg); ++ } ++#endif ++ ++ g_free(def_text_secure); + g_free(def_text); return dest_dir; } -diff -up mc-4.6.2-pre1/src/find.c.utf8 mc-4.6.2-pre1/src/find.c ---- mc-4.6.2-pre1/src/find.c.utf8 2006-02-04 12:03:35.000000000 +0100 -+++ mc-4.6.2-pre1/src/find.c 2008-12-04 13:25:34.000000000 +0100 -@@ -217,7 +217,7 @@ find_parameters (char **start_dir, char +diff --git a/src/fileopctx.c b/src/fileopctx.c +index ad02cf4..904b7f8 100644 +--- a/src/fileopctx.c ++++ b/src/fileopctx.c +@@ -26,8 +26,12 @@ + #include + + #include "global.h" +-#include "fileopctx.h" + ++#ifdef HAVE_CHARSET ++#include "recode.h" ++#endif ++ ++#include "fileopctx.h" + + /** + * file_op_context_new: +@@ -54,6 +58,12 @@ file_op_context_new (FileOperation op) + ctx->umask_kill = 0777777; + ctx->erase_at_end = TRUE; + ++#ifdef HAVE_CHARSET ++ ctx->from_codepage=-1; ++ ctx->to_codepage=-1; ++ my_reset_tt(ctx->tr_table,256); ++#endif ++ + return ctx; + } + +diff --git a/src/fileopctx.h b/src/fileopctx.h +index d2de6a9..339ab42 100644 +--- a/src/fileopctx.h ++++ b/src/fileopctx.h +@@ -108,6 +108,14 @@ typedef struct FileOpContext { + /* User interface data goes here */ + + void *ui; ++ ++#ifdef HAVE_CHARSET ++ /* Recode data */ ++ int from_codepage, to_codepage; ++ unsigned char tr_table[256]; ++ unsigned char recode_buf[MC_MAXPATHLEN]; ++#endif ++ + } FileOpContext; + + +diff --git a/src/find.c b/src/find.c +index 9ff1ef7..daa1d5b 100644 +--- a/src/find.c ++++ b/src/find.c +@@ -219,7 +219,7 @@ find_parameters (char **start_dir, char **pattern, char **content) int l1, maxlen = 0; while (i--) { @@ -2939,7 +3666,7 @@ diff -up mc-4.6.2-pre1/src/find.c.utf8 mc-4.6.2-pre1/src/find.c if (l1 > maxlen) maxlen = l1; } -@@ -226,7 +226,7 @@ find_parameters (char **start_dir, char +@@ -228,7 +228,7 @@ find_parameters (char **start_dir, char **pattern, char **content) FIND_X = i; for (i = sizeof (buts) / sizeof (buts[0]), l1 = 0; i--;) { @@ -2948,7 +3675,7 @@ diff -up mc-4.6.2-pre1/src/find.c.utf8 mc-4.6.2-pre1/src/find.c } l1 += 21; if (l1 > FIND_X) -@@ -235,8 +235,8 @@ find_parameters (char **start_dir, char +@@ -237,8 +237,8 @@ find_parameters (char **start_dir, char **pattern, char **content) ilen = FIND_X - 7 - maxlen; /* for the case of very long buttons :) */ istart = FIND_X - 3 - ilen; @@ -2959,7 +3686,7 @@ diff -up mc-4.6.2-pre1/src/find.c.utf8 mc-4.6.2-pre1/src/find.c i18n_flag = 1; case_label = _(case_label); -@@ -863,7 +863,7 @@ setup_gui (void) +@@ -865,7 +865,7 @@ setup_gui (void) if (!i18n_flag) { register int i = sizeof (fbuts) / sizeof (fbuts[0]); while (i--) @@ -2968,7 +3695,7 @@ diff -up mc-4.6.2-pre1/src/find.c.utf8 mc-4.6.2-pre1/src/find.c fbuts[2].len += 2; /* DEFPUSH_BUTTON */ i18n_flag = 1; } -@@ -1028,7 +1028,7 @@ find_file (char *start_dir, char *patter +@@ -1030,7 +1030,7 @@ find_file (char *start_dir, char *pattern, char *content, char **dirname, if (!next_free) /* first turn i.e clean old list */ panel_clean_dir (current_panel); @@ -2977,10 +3704,11 @@ diff -up mc-4.6.2-pre1/src/find.c.utf8 mc-4.6.2-pre1/src/find.c list->list[next_free].fname = name; list->list[next_free].f.marked = 0; list->list[next_free].f.link_to_dir = link_to_dir; -diff -up mc-4.6.2-pre1/src/help.c.utf8 mc-4.6.2-pre1/src/help.c ---- mc-4.6.2-pre1/src/help.c.utf8 2007-01-20 12:40:45.000000000 +0100 -+++ mc-4.6.2-pre1/src/help.c 2008-12-04 13:25:34.000000000 +0100 -@@ -447,10 +447,28 @@ static void help_show (Dlg_head *h, cons +diff --git a/src/help.c b/src/help.c +index 3261cbb..2f5bdac 100644 +--- a/src/help.c ++++ b/src/help.c +@@ -416,10 +416,28 @@ static void help_show (Dlg_head *h, const char *paint_start) #ifndef HAVE_SLANG addch (acs_map [c]); #else @@ -3000,7 +3728,7 @@ diff -up mc-4.6.2-pre1/src/help.c.utf8 mc-4.6.2-pre1/src/help.c + len = mbrtowc(&wc, p, MB_CUR_MAX, &mbs); + if (len <= 0) len = 1; /* skip broken multibyte chars */ + -+ SLsmg_write_nwchars(&wc, 1); ++ SLsmg_write_nwchars(&wc, 1); + p += len - 1; } else +#endif @@ -3009,7 +3737,7 @@ diff -up mc-4.6.2-pre1/src/help.c.utf8 mc-4.6.2-pre1/src/help.c col++; break; } -@@ -803,6 +821,12 @@ interactive_display (const char *filenam +@@ -772,6 +790,12 @@ interactive_display (const char *filename, const char *node) message (1, MSG_ERROR, _(" Cannot open file %s \n %s "), filename ? filename : hlpfile, unix_error_string (errno)); } @@ -3022,10 +3750,11 @@ diff -up mc-4.6.2-pre1/src/help.c.utf8 mc-4.6.2-pre1/src/help.c if (!filename) g_free (hlpfile); -diff -up mc-4.6.2-pre1/src/hotlist.c.utf8 mc-4.6.2-pre1/src/hotlist.c ---- mc-4.6.2-pre1/src/hotlist.c.utf8 2006-08-08 14:17:14.000000000 +0200 -+++ mc-4.6.2-pre1/src/hotlist.c 2008-12-04 13:25:34.000000000 +0100 -@@ -563,7 +563,7 @@ init_i18n_stuff(int list_type, int cols) +diff --git a/src/hotlist.c b/src/hotlist.c +index 737c9c1..74f9568 100644 +--- a/src/hotlist.c ++++ b/src/hotlist.c +@@ -566,7 +566,7 @@ init_i18n_stuff(int list_type, int cols) row = hotlist_but [i].y; ++count [row]; @@ -3034,7 +3763,7 @@ diff -up mc-4.6.2-pre1/src/hotlist.c.utf8 mc-4.6.2-pre1/src/hotlist.c if (hotlist_but [i].flags == DEFPUSH_BUTTON) len [row] += 2; } -@@ -588,12 +588,12 @@ init_i18n_stuff(int list_type, int cols) +@@ -591,12 +591,12 @@ init_i18n_stuff(int list_type, int cols) /* not first int the row */ if (!strcmp (hotlist_but [i].text, cancel_but)) hotlist_but [i].x = @@ -3049,7 +3778,7 @@ diff -up mc-4.6.2-pre1/src/hotlist.c.utf8 mc-4.6.2-pre1/src/hotlist.c + (hotlist_but [i].flags == DEFPUSH_BUTTON ? 5 : 3); } } -@@ -834,7 +834,7 @@ static void add_widgets_i18n(QuickWidget +@@ -837,7 +837,7 @@ static void add_widgets_i18n(QuickWidget* qw, int len) for (i = 0; i < 3; i++) { qw [i].text = _(qw [i].text); @@ -3058,7 +3787,7 @@ diff -up mc-4.6.2-pre1/src/hotlist.c.utf8 mc-4.6.2-pre1/src/hotlist.c } space = (len - 4 - l[0] - l[1] - l[2]) / 4; -@@ -883,7 +883,7 @@ add_new_entry_input (const char *header, +@@ -886,7 +886,7 @@ add_new_entry_input (const char *header, const char *text1, const char *text2, msglen(text1, &lines1, &cols1); msglen(text2, &lines2, &cols2); @@ -3067,7 +3796,7 @@ diff -up mc-4.6.2-pre1/src/hotlist.c.utf8 mc-4.6.2-pre1/src/hotlist.c len = max (len, cols2) + 4; len = max (len, 64); -@@ -979,7 +979,7 @@ add_new_group_input (const char *header, +@@ -982,7 +982,7 @@ add_new_group_input (const char *header, const char *label, char **result) #endif /* ENABLE_NLS */ msglen (label, &lines, &cols); @@ -3076,7 +3805,7 @@ diff -up mc-4.6.2-pre1/src/hotlist.c.utf8 mc-4.6.2-pre1/src/hotlist.c len = max (len, 64); #ifdef ENABLE_NLS -@@ -1035,7 +1035,7 @@ void add2hotlist_cmd (void) +@@ -1038,7 +1038,7 @@ void add2hotlist_cmd (void) { char *prompt, *label; const char *cp = _("Label for \"%s\":"); @@ -3085,10 +3814,11 @@ diff -up mc-4.6.2-pre1/src/hotlist.c.utf8 mc-4.6.2-pre1/src/hotlist.c char *label_string = g_strdup (current_panel->cwd); strip_password (label_string, 1); -diff -up mc-4.6.2-pre1/src/layout.c.utf8 mc-4.6.2-pre1/src/layout.c ---- mc-4.6.2-pre1/src/layout.c.utf8 2006-11-08 14:37:25.000000000 +0100 -+++ mc-4.6.2-pre1/src/layout.c 2008-12-04 13:25:34.000000000 +0100 -@@ -366,36 +366,36 @@ init_layout (void) +diff --git a/src/layout.c b/src/layout.c +index 9f3616f..c759348 100644 +--- a/src/layout.c ++++ b/src/layout.c +@@ -367,36 +367,36 @@ init_layout (void) while (i--) { s_split_direction[i] = _(s_split_direction[i]); @@ -3132,7 +3862,7 @@ diff -up mc-4.6.2-pre1/src/layout.c.utf8 mc-4.6.2-pre1/src/layout.c if (l1 > second_width) second_width = l1; } -@@ -409,14 +409,14 @@ init_layout (void) +@@ -410,14 +410,14 @@ init_layout (void) * * Now the last thing to do - properly space buttons... */ @@ -3152,7 +3882,7 @@ diff -up mc-4.6.2-pre1/src/layout.c.utf8 mc-4.6.2-pre1/src/layout.c i18n_layt_flag = 1; } -@@ -684,7 +684,7 @@ setup_panels (void) +@@ -681,7 +681,7 @@ setup_panels (void) panel_do_cols (0); panel_do_cols (1); @@ -3161,10 +3891,11 @@ diff -up mc-4.6.2-pre1/src/layout.c.utf8 mc-4.6.2-pre1/src/layout.c widget_set_size (&the_menubar->widget, 0, 0, 1, COLS); -diff -up mc-4.6.2-pre1/src/learn.c.utf8 mc-4.6.2-pre1/src/learn.c ---- mc-4.6.2-pre1/src/learn.c.utf8 2005-05-27 05:35:15.000000000 +0200 -+++ mc-4.6.2-pre1/src/learn.c 2008-12-04 13:25:34.000000000 +0100 -@@ -237,7 +237,7 @@ init_learn (void) +diff --git a/src/learn.c b/src/learn.c +index dff560c..cc6ec93 100644 +--- a/src/learn.c ++++ b/src/learn.c +@@ -238,7 +238,7 @@ init_learn (void) learn_but[0].x = 78 / 2 + 4; learn_but[1].text = _(learn_but[1].text); @@ -3173,10 +3904,45 @@ diff -up mc-4.6.2-pre1/src/learn.c.utf8 mc-4.6.2-pre1/src/learn.c learn_title = _(learn_title); i18n_flag = 1; -diff -up mc-4.6.2-pre1/src/main.c.utf8 mc-4.6.2-pre1/src/main.c ---- mc-4.6.2-pre1/src/main.c.utf8 2006-09-22 17:14:58.000000000 +0200 -+++ mc-4.6.2-pre1/src/main.c 2008-12-04 13:25:34.000000000 +0100 -@@ -704,7 +704,7 @@ load_prompt (int fd, void *unused) +diff --git a/src/main.c b/src/main.c +index db26945..edf6a03 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -82,6 +82,7 @@ + + #ifdef HAVE_CHARSET + #include "charsets.h" ++#include "recode.h" + #endif /* HAVE_CHARSET */ + + #ifdef USE_VFS +@@ -98,6 +99,7 @@ + /* The structures for the panels */ + WPanel *left_panel = NULL; + WPanel *right_panel = NULL; ++WPanel* ret_panel=NULL; + + /* The pointer to the tree */ + WTree *the_tree = NULL; +@@ -276,6 +278,9 @@ int midnight_shutdown = 0; + /* The user's shell */ + const char *shell = NULL; + ++/* Is the LANG UTF-8 ? */ ++gboolean is_utf8 = FALSE; ++ + /* mc_home: The home of MC */ + char *mc_home = NULL; + +@@ -587,6 +592,7 @@ _do_panel_cd (WPanel *panel, const char *new_dir, enum cd_enum cd_type) + } + directory = *new_dir ? new_dir : home_dir; + ++ ret_panel=panel; + if (mc_chdir (directory) == -1) { + strcpy (panel->cwd, olddir); + g_free (olddir); +@@ -706,7 +712,7 @@ load_prompt (int fd, void *unused) int prompt_len; tmp_prompt = strip_ctrl_codes (subshell_prompt); @@ -3185,7 +3951,29 @@ diff -up mc-4.6.2-pre1/src/main.c.utf8 mc-4.6.2-pre1/src/main.c /* Check for prompts too big */ if (COLS > 8 && prompt_len > COLS - 8) { -@@ -1610,7 +1610,11 @@ update_xterm_title_path (void) +@@ -808,6 +814,10 @@ static menu_entry LeftMenu[] = { + {' ', N_("&Quick view C-x q"), 'Q', quick_view_cmd}, + {' ', N_("&Info C-x i"), 'I', info_cmd}, + {' ', N_("&Tree"), 'T', tree_cmd}, ++#ifdef HAVE_CHARSET ++ {' ', "", ' ', 0}, ++ {' ', N_("Panel &codepage"), 'C', fnc_l_cmd}, ++#endif + {' ', "", ' ', 0}, + {' ', N_("&Sort order..."), 'S', sort_cmd}, + {' ', "", ' ', 0}, +@@ -832,6 +842,10 @@ static menu_entry RightMenu[] = { + {' ', N_("&Quick view C-x q"), 'Q', quick_view_cmd}, + {' ', N_("&Info C-x i"), 'I', info_cmd}, + {' ', N_("&Tree"), 'T', tree_cmd}, ++#ifdef HAVE_CHARSET ++ {' ', "", ' ', 0}, ++ {' ', N_("Panel &codepage"), 'C', fnc_r_cmd}, ++#endif + {' ', "", ' ', 0}, + {' ', N_("&Sort order..."), 'S', sort_cmd}, + {' ', "", ' ', 0}, +@@ -1614,7 +1628,11 @@ update_xterm_title_path (void) if (xterm_flag && xterm_title) { p = s = g_strdup (strip_home_and_password (current_panel->cwd)); do { @@ -3196,11 +3984,41 @@ diff -up mc-4.6.2-pre1/src/main.c.utf8 mc-4.6.2-pre1/src/main.c +#endif /* UTF8 */ *s = '?'; } while (*++s); - fprintf (stdout, "\33]0;mc - %s\7", p); -diff -up mc-4.6.2-pre1/src/menu.c.utf8 mc-4.6.2-pre1/src/menu.c ---- mc-4.6.2-pre1/src/menu.c.utf8 2005-09-05 04:12:09.000000000 +0200 -+++ mc-4.6.2-pre1/src/menu.c 2008-12-04 13:25:34.000000000 +0100 -@@ -22,6 +22,7 @@ + if (!alternate_plus_minus) +@@ -2122,6 +2140,16 @@ handle_args (int argc, char *argv[]) + int + main (int argc, char *argv[]) + { ++ /* Check whether we have UTF-8 locale */ ++ char *lang = getenv("LANG"); ++ size_t len = 0; ++ ++ if ( lang ) ++ len = strlen(lang); ++ ++ if ( len >= 5 && !strcasecmp(&lang[len-5],"UTF-8") ) ++ is_utf8 = TRUE; ++ + /* We had LC_CTYPE before, LC_ALL includs LC_TYPE as well */ + setlocale (LC_ALL, ""); + bindtextdomain ("mc", LOCALEDIR); +diff --git a/src/main.h b/src/main.h +index 3f3c695..fca81e7 100644 +--- a/src/main.h ++++ b/src/main.h +@@ -69,6 +69,7 @@ extern int alternate_plus_minus; + extern int only_leading_plus_minus; + extern int output_starts_shell; + extern int midnight_shutdown; ++extern gboolean is_utf8; + extern char cmd_buf [512]; + extern const char *shell; + +diff --git a/src/menu.c b/src/menu.c +index f291071..862eea8 100644 +--- a/src/menu.c ++++ b/src/menu.c +@@ -23,6 +23,7 @@ #include #include @@ -3208,7 +4026,7 @@ diff -up mc-4.6.2-pre1/src/menu.c.utf8 mc-4.6.2-pre1/src/menu.c #include "global.h" #include "tty.h" -@@ -53,35 +54,95 @@ create_menu (const char *name, menu_entr +@@ -54,35 +55,95 @@ create_menu (const char *name, menu_entry *entries, int count, const char *help_ { Menu *menu; const char *cp; @@ -3310,7 +4128,7 @@ diff -up mc-4.6.2-pre1/src/menu.c.utf8 mc-4.6.2-pre1/src/menu.c menu->start_x = 0; menu->help_node = g_strdup (help_node); return menu; -@@ -112,8 +173,26 @@ static void menubar_paint_idx (WMenu *me +@@ -113,8 +174,26 @@ static void menubar_paint_idx (WMenu *menubar, int idx, int color) const char *text; addch((unsigned char)menu->entries [idx].first_letter); @@ -3339,7 +4157,7 @@ diff -up mc-4.6.2-pre1/src/menu.c.utf8 mc-4.6.2-pre1/src/menu.c if (*text != '&') addch(*text); else { -@@ -122,7 +201,7 @@ static void menubar_paint_idx (WMenu *me +@@ -123,7 +202,7 @@ static void menubar_paint_idx (WMenu *menubar, int idx, int color) addch(*(++text)); attrset(color); } @@ -3348,7 +4166,7 @@ diff -up mc-4.6.2-pre1/src/menu.c.utf8 mc-4.6.2-pre1/src/menu.c } widget_move (&menubar->widget, y, x + 1); } -@@ -168,6 +247,12 @@ static void menubar_draw (WMenu *menubar +@@ -169,6 +248,12 @@ static void menubar_draw (WMenu *menubar) if (menubar->active) attrset(i == menubar->selected?MENU_SELECTED_COLOR:SELECTED_COLOR); widget_move (&menubar->widget, 0, menubar->menu [i]->start_x); @@ -3361,7 +4179,7 @@ diff -up mc-4.6.2-pre1/src/menu.c.utf8 mc-4.6.2-pre1/src/menu.c tty_printf ("%s", menubar->menu [i]->name); } -@@ -493,7 +578,13 @@ menubar_arrange(WMenu* menubar) +@@ -494,7 +579,13 @@ menubar_arrange(WMenu* menubar) for (i = 0; i < items; i++) { @@ -3371,12 +4189,12 @@ diff -up mc-4.6.2-pre1/src/menu.c.utf8 mc-4.6.2-pre1/src/menu.c + if (menubar->menu[i]->wname) + len = wcslen (menubar->menu[i]->wname); + else -+#endif ++#endif + len = strlen(menubar->menu[i]->name); menubar->menu[i]->start_x = start_x; start_x += len + gap; } -@@ -506,7 +597,13 @@ menubar_arrange(WMenu* menubar) +@@ -507,7 +598,13 @@ menubar_arrange(WMenu* menubar) for (i = 0; i < items; i++) { /* preserve length here, to be used below */ @@ -3391,7 +4209,7 @@ diff -up mc-4.6.2-pre1/src/menu.c.utf8 mc-4.6.2-pre1/src/menu.c } gap /= (items - 1); -@@ -530,6 +627,9 @@ menubar_arrange(WMenu* menubar) +@@ -531,6 +628,9 @@ menubar_arrange(WMenu* menubar) void destroy_menu (Menu *menu) { @@ -3401,9 +4219,10 @@ diff -up mc-4.6.2-pre1/src/menu.c.utf8 mc-4.6.2-pre1/src/menu.c g_free (menu->name); g_free (menu->help_node); g_free (menu); -diff -up mc-4.6.2-pre1/src/menu.h.utf8 mc-4.6.2-pre1/src/menu.h ---- mc-4.6.2-pre1/src/menu.h.utf8 2004-12-03 20:17:47.000000000 +0100 -+++ mc-4.6.2-pre1/src/menu.h 2008-12-04 13:25:34.000000000 +0100 +diff --git a/src/menu.h b/src/menu.h +index e3e043e..8f52351 100644 +--- a/src/menu.h ++++ b/src/menu.h @@ -21,6 +21,8 @@ typedef struct Menu { menu_entry *entries; int start_x; /* position relative to menubar start */ @@ -3413,9 +4232,10 @@ diff -up mc-4.6.2-pre1/src/menu.h.utf8 mc-4.6.2-pre1/src/menu.h } Menu; extern int menubar_visible; -diff -up mc-4.6.2-pre1/src/myslang.h.utf8 mc-4.6.2-pre1/src/myslang.h ---- mc-4.6.2-pre1/src/myslang.h.utf8 2005-09-05 05:22:04.000000000 +0200 -+++ mc-4.6.2-pre1/src/myslang.h 2008-12-04 13:25:34.000000000 +0100 +diff --git a/src/myslang.h b/src/myslang.h +index 17057e7..774b310 100644 +--- a/src/myslang.h ++++ b/src/myslang.h @@ -11,6 +11,16 @@ #endif /* HAVE_SLANG_SLANG_H */ #endif @@ -3433,10 +4253,11 @@ diff -up mc-4.6.2-pre1/src/myslang.h.utf8 mc-4.6.2-pre1/src/myslang.h enum { KEY_BACKSPACE = 400, KEY_END, KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, -diff -up mc-4.6.2-pre1/src/option.c.utf8 mc-4.6.2-pre1/src/option.c ---- mc-4.6.2-pre1/src/option.c.utf8 2006-02-28 17:15:21.000000000 +0100 -+++ mc-4.6.2-pre1/src/option.c 2008-12-04 13:25:34.000000000 +0100 -@@ -123,12 +123,12 @@ init_configure (void) +diff --git a/src/option.c b/src/option.c +index 2898266..b22c5f2 100644 +--- a/src/option.c ++++ b/src/option.c +@@ -124,12 +124,12 @@ init_configure (void) title2 = _(" Pause after run... "); title3 = _(" Other options "); @@ -3452,7 +4273,7 @@ diff -up mc-4.6.2-pre1/src/option.c.utf8 mc-4.6.2-pre1/src/option.c if (i >= OTHER_OPTIONS) { if (l1 > first_width) first_width = l1; -@@ -141,23 +141,23 @@ init_configure (void) +@@ -142,23 +142,23 @@ init_configure (void) i = PAUSE_OPTIONS; while (i--) { pause_options[i] = _(pause_options[i]); @@ -3483,10 +4304,43 @@ diff -up mc-4.6.2-pre1/src/option.c.utf8 mc-4.6.2-pre1/src/option.c i18n_config_flag = 1; } -diff -up mc-4.6.2-pre1/src/panelize.c.utf8 mc-4.6.2-pre1/src/panelize.c ---- mc-4.6.2-pre1/src/panelize.c.utf8 2005-05-27 05:35:15.000000000 +0200 -+++ mc-4.6.2-pre1/src/panelize.c 2008-12-04 13:25:34.000000000 +0100 -@@ -127,7 +127,7 @@ init_panelize (void) +diff --git a/src/panel.h b/src/panel.h +index 844f359..05ec163 100644 +--- a/src/panel.h ++++ b/src/panel.h +@@ -72,6 +72,19 @@ typedef struct WPanel { + + int searching; + char search_buffer [256]; ++ ++#ifdef HAVE_CHARSET ++ int src_codepage; ++ unsigned char tr_table[256], tr_table_input[256]; ++#endif ++ ++#ifdef USE_VFS ++ #ifdef HAVE_CHARSET ++ int ret_codepage; ++ #endif ++ int is_return; ++ char retdir[MC_MAXPATHLEN]; ++#endif + } WPanel; + + WPanel *panel_new (const char *panel_name); +@@ -97,6 +110,7 @@ int set_panel_formats (WPanel *p); + extern WPanel *left_panel; + extern WPanel *right_panel; + extern WPanel *current_panel; ++extern WPanel* ret_panel; + + void try_to_select (WPanel *panel, const char *name); + +diff --git a/src/panelize.c b/src/panelize.c +index ef80619..d932241 100644 +--- a/src/panelize.c ++++ b/src/panelize.c +@@ -129,7 +129,7 @@ init_panelize (void) i = sizeof (panelize_but) / sizeof (panelize_but[0]); while (i--) { panelize_but[i].text = _(panelize_but[i].text); @@ -3495,7 +4349,7 @@ diff -up mc-4.6.2-pre1/src/panelize.c.utf8 mc-4.6.2-pre1/src/panelize.c } maxlen += 10; -@@ -136,11 +136,11 @@ init_panelize (void) +@@ -138,11 +138,11 @@ init_panelize (void) panelize_cols = max (panelize_cols, maxlen); panelize_but[2].x = @@ -3510,15 +4364,241 @@ diff -up mc-4.6.2-pre1/src/panelize.c.utf8 mc-4.6.2-pre1/src/panelize.c #endif /* ENABLE_NLS */ -diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c ---- mc-4.6.2-pre1/src/screen.c.utf8 2007-08-24 14:22:29.000000000 +0200 -+++ mc-4.6.2-pre1/src/screen.c 2008-12-04 13:25:34.000000000 +0100 -@@ -171,21 +171,56 @@ add_permission_string (char *dest, int w +diff --git a/src/recode.c b/src/recode.c +new file mode 100644 +index 0000000..b485dfc +--- /dev/null ++++ b/src/recode.c +@@ -0,0 +1,153 @@ ++#include "recode.h" ++#ifdef HAVE_CHARSET ++ ++char *lang; ++char lang_codepage_name[256]; ++int lang_codepage; ++ ++int ftp_codepage=-1; ++ ++// recode buffer for displaying file names ++unsigned char recode_buf[MC_MAXPATHLEN]; ++ ++WPanel* recode_panel; ++ ++//--- get codepage from $LANG ++void get_locale_codepage() { ++ char* a; ++ char* b; ++ int len; ++ ++ lang=getenv("LANG"); ++ if(!lang) { ++ strncpy(lang_codepage_name,OTHER_8BIT, sizeof(OTHER_8BIT)); ++ lang_codepage=-1; ++ return; ++ } ++ ++ a=strchr(lang,'.'); ++ if(!a) { ++ strncpy(lang_codepage_name,OTHER_8BIT, sizeof(OTHER_8BIT)); ++ lang_codepage=-1; ++ return; ++ } ++ ++a; ++ ++ b=strchr(lang,'@'); ++ if(!b) b=lang+strlen(lang); ++ ++ len=b-a; ++ if(len>=sizeof(lang_codepage_name)) len=sizeof(lang_codepage_name)-1; ++ ++ memcpy(lang_codepage_name,a, len); ++ lang_codepage_name[len]='\0'; ++ lang_codepage=get_codepage_index(lang_codepage_name); ++ if(lang_codepage<0) strncpy(lang_codepage_name,OTHER_8BIT, sizeof(OTHER_8BIT)); ++} ++ ++//--- reset translation table ++void my_reset_tt(unsigned char *table,int n) { ++ int i; ++ for(i=0;isrc_codepage=-1; ++ my_reset_tt(p->tr_table,256); ++ my_reset_tt(p->tr_table_input,256); ++} ++ ++//--- Initialize translation table ++// i need this function because init_translation_table from ++// charsets.c fills only fixed translation tables conv_displ and conv_input ++//--- ++char* my_init_tt( int from, int to, unsigned char *table) { ++ int i; ++ iconv_t cd; ++ char *cpfrom, *cpto; ++ ++ if(from < 0 || to < 0 || from == to) { ++ my_reset_tt(table,256); ++ return NULL; ++ } ++ my_reset_tt(table,128); ++ cpfrom=codepages[from ].id; ++ cpto=codepages[to].id; ++ cd=iconv_open(cpfrom, cpto); ++ if(cd==(iconv_t)-1) { ++ snprintf(errbuf, 255, _("Cannot translate from %s to %s"), cpfrom, cpto); ++ return errbuf; ++ } ++ for(i=128; i<=255; ++i) table[i] = translate_character(cd, i); ++ iconv_close(cd); ++ return NULL; ++} ++ ++//--- Translate string from one codepage to another ++void my_translate_string(unsigned char *s1,int l1, unsigned char *s2, unsigned char *table) { ++ int i=0; ++ if(!s1) return; ++ while(irecode_buf,ctx->tr_table); ++ if (dir [i-1] == PATH_SEP) ++ return g_strconcat (dir, ctx->recode_buf, NULL); ++ else ++ return g_strconcat (dir, PATH_SEP_STR, ctx->recode_buf, NULL); ++ return 0; ++} ++ ++ ++//--- Internal handler for "Panel codepage" ++static void fnc_cmd(WPanel *p) { ++ char *errmsg; ++ if(display_codepage > 0) { ++ p->src_codepage=select_charset(p->src_codepage, 0, _(" Choose panel codepage ")); ++ errmsg=my_init_tt(display_codepage,p->src_codepage,p->tr_table); ++ if(errmsg) { ++ panel_reset_codepage(p); ++ message( 1, MSG_ERROR, "%s", errmsg); ++ } ++ errmsg=my_init_tt(p->src_codepage,display_codepage,p->tr_table_input); ++ if (errmsg) { ++ panel_reset_codepage(p); ++ message( 1, MSG_ERROR, "%s", errmsg ); ++ } ++ paint_dir(p); ++ show_dir(p); ++ display_mini_info(p); ++ } ++ else { ++ message( 1, _(" Warning "), ++ _("To use this feature select your codepage in\n" ++ "Setup / Display Bits dialog!\n" ++ "Do not forget to save options." )); ++ } ++} ++ ++//--- Menu handlers for "Panel codepage" for left and right panel menu ++ ++void fnc_l_cmd() { ++ fnc_cmd(left_panel); ++} ++ ++void fnc_r_cmd() { ++ fnc_cmd(right_panel); ++} ++ ++//--- screen handler for "Panel codepage" ++void fnc_c_cmd(WPanel *panel) { ++ fnc_cmd(current_panel); ++} ++ ++#endif //HAVE_CHARSET +diff --git a/src/recode.h b/src/recode.h +new file mode 100644 +index 0000000..8e817ea +--- /dev/null ++++ b/src/recode.h +@@ -0,0 +1,48 @@ ++#ifndef __RECODE_H__ ++#define __RECODE_H__ ++#include ++#ifdef HAVE_CHARSET ++ ++#include ++#include ++#include ++ ++#include "global.h" ++#include "wtools.h" ++#include "panel.h" ++#include "charsets.h" ++#include "selcodepage.h" ++#include "screen.h" ++#include "main.h" ++#include "fileopctx.h" ++ ++extern char *lang; ++extern char lang_codepage_name[256]; ++extern int lang_codepage; ++ ++extern int ftp_codepage; ++ ++// recode buffer for displaying file names ++extern unsigned char recode_buf[MC_MAXPATHLEN]; ++extern WPanel* recode_panel; ++ ++//--- get codepage from $LANG ++extern void get_locale_codepage(); ++ ++//--- reset translation table ++extern void my_reset_tt(unsigned char *table,int n); ++//--- reset panel codepage ++extern void panel_reset_codepage(WPanel *p); ++//--- Initialize translation table ++extern char* my_init_tt( int from, int to, unsigned char *table); ++//--- Translate string from one codepage to another ++extern void my_translate_string(unsigned char *s1,int l1, unsigned char *s2, unsigned char *table); ++//--- Recode filename and concat in to dir ++extern char* concat_dir_and_recoded_fname(const char *dir, const char *fname, FileOpContext *ctx); ++//--- handlers for "Panel codepage" ++extern void fnc_l_cmd(); ++extern void fnc_r_cmd(); ++extern void fnc_c_cmd(WPanel *panel); ++ ++#endif // HAVE_CHARSET ++#endif //__RECODE_H__ +diff --git a/src/screen.c b/src/screen.c +index 6c3821b..1f938bc 100644 +--- a/src/screen.c ++++ b/src/screen.c +@@ -52,6 +52,10 @@ + #include "main.h" /* the_menubar */ + #include "unixcompat.h" + ++#ifdef HAVE_CHARSET ++#include "recode.h" ++#endif ++ + #define ELEMENTS(arr) ( sizeof(arr) / sizeof((arr)[0]) ) + + #define J_LEFT 1 +@@ -173,21 +177,64 @@ add_permission_string (char *dest, int width, file_entry *fe, int attr, int colo static const char * string_file_name (file_entry *fe, int len) { - static char buffer [MC_MAXPATHLEN + 1]; size_t i; ++ char* filename; - for (i = 0; i < sizeof(buffer) - 1; i++) { - char c; @@ -3536,14 +4616,22 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c - if (!c) - break; ++#ifdef HAVE_CHARSET ++ my_translate_string(fe->fname,fe->fnamelen, recode_buf, recode_panel->tr_table); ++ filename= recode_buf; ++#else ++ filename=fe->fname; ++#endif + +- if (!is_printable(c)) +- c = '?'; +#ifdef UTF8 + if (SLsmg_Is_Unicode) + for (i = 0; i < sizeof (buffer) - 1; i++) { + wchar_t wc; + int len; -- if (!is_printable(c)) -- c = '?'; +- buffer[i] = c; + len = mbrtowc (&wc, str, mbmax, &s); + if (!len) + break; @@ -3568,9 +4656,8 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c + for (i = 0; i < sizeof(buffer) - 1; i++) { + char c; + -+ c = fe->fname[i]; - -- buffer[i] = c; ++ c = filename[i]; ++ + if (!c) break; + + if (!is_printable(c)) c = '?'; @@ -3579,7 +4666,7 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c } buffer[i] = 0; -@@ -450,42 +485,6 @@ static struct { +@@ -452,42 +499,6 @@ static struct { { "dot", 1, 0, J_RIGHT, " ", 0, string_dot, NULL }, }; @@ -3622,7 +4709,7 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c static int file_compute_color (int attr, file_entry *fe) { -@@ -539,14 +538,18 @@ file_compute_color (int attr, file_entry +@@ -541,14 +552,18 @@ file_compute_color (int attr, file_entry *fe) /* Formats the file number file_index of panel in the buffer dest */ static void @@ -3644,7 +4731,7 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c length = 0; empty_line = (file_index >= panel->count); -@@ -564,34 +567,137 @@ format_file (char *dest, int limit, WPan +@@ -566,34 +581,137 @@ format_file (char *dest, int limit, WPanel *panel, int file_index, int width, in break; if (format->string_fn){ @@ -3735,7 +4822,7 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c + int width2 = 0; + int len1 = len / 2; + int len2; -+ ++ + while (1) { + int w = wcwidth(((wchar_t *) buffer)[n1]); + if (width1 + w <= len1) { @@ -3756,7 +4843,7 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c + else + break; + } -+ ++ + + SLsmg_write_nwchars ((wchar_t *) buffer, n1); + SLsmg_write_nwchars (L"~", 1); @@ -3764,7 +4851,7 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c + SLsmg_write_nwchars (((wchar_t *) buffer) + + txtlen - n2, n2); + } else -+ SLsmg_write_nwchars ((wchar_t *) buffer, len); ++ SLsmg_write_nwchars ((wchar_t *) buffer + still, len); + } else { + printw ("%*s", still, ""); + SLsmg_write_nwchars ((wchar_t *) buffer, txtlen); @@ -3784,27 +4871,31 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c + 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); -@@ -614,7 +720,6 @@ repaint_file (WPanel *panel, int file_in +@@ -616,7 +734,10 @@ repaint_file (WPanel *panel, int file_index, int mv, int attr, int isstatus) { int second_column = 0; int width, offset; - char buffer [BUF_MEDIUM]; ++ ++#ifdef HAVE_CHARSET ++ recode_panel=panel; ++#endif offset = 0; if (!isstatus && panel->split){ -@@ -643,7 +748,7 @@ repaint_file (WPanel *panel, int file_in +@@ -645,7 +766,7 @@ repaint_file (WPanel *panel, int file_index, int mv, int attr, int isstatus) widget_move (&panel->widget, file_index - panel->top_file + 2, 1); } @@ -3813,7 +4904,16 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c if (!isstatus && panel->split){ if (second_column) -@@ -692,7 +797,7 @@ display_mini_info (WPanel *panel) +@@ -657,7 +778,7 @@ repaint_file (WPanel *panel, int file_index, int mv, int attr, int isstatus) + } + } + +-static void ++void + display_mini_info (WPanel *panel) + { + if (!show_mini_info) +@@ -694,7 +815,7 @@ display_mini_info (WPanel *panel) ngettext("%s in %d file", "%s in %d files", panel->marked), b_bytes, panel->marked); @@ -3822,7 +4922,69 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c buffer [cols] = 0; p += 2; } else -@@ -1104,6 +1209,12 @@ paint_frame (WPanel *panel) +@@ -727,7 +848,7 @@ display_mini_info (WPanel *panel) + return; + } + +-static void ++void + paint_dir (WPanel *panel) + { + int i; +@@ -765,7 +886,7 @@ mini_info_separator (WPanel *panel) + #endif /* !HAVE_SLANG */ + } + +-static void ++void + show_dir (WPanel *panel) + { + char *tmp; +@@ -785,6 +906,9 @@ show_dir (WPanel *panel) + } + #endif /* HAVE_SLANG */ + ++ vscrollbar (panel->widget, panel->widget.lines, panel->widget.cols-1, 2, 2, ++ panel->selected, panel->count, TRUE); ++ + if (panel->active) + attrset (REVERSE_COLOR); + +@@ -794,8 +918,15 @@ show_dir (WPanel *panel) + tmp = g_malloc (panel->widget.cols + 1); + tmp[panel->widget.cols] = '\0'; + ++#ifdef HAVE_CHARSET ++ my_translate_string(panel->cwd,strlen(panel->cwd),recode_buf, panel->tr_table); ++ trim (strip_home_and_password (recode_buf), tmp, ++ min (max (panel->widget.cols - 7, 0), panel->widget.cols) ); ++ #else + trim (strip_home_and_password (panel->cwd), tmp, + max (panel->widget.cols - 9, 0)); ++#endif ++ + addstr (tmp); + g_free (tmp); + +@@ -1008,6 +1139,17 @@ panel_new (const char *panel_name) + mc_get_current_wd (panel->cwd, sizeof (panel->cwd) - 2); + strcpy (panel->lwd, "."); + ++#ifdef HAVE_CHARSET ++ panel_reset_codepage(panel); ++#endif ++ ++#ifdef USE_VFS ++ panel->is_return=0; ++ #ifdef HAVE_CHARSET ++ panel->ret_codepage=-1; ++ #endif ++#endif ++ + panel->hist_name = g_strconcat ("Dir Hist ", panel_name, (char *) NULL); + panel->dir_history = history_get (panel->hist_name); + directory_history_add (panel, panel->cwd); +@@ -1107,6 +1249,12 @@ paint_frame (WPanel *panel) int side, width; const char *txt; @@ -3835,7 +4997,7 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c if (!panel->split) adjust_top_file (panel); -@@ -1128,16 +1239,38 @@ paint_frame (WPanel *panel) +@@ -1131,16 +1279,38 @@ paint_frame (WPanel *panel) if (format->string_fn){ txt = format->title; @@ -3877,7 +5039,16 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c } else { attrset (NORMAL_COLOR); one_vline (); -@@ -1894,11 +2027,24 @@ do_search (WPanel *panel, int c_code) +@@ -1358,7 +1528,7 @@ use_display_format (WPanel *panel, const char *format, char **error, int isstatu + panel->dirty = 1; + + /* Status needn't to be split */ +- usable_columns = ((panel->widget.cols-2)/((isstatus) ++ usable_columns = ((panel->widget.cols-3)/((isstatus) + ? 1 + : (panel->split+1))) - (!isstatus && panel->split); + +@@ -1897,11 +2067,24 @@ do_search (WPanel *panel, int c_code) int i; int wrapped = 0; int found; @@ -3904,7 +5075,7 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c } else { if (c_code && l < sizeof (panel->search_buffer)) { panel->search_buffer[l] = c_code; -@@ -1907,6 +2053,14 @@ do_search (WPanel *panel, int c_code) +@@ -1910,6 +2093,14 @@ do_search (WPanel *panel, int c_code) } } @@ -3919,7 +5090,7 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c found = 0; for (i = panel->selected; !wrapped || i != panel->selected; i++) { if (i >= panel->count) { -@@ -1917,9 +2071,9 @@ do_search (WPanel *panel, int c_code) +@@ -1920,9 +2111,9 @@ do_search (WPanel *panel, int c_code) } if (panel-> case_sensitive @@ -3931,7 +5102,7 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c unselect_item (panel); panel->selected = i; select_item (panel); -@@ -1928,7 +2082,7 @@ do_search (WPanel *panel, int c_code) +@@ -1931,7 +2122,7 @@ do_search (WPanel *panel, int c_code) } } if (!found) @@ -3940,10 +5111,196 @@ diff -up mc-4.6.2-pre1/src/screen.c.utf8 mc-4.6.2-pre1/src/screen.c paint_panel (panel); } -diff -up mc-4.6.2-pre1/src/slint.c.utf8 mc-4.6.2-pre1/src/slint.c ---- mc-4.6.2-pre1/src/slint.c.utf8 2005-09-05 04:14:29.000000000 +0200 -+++ mc-4.6.2-pre1/src/slint.c 2008-12-04 13:25:34.000000000 +0100 -@@ -141,7 +141,9 @@ void +@@ -2160,7 +2351,12 @@ static const panel_key_map panel_keymap [] = { + { XCTRL('n'), move_down }, /* C-n like emacs */ + { XCTRL('s'), start_search }, /* C-s like emacs */ + { ALT('s'), start_search }, /* M-s not like emacs */ ++#ifndef HAVE_CHARSET + { XCTRL('t'), mark_file }, ++#endif ++#ifdef HAVE_CHARSET ++ { XCTRL('t'), mark_file }, /* was 'fnc_c_cmd' */ ++#endif + { ALT('o'), chdir_other_panel }, + { ALT('i'), sync_other_panel }, + { ALT('l'), chdir_to_readlink }, +diff --git a/src/screen.h b/src/screen.h +new file mode 100644 +index 0000000..4efb525 +--- /dev/null ++++ b/src/screen.h +@@ -0,0 +1,11 @@ ++#ifndef __SCREEN_H__ ++#define __SCREEN_H__ ++#include ++ ++#include "global.h" ++ ++extern void paint_dir (WPanel *panel); ++extern void display_mini_info (WPanel *panel); ++extern void show_dir(WPanel *panel); ++#endif //__SCREEN_H__ ++ +diff --git a/src/selcodepage.c b/src/selcodepage.c +index 3e9ec63..dabed0e 100644 +--- a/src/selcodepage.c ++++ b/src/selcodepage.c +@@ -45,14 +45,16 @@ get_hotkey (int n) + } + + int +-select_charset (int current_charset, int seldisplay) ++select_charset (int current_charset, int seldisplay, const char *title) + { ++ int new_charset; ++ + int i, menu_lines = n_codepages + 1; + char buffer[255]; + + /* Create listbox */ + Listbox *listbox = create_listbox_window (ENTRY_LEN + 2, menu_lines, +- _(" Choose input codepage "), ++ title, + "[Codepages Translation]"); + + if (!seldisplay) +@@ -82,20 +84,26 @@ select_charset (int current_charset, int seldisplay) + + i = run_listbox (listbox); + +- return (seldisplay) ? ((i >= n_codepages) ? -1 : i) +- : (i - 1); ++ if(i==-1) ++ i = (seldisplay) ++ ? ((current_charset < 0) ? n_codepages : current_charset) ++ : (current_charset + 1); ++ ++ new_charset =(seldisplay) ? ( (i >= n_codepages) ? -1 : i ) : ( i-1 ); ++ new_charset = (new_charset==-2) ? current_charset:new_charset; ++ return new_charset; + } + + /* Helper functions for codepages support */ + + + int +-do_select_codepage (void) ++do_select_codepage (const char *title) + { + const char *errmsg; + + if (display_codepage > 0) { +- source_codepage = select_charset (source_codepage, 0); ++ source_codepage = select_charset (source_codepage, 0, title); + errmsg = + init_translation_table (source_codepage, display_codepage); + if (errmsg) { +diff --git a/src/selcodepage.h b/src/selcodepage.h +index 06fbd77..f7f16de 100644 +--- a/src/selcodepage.h ++++ b/src/selcodepage.h +@@ -2,8 +2,8 @@ + #define MC_SELCODEPAGE_H + + #ifdef HAVE_CHARSET +-int select_charset (int current_charset, int seldisplay); +-int do_select_codepage (void); ++int select_charset (int current_charset, int seldisplay, const char *title); ++int do_select_codepage (const char *title); + #endif /* HAVE_CHARSET */ + + #endif +diff --git a/src/setup.c b/src/setup.c +index 67dec4a..4c78e5b 100644 +--- a/src/setup.c ++++ b/src/setup.c +@@ -50,6 +50,8 @@ + + #ifdef HAVE_CHARSET + #include "charsets.h" ++#include"recode.h" ++#include "wtools.h" + #endif + + #ifdef USE_NETCODE +@@ -273,6 +275,11 @@ panel_save_setup (struct WPanel *panel, const char *section) + g_snprintf (buffer, sizeof (buffer), "%d", panel->user_mini_status); + save_string (section, "user_mini_status", buffer, + profile_name); ++ ++#ifdef HAVE_CHARSET ++ // save panel codepage ++ save_string(section, "panel_display_codepage", get_codepage_id(panel->src_codepage), profile_name); ++#endif + } + + void +@@ -375,6 +382,7 @@ save_setup (void) + #ifdef HAVE_CHARSET + save_string( "Misc", "display_codepage", + get_codepage_id( display_codepage ), profile_name ); ++ save_string( "Misc", "ftp_codepage", get_codepage_id(ftp_codepage), profile_name); + #endif /* HAVE_CHARSET */ + + g_free (profile); +@@ -425,6 +433,31 @@ panel_load_setup (WPanel *panel, const char *section) + panel->user_mini_status = + load_int (section, "user_mini_status", 0); + ++#ifdef HAVE_CHARSET ++//--- Loading panel codepage ++ panel_reset_codepage(panel); ++ if(load_codepages_list()>0) { ++ char cpname[128]; ++ char *errmsg; ++ ++ ++ if(display_codepage>=0) { ++ load_string(section, "panel_display_codepage", "", cpname, sizeof(cpname)); ++ if(cpname[0]!='\0') panel->src_codepage = get_codepage_index(cpname); ++ } ++ ++ errmsg=my_init_tt(display_codepage,panel->src_codepage,panel->tr_table); ++ if(errmsg) { ++ panel_reset_codepage(panel); ++ message( 1, MSG_ERROR, "%s", errmsg ); ++ } ++ errmsg=my_init_tt(panel->src_codepage,display_codepage,panel->tr_table_input); ++ if(errmsg) { ++ panel_reset_codepage(panel); ++ message( 1, MSG_ERROR, "%s", errmsg ); ++ } ++ } ++#endif + } + + static void +@@ -574,10 +607,16 @@ load_setup (void) + #ifdef HAVE_CHARSET + if ( load_codepages_list() > 0 ) { + char cpname[128]; +- load_string( "Misc", "display_codepage", "", +- cpname, sizeof(cpname) ); +- if ( cpname[0] != '\0' ) +- display_codepage = get_codepage_index( cpname ); ++ get_locale_codepage(); ++ load_string("Misc", "display_codepage", "", cpname, sizeof(cpname)); ++ if(cpname[0] != '\0') display_codepage=get_codepage_index(cpname); ++ else display_codepage=lang_codepage; ++ ++ ftp_codepage=-1; ++ if(display_codepage >= 0) { ++ load_string( "Misc", "ftp_codepage", "", cpname, sizeof(cpname)); ++ if(cpname[0] != '\0') ftp_codepage=get_codepage_index(cpname); ++ } + } + + init_translation_table( source_codepage, display_codepage ); +diff --git a/src/slint.c b/src/slint.c +index c30fac1..88557ac 100644 +--- a/src/slint.c ++++ b/src/slint.c +@@ -142,7 +142,9 @@ void slang_init (void) { SLtt_get_terminfo (); @@ -3954,29 +5311,43 @@ diff -up mc-4.6.2-pre1/src/slint.c.utf8 mc-4.6.2-pre1/src/slint.c /* * If the terminal in not in terminfo but begins with a well-known * string such as "linux" or "xterm" S-Lang will go on, but the -diff -up mc-4.6.2-pre1/src/tty.c.utf8 mc-4.6.2-pre1/src/tty.c ---- mc-4.6.2-pre1/src/tty.c.utf8 2006-05-23 09:38:59.000000000 +0200 -+++ mc-4.6.2-pre1/src/tty.c 2008-12-04 13:25:34.000000000 +0100 +diff --git a/src/timefmt.h b/src/timefmt.h +index 2b8d52f..2cf4a38 100644 +--- a/src/timefmt.h ++++ b/src/timefmt.h +@@ -19,7 +19,7 @@ + } \ + else \ + { \ +- strftime(buffer, bufsize, fmt, whentm); \ ++ strftime(buffer, bufsize -1, fmt, whentm); \ + } \ + } \ + +diff --git a/src/tty.c b/src/tty.c +index a71c6cc..961132b 100644 +--- a/src/tty.c ++++ b/src/tty.c @@ -134,10 +134,12 @@ tty_print_char(int c) * defined or not. Congratulations! At least, they left the API call * for SLsmg_write_nchars as it has always been. */ - char ch; -- + - ch = c; - SLsmg_write_nchars(&ch, 1); -+ + /* The above comment is a nonsense, SLsmg_write_char(c) works pretty + * good for me. So please don't mess with Red Hat people. + * Jindrich Novy (jnovy@redhat.com) + */ -+ SLsmg_write_char(c); ++ SLsmg_write_nwchars(&c, 1); #else addch(c); #endif -diff -up mc-4.6.2-pre1/src/tty.h.utf8 mc-4.6.2-pre1/src/tty.h ---- mc-4.6.2-pre1/src/tty.h.utf8 2006-05-15 15:26:18.000000000 +0200 -+++ mc-4.6.2-pre1/src/tty.h 2008-12-04 13:25:34.000000000 +0100 +diff --git a/src/tty.h b/src/tty.h +index 85d286b..d27e639 100644 +--- a/src/tty.h ++++ b/src/tty.h @@ -8,6 +8,8 @@ of ifdefs in the other files small. */ @@ -3986,10 +5357,11 @@ diff -up mc-4.6.2-pre1/src/tty.h.utf8 mc-4.6.2-pre1/src/tty.h #ifdef HAVE_SLANG # include "myslang.h" #endif -diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c ---- mc-4.6.2-pre1/src/util.c.utf8 2005-11-03 03:18:38.000000000 +0100 -+++ mc-4.6.2-pre1/src/util.c 2008-12-04 13:25:34.000000000 +0100 -@@ -33,7 +33,11 @@ +diff --git a/src/util.c b/src/util.c +index 35658b0..5f87b57 100644 +--- a/src/util.c ++++ b/src/util.c +@@ -34,10 +34,14 @@ #include #include #include @@ -3997,11 +5369,14 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c +#include +#include + #include + #include + +#include "tty.h" #include "global.h" #include "profile.h" #include "main.h" /* mc_home */ -@@ -45,9 +49,39 @@ +@@ -50,9 +54,39 @@ #include "charsets.h" #endif @@ -4033,7 +5408,7 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c + else + SLsmg_write_char('?'); /* should not happen */ + } -+ } ++ } + } +} +#endif @@ -4041,7 +5416,7 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c extern void str_replace(char *s, char from, char to) { for (; *s != '\0'; s++) { -@@ -78,9 +112,106 @@ is_8bit_printable (unsigned char c) +@@ -83,9 +117,106 @@ is_8bit_printable (unsigned char c) return (c > 31 && c != 127 && c != 155); } @@ -4057,9 +5432,9 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c + size_t len; + + len = mbrtowc (&c, str, MB_CUR_MAX, NULL); -+ ++ + if (len == (size_t)(-1) || len == (size_t)(-2)) break; -+ ++ + if (len > 0) { + int wcsize = wcwidth(c); + width += wcsize > 0 ? wcsize : 0; @@ -4075,7 +5450,7 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c + +#ifdef UTF8 + -+void ++void +fix_utf8(char *str) +{ + mbstate_t mbs; @@ -4124,7 +5499,7 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c + memset (&mbs, 0, sizeof (mbs)); + wstr2 = wstr; + len = wcsrtombs(NULL, &wstr2, 0, &mbs); -+ if (len <= 0) ++ if (len <= 0) + return NULL; + + string = g_malloc(len + 1); @@ -4148,7 +5523,7 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c c &= 0xff; #ifdef HAVE_CHARSET -@@ -98,7 +229,7 @@ is_printable (int c) +@@ -103,7 +234,7 @@ is_printable (int c) #endif /* !HAVE_CHARSET */ } @@ -4157,7 +5532,7 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c void msglen (const char *text, int *lines, int *columns) { -@@ -111,8 +242,21 @@ msglen (const char *text, int *lines, in +@@ -116,8 +247,21 @@ msglen (const char *text, int *lines, int *columns) nlines++; colindex = 0; } else { @@ -4179,7 +5554,7 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c ncolumns = colindex; } } -@@ -206,7 +350,24 @@ name_quote (const char *s, int quote_per +@@ -211,7 +355,24 @@ name_quote (const char *s, int quote_percent) *d++ = '\\'; break; } @@ -4192,8 +5567,8 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c + memset (&mbs, 0, sizeof (mbs)); + len = mbrlen(s, MB_CUR_MAX, &mbs); + if (len > 0) { -+ while (len-- > 1) -+ *d++ = *s++; ++ while (len-- > 1) ++ *d++ = *s++; + *d = *s; + } else { + *d = '?'; @@ -4204,7 +5579,7 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c } *d = '\0'; return ret; -@@ -228,25 +389,90 @@ const char * +@@ -233,25 +394,90 @@ const char * name_trunc (const char *txt, int trunc_len) { static char x[MC_MAXPATHLEN + MC_MAXPATHLEN]; @@ -4224,18 +5599,17 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c - 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; -+ } + } +- x[trunc_len] = 0; +- for (p = x; *p; p++) +- if (!is_printable (*p)) +- *p = '?'; + +#ifdef UTF8 + if (SLsmg_Is_Unicode) { @@ -4309,24 +5683,29 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c return x; } -@@ -678,11 +904,61 @@ load_file (const char *filename) +@@ -683,11 +909,66 @@ load_file (const char *filename) } char * +utf8_to_local(char *str) +{ + iconv_t cd; -+ size_t buflen = strlen(str); ++ size_t buflen; + char *output; + int retry = 1; -+ ++ ++ if (!str) ++ return 0; ++ ++ buflen = strlen(str); ++ + 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; @@ -4334,11 +5713,11 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c + 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) ++ if (errno == E2BIG) + { + buflen *= 2; + g_free(output); @@ -4355,9 +5734,9 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c + *wrptr = 0; + } + } -+ ++ + iconv_close (cd); -+ ++ + return output; +} + @@ -4369,40 +5748,37 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c char *data; + char *conv_data; - hintfile_base = concat_dir_and_file (mc_home, filename); + hintfile_base = mhl_str_dir_plus_file (mc_home, filename); lang = guess_message_value (); -@@ -715,7 +991,10 @@ load_mc_home_file (const char *filename, +@@ -720,7 +1001,10 @@ load_mc_home_file (const char *filename, char **allocated_filename) 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 -@@ -724,12 +1003,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) */ -@@ -742,15 +1023,12 @@ i18n_checktimelength (void) +@@ -736,10 +1020,12 @@ i18n_checktimelength (void) + // huh, localtime() doesnt seem to work ... falling back to "(invalid)" + length = strlen(INVALID_TIME_TEXT); + } else { +- char buf [MAX_I18NTIMELENGTH + 1]; ++ char buf [4* MAX_I18NTIMELENGTH + 1]; + size_t a, b; +- a = strftime (buf, sizeof(buf)-1, _("%b %e %H:%M"), lt); +- b = strftime (buf, sizeof(buf)-1, _("%b %e %Y"), lt); ++ strftime (buf, sizeof(buf)-1, _("%b %e %H:%M"), lt); ++ a = mbstrlen(buf); ++ strftime (buf, sizeof(buf)-1, _("%b %e %Y"), lt); ++ b = mbstrlen(buf); + length = max (a, b); + } + +@@ -753,15 +1039,12 @@ i18n_checktimelength (void) const char * file_date (time_t when) { @@ -4416,20 +5792,20 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c - if (i18n_timelength == 0){ - i18n_timelength = i18n_checktimelength() + 1; - -+ if (fmtyear == NULL) { ++ if ( fmtyear == NULL ) { /* strftime() format string for old dates */ fmtyear = _("%b %e %Y"); /* strftime() format string for recent dates */ -@@ -770,7 +1048,7 @@ file_date (time_t when) +@@ -781,7 +1064,7 @@ file_date (time_t when) else fmt = fmttime; -- strftime (timebuf, i18n_timelength, fmt, localtime(&when)); -+ strftime (timebuf, sizeof (timebuf) - 1, fmt, localtime(&when)); +- FMT_LOCALTIME(timebuf, i18n_timelength, fmt, when); ++ FMT_LOCALTIME(timebuf, sizeof(timebuf), fmt, when); + return timebuf; } - -@@ -900,10 +1178,27 @@ strip_ctrl_codes (char *s) +@@ -912,10 +1195,27 @@ strip_ctrl_codes (char *s) r++; continue; } @@ -4444,8 +5820,8 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c + int len; + memset (&mbs, 0, sizeof (mbs)); + len = mbrlen(r, MB_CUR_MAX, &mbs); -+ -+ if (len > 0 && (unsigned char)*r >= ' ') ++ ++ if (len > 0 && (unsigned char)*r >= ' ') + while (len--) + *w++ = *r++; + else { @@ -4458,10 +5834,11 @@ diff -up mc-4.6.2-pre1/src/util.c.utf8 mc-4.6.2-pre1/src/util.c } *w = 0; return s; -diff -up mc-4.6.2-pre1/src/util.h.utf8 mc-4.6.2-pre1/src/util.h ---- mc-4.6.2-pre1/src/util.h.utf8 2006-02-03 18:04:17.000000000 +0100 -+++ mc-4.6.2-pre1/src/util.h 2008-12-04 13:25:34.000000000 +0100 -@@ -103,6 +103,13 @@ void init_uid_gid_cache (void); +diff --git a/src/util.h b/src/util.h +index 0cf2099..82edcde 100644 +--- a/src/util.h ++++ b/src/util.h +@@ -102,6 +102,13 @@ void init_uid_gid_cache (void); char *get_group (int); char *get_owner (int); @@ -4475,10 +5852,11 @@ diff -up mc-4.6.2-pre1/src/util.h.utf8 mc-4.6.2-pre1/src/util.h #define MAX_I18NTIMELENGTH 14 #define MIN_I18NTIMELENGTH 10 #define STD_I18NTIMELENGTH 12 -diff -up mc-4.6.2-pre1/src/view.c.utf8 mc-4.6.2-pre1/src/view.c ---- mc-4.6.2-pre1/src/view.c.utf8 2006-12-30 14:16:54.000000000 +0100 -+++ mc-4.6.2-pre1/src/view.c 2008-12-04 15:00:00.000000000 +0100 -@@ -43,6 +43,10 @@ +diff --git a/src/view.c b/src/view.c +index 8465301..8bc1792 100644 +--- a/src/view.c ++++ b/src/view.c +@@ -44,6 +44,10 @@ #include #include @@ -4489,7 +5867,7 @@ diff -up mc-4.6.2-pre1/src/view.c.utf8 mc-4.6.2-pre1/src/view.c #include "global.h" #include "tty.h" #include "cmd.h" /* For view_other_cmd */ -@@ -1642,7 +1646,7 @@ view_display_status (WView *view) +@@ -1643,7 +1647,7 @@ view_display_status (WView *view) hline (' ', width); file_label = _("File: %s"); @@ -4498,7 +5876,7 @@ diff -up mc-4.6.2-pre1/src/view.c.utf8 mc-4.6.2-pre1/src/view.c file_name = view->filename ? view->filename : view->command ? view->command : ""; -@@ -1910,6 +1914,12 @@ view_display_text (WView * view) +@@ -1911,6 +1915,12 @@ view_display_text (WView * view) offset_type from; int c; struct hexedit_change_node *curr = view->change_list; @@ -4511,7 +5889,7 @@ diff -up mc-4.6.2-pre1/src/view.c.utf8 mc-4.6.2-pre1/src/view.c view_display_clean (view); view_display_ruler (view); -@@ -1922,8 +1932,37 @@ view_display_text (WView * view) +@@ -1923,8 +1933,37 @@ view_display_text (WView * view) tty_setcolor (NORMAL_COLOR); for (row = 0, col = 0; row < height && (c = get_byte (view, from)) != -1; from++) { @@ -4550,32 +5928,38 @@ diff -up mc-4.6.2-pre1/src/view.c.utf8 mc-4.6.2-pre1/src/view.c int c_prev; int c_next; -@@ -1988,10 +2027,21 @@ view_display_text (WView * view) +@@ -1989,10 +2028,17 @@ view_display_text (WView * view) if (col >= view->dpy_text_column && col - view->dpy_text_column < width) { widget_move (view, top + row, left + (col - view->dpy_text_column)); -+#ifdef UTF8 -+ if (SLsmg_is_utf8_mode ()) { -+ if (!iswprint (wc)) -+ wc = '.'; -+ tty_print_char (wc); -+ col += wcwidth (wc) - 1; -+ } else { -+#endif ++#ifndef UTF8 c = convert_to_display_c (c); if (!is_printable (c)) c = '.'; tty_print_char (c); -+#ifdef UTF8 -+ } ++#else ++ wc = convert_to_display_c (wc); ++ if (!iswprint (wc)) ++ wc = '.'; ++ tty_print_char (wc); +#endif } col++; tty_setcolor (NORMAL_COLOR); -diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c ---- mc-4.6.2-pre1/src/widget.c.utf8 2006-05-29 13:58:43.000000000 +0200 -+++ mc-4.6.2-pre1/src/widget.c 2008-12-04 14:56:25.000000000 +0100 -@@ -36,6 +36,9 @@ +@@ -3187,7 +3233,7 @@ view_handle_key (WView *view, int c) + + #ifdef HAVE_CHARSET + case XCTRL ('t'): +- do_select_codepage (); ++ do_select_codepage (_(" Choose codepage ")); + view->dirty++; + view_update (view); + return MSG_HANDLED; +diff --git a/src/widget.c b/src/widget.c +index f85cc2a..635441d 100644 +--- a/src/widget.c ++++ b/src/widget.c +@@ -38,6 +38,9 @@ #include "global.h" #include "tty.h" @@ -4585,7 +5969,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c #include "color.h" #include "mouse.h" #include "dialog.h" -@@ -182,6 +185,11 @@ button_callback (Widget *w, widget_msg_t +@@ -183,6 +186,11 @@ button_callback (Widget *w, widget_msg_t msg, int parm) if (b->hotpos >= 0) { widget_selectcolor (w, b->selected, TRUE); widget_move (w, 0, b->hotpos + off); @@ -4597,7 +5981,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c addch ((unsigned char) b->text[b->hotpos]); } return MSG_HANDLED; -@@ -215,7 +223,7 @@ button_event (Gpm_Event *event, void *da +@@ -216,7 +224,7 @@ button_event (Gpm_Event *event, void *data) static int button_len (const char *text, unsigned int flags) { @@ -4606,7 +5990,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c switch (flags){ case DEFPUSH_BUTTON: ret += 6; -@@ -238,14 +246,36 @@ button_len (const char *text, unsigned i +@@ -239,14 +247,36 @@ button_len (const char *text, unsigned int flags) * the button text is g_malloc()ed, we can safely change and shorten it. */ static void @@ -4648,7 +6032,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c } } -@@ -266,8 +296,9 @@ button_new (int y, int x, int action, in +@@ -267,8 +297,9 @@ button_new (int y, int x, int action, int flags, const char *text, widget_want_hotkey (b->widget, 1); b->hotkey = 0; b->hotpos = -1; @@ -4659,7 +6043,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c return b; } -@@ -280,14 +311,13 @@ button_get_text (WButton *b) +@@ -281,14 +312,13 @@ button_get_text (WButton *b) void button_set_text (WButton *b, const char *text) { @@ -4676,7 +6060,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c /* Radio button widget */ static int radio_event (Gpm_Event *event, void *); -@@ -362,14 +392,35 @@ radio_callback (Widget *w, widget_msg_t +@@ -363,14 +393,35 @@ radio_callback (Widget *w, widget_msg_t msg, int parm) widget_move (&r->widget, i, 0); tty_printf ("(%c) ", (r->sel == i) ? '*' : ' '); @@ -4719,7 +6103,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c } return MSG_HANDLED; -@@ -408,7 +459,7 @@ radio_new (int y, int x, int count, cons +@@ -409,7 +460,7 @@ radio_new (int y, int x, int count, const char **texts) /* Compute the longest string */ max = 0; for (i = 0; i < count; i++){ @@ -4728,7 +6112,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c if (m > max) max = m; } -@@ -468,6 +519,11 @@ check_callback (Widget *w, widget_msg_t +@@ -469,6 +520,11 @@ check_callback (Widget *w, widget_msg_t msg, int parm) if (c->hotpos >= 0) { widget_selectcolor (w, msg == WIDGET_FOCUS, TRUE); widget_move (&c->widget, 0, +c->hotpos + 4); @@ -4740,7 +6124,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c addch ((unsigned char) c->text[c->hotpos]); } return MSG_HANDLED; -@@ -505,35 +561,20 @@ WCheck * +@@ -506,35 +562,20 @@ WCheck * check_new (int y, int x, int state, const char *text) { WCheck *c = g_new (WCheck, 1); @@ -4780,7 +6164,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c /* Label widget */ static cb_ret_t -@@ -572,7 +613,7 @@ label_callback (Widget *w, widget_msg_t +@@ -573,7 +614,7 @@ label_callback (Widget *w, widget_msg_t msg, int parm) } widget_move (&l->widget, y, 0); tty_printf ("%s", p); @@ -4789,7 +6173,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c if (xlen > 0) tty_printf ("%*s", xlen, " "); if (!q) -@@ -606,7 +647,7 @@ label_set_text (WLabel *label, const cha +@@ -607,7 +648,7 @@ label_set_text (WLabel *label, const char *text) if (text){ label->text = g_strdup (text); if (label->auto_adjust_cols) { @@ -4798,7 +6182,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c if (newcols > label->widget.cols) label->widget.cols = newcols; } -@@ -630,7 +671,7 @@ label_new (int y, int x, const char *tex +@@ -631,7 +672,7 @@ label_new (int y, int x, const char *text) if (!text || strchr(text, '\n')) width = 1; else @@ -4807,7 +6191,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c l = g_new (WLabel, 1); init_widget (&l->widget, y, x, 1, width, label_callback, NULL); -@@ -778,13 +819,73 @@ static void draw_history_button (WInput +@@ -779,13 +820,69 @@ static void draw_history_button (WInput * in) /* Pointer to killed data */ static char *kill_buffer = 0; @@ -4851,11 +6235,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c + l = mbrtowc(&wc, in->buffer + pos, len - pos, &mbs); + if (l <= 0) + return width; -+ pos += l; -+ if (wcwidth (wc)>0 && in->is_password) -+ width++; -+ else -+ width += wcwidth(wc); ++ pos += l; width += wcwidth(wc); + i++; + }; + return width; @@ -4883,7 +6263,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c if (should_show_history_button (in)) has_history = HISTORY_BUTTON_WIDTH; -@@ -794,7 +895,7 @@ update_input (WInput *in, int clear_firs +@@ -795,7 +892,7 @@ update_input (WInput *in, int clear_first) /* Make the point visible */ if ((in->point < in->first_shown) || @@ -4892,7 +6272,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c in->first_shown = in->point - (in->field_len / 3); if (in->first_shown < 0) in->first_shown = 0; -@@ -814,14 +915,30 @@ update_input (WInput *in, int clear_firs +@@ -815,14 +912,29 @@ update_input (WInput *in, int clear_first) addch (' '); widget_move (&in->widget, 0, 0); @@ -4900,21 +6280,19 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c 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 : '.'; -- if (in->is_password) +#else /* UTF8 */ + 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); -+ if (res == 0) continue; -+ c = (iswprint (c)) ? 0 : L'.'; ++ c = (res && iswprint (c)) ? 0 : '.'; +#endif /* UTF8 */ -+ if (in->is_password) + if (in->is_password) c = '*'; +#ifndef UTF8 addch (c); +#else /* UTF8 */ + if (c) { -+ addch (c); ++ addch (c); + } + else + SLsmg_write_nchars (chp, res); @@ -4925,7 +6303,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c if (clear_first) in->first = 0; -@@ -974,7 +1091,7 @@ char * +@@ -975,7 +1087,7 @@ char * show_hist (GList *history, int widget_x, int widget_y) { GList *hi, *z; @@ -4934,7 +6312,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c int x, y, w, h; char *q, *r = 0; Dlg_head *query_dlg; -@@ -987,7 +1104,7 @@ show_hist (GList *history, int widget_x, +@@ -988,7 +1100,7 @@ show_hist (GList *history, int widget_x, int widget_y) z = g_list_first (history); hi = z; while (hi) { @@ -4943,7 +6321,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c maxlen = i; count++; hi = g_list_next (hi); -@@ -1157,35 +1274,83 @@ new_input (WInput *in) +@@ -1158,35 +1270,83 @@ new_input (WInput *in) in->need_push = 1; in->buffer [0] = 0; in->point = 0; @@ -5019,10 +6397,10 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c + /* move chars */ + size_t rest_bytes = strlen (in->buffer + ins_point); + -+ for (i = rest_bytes + 1; i > 0; i--) ++ for (i = rest_bytes + 1; i > 0; i--) + in->buffer [ins_point + i + in->charpoint - 1] = in->buffer [ins_point + i - 1]; + -+ memcpy(in->buffer + ins_point, in->charbuf, in->charpoint); ++ memcpy(in->buffer + ins_point, in->charbuf, in->charpoint); +#endif /* UTF8 */ in->point++; } @@ -5030,7 +6408,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c return MSG_HANDLED; } -@@ -1193,12 +1358,14 @@ static void +@@ -1194,12 +1354,14 @@ static void beginning_of_line (WInput *in) { in->point = 0; @@ -5046,7 +6424,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c } static void -@@ -1206,18 +1373,21 @@ backward_char (WInput *in) +@@ -1207,18 +1369,21 @@ backward_char (WInput *in) { if (in->point) in->point--; @@ -5069,7 +6447,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c char *p = in->buffer + in->point; while (*p -@@ -1227,11 +1397,39 @@ forward_word (WInput * in) +@@ -1228,11 +1393,39 @@ forward_word (WInput * in) while (*p && isalnum ((unsigned char) *p)) p++; in->point = p - in->buffer; @@ -5109,7 +6487,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c char *p = in->buffer + in->point; while (p - 1 > in->buffer - 1 && (isspace ((unsigned char) *(p - 1)) -@@ -1241,6 +1439,32 @@ backward_word (WInput *in) +@@ -1242,6 +1435,32 @@ backward_word (WInput *in) while (p - 1 > in->buffer - 1 && isalnum ((unsigned char) *(p - 1))) p--; in->point = p - in->buffer; @@ -5142,19 +6520,23 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c } static void -@@ -1273,8 +1497,9 @@ backward_delete (WInput *in) +@@ -1270,12 +1489,12 @@ key_ctrl_right (WInput *in) + 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); ++ move_buffer_backward(in, in->point - 1); + in->charpoint = 0; in->need_push = 1; in->point--; } -@@ -1282,10 +1507,8 @@ backward_delete (WInput *in) +@@ -1283,10 +1502,8 @@ backward_delete (WInput *in) static void delete_char (WInput *in) { @@ -5162,22 +6544,22 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c - - for (i = in->point; in->buffer [i]; i++) - in->buffer [i] = in->buffer [i+1]; -+ move_buffer_backward(in, in->point); ++ move_buffer_backward(in, in->point); + in->charpoint = 0; in->need_push = 1; } -@@ -1300,6 +1523,9 @@ copy_region (WInput *in, int x_first, in +@@ -1301,6 +1518,9 @@ copy_region (WInput *in, int x_first, int x_last) g_free (kill_buffer); + first=charpos(in,first); + last=charpos(in,last); -+ ++ kill_buffer = g_strndup(in->buffer+first,last-first); } -@@ -1308,11 +1534,13 @@ delete_region (WInput *in, int x_first, +@@ -1309,11 +1529,13 @@ delete_region (WInput *in, int x_first, int x_last) { int first = min (x_first, x_last); int last = max (x_first, x_last); @@ -5193,7 +6575,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c in->need_push = 1; } -@@ -1329,6 +1557,8 @@ kill_word (WInput *in) +@@ -1330,6 +1552,8 @@ kill_word (WInput *in) copy_region (in, old_point, new_point); delete_region (in, old_point, new_point); in->need_push = 1; @@ -5202,7 +6584,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c } static void -@@ -1372,16 +1602,20 @@ yank (WInput *in) +@@ -1373,16 +1597,20 @@ yank (WInput *in) if (!kill_buffer) return; @@ -5225,7 +6607,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c } void -@@ -1391,9 +1625,10 @@ assign_text (WInput *in, const char *tex +@@ -1392,9 +1620,10 @@ assign_text (WInput *in, const char *text) g_free (in->buffer); in->buffer = g_strdup (text); /* was in->buffer->text */ in->current_max_len = strlen (in->buffer) + 1; @@ -5237,7 +6619,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c } static void -@@ -1520,6 +1755,7 @@ port_region_marked_for_delete (WInput *i +@@ -1521,6 +1750,7 @@ port_region_marked_for_delete (WInput *in) *in->buffer = 0; in->point = 0; in->first = 0; @@ -5245,7 +6627,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c } cb_ret_t -@@ -1548,7 +1784,11 @@ handle_char (WInput *in, int c_code) +@@ -1549,7 +1779,11 @@ handle_char (WInput *in, int c_code) } } if (!input_map [i].fn){ @@ -5257,7 +6639,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c return MSG_NOT_HANDLED; if (in->first){ port_region_marked_for_delete (in); -@@ -1581,6 +1821,9 @@ input_set_point (WInput *in, int pos) +@@ -1582,6 +1816,9 @@ input_set_point (WInput *in, int pos) if (pos != in->point) free_completions (in); in->point = pos; @@ -5267,7 +6649,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c update_input (in, 1); } -@@ -1621,7 +1864,7 @@ input_callback (Widget *w, widget_msg_t +@@ -1622,7 +1859,7 @@ input_callback (Widget *w, widget_msg_t msg, int parm) return MSG_HANDLED; case WIDGET_CURSOR: @@ -5276,7 +6658,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c return MSG_HANDLED; case WIDGET_DESTROY: -@@ -1645,7 +1888,7 @@ input_event (Gpm_Event * event, void *da +@@ -1646,7 +1883,7 @@ input_event (Gpm_Event * event, void *data) && should_show_history_button (in)) { do_show_hist (in); } else { @@ -5285,7 +6667,7 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c if (event->x - in->first_shown - 1 < in->point) in->point = event->x - in->first_shown - 1; if (in->point < 0) -@@ -1702,7 +1945,8 @@ input_new (int y, int x, int color, int +@@ -1701,56 +1938,91 @@ input_new (int y, int x, int color, int len, const char *def_text, in->is_password = 0; strcpy (in->buffer, def_text); @@ -5295,10 +6677,136 @@ diff -up mc-4.6.2-pre1/src/widget.c.utf8 mc-4.6.2-pre1/src/widget.c return in; } -diff -up mc-4.6.2-pre1/src/widget.h.utf8 mc-4.6.2-pre1/src/widget.h ---- mc-4.6.2-pre1/src/widget.h.utf8 2006-02-28 17:15:21.000000000 +0100 -+++ mc-4.6.2-pre1/src/widget.h 2008-12-04 13:25:34.000000000 +0100 -@@ -22,6 +22,7 @@ typedef struct WButton { +- +-/* Listbox widget */ ++/* Vertical scrollbar widget */ + +-/* Should draw the scrollbar, but currently draws only +- * indications that there is more information +- */ +-static int listbox_cdiff (WLEntry *s, WLEntry *e); +- +-static void +-listbox_drawscroll (WListbox *l) ++void ++vscrollbar (Widget widget, int height, int width, int tpad, int bpad, ++ int selected, int count, gboolean color) + { + int line; +- int i, top; +- int max_line = l->height-1; +- ++ int i; ++ + /* Are we at the top? */ +- widget_move (&l->widget, 0, l->width); +- if (l->list == l->top) +- one_vline (); ++ widget_move (&widget, tpad, width); ++#ifndef UTF8 ++ if (!selected) ++ one_vline (); ++ else ++ addch ('^'); ++#else ++ if (color) attrset (MARKED_COLOR); ++ if (is_utf8) ++ SLsmg_write_string("â–´"); + else +- addch ('^'); ++ addch ('^'); ++ if (color) attrset (NORMAL_COLOR); ++#endif + + /* Are we at the bottom? */ +- widget_move (&l->widget, max_line, l->width); +- top = listbox_cdiff (l->list, l->top); +- if ((top + l->height == l->count) || l->height >= l->count) +- one_vline (); ++ widget_move (&widget, height-1-bpad, width); ++#ifndef UTF8 ++ if (selected == count-1) ++ one_vline (); ++ else ++ addch ('v'); ++#else ++ if (color) attrset (MARKED_COLOR); ++ if (is_utf8) ++ SLsmg_write_string("â–¾"); + else +- addch ('v'); ++ addch('v'); ++ if (color) attrset (NORMAL_COLOR); ++#endif + + /* Now draw the nice relative pointer */ +- if (l->count) +- line = 1+ ((l->pos * (l->height-2)) / l->count); ++ if (count > 1) ++ line = tpad + 1 + ((selected * (height-3-tpad-bpad)) / (count-1)); + else +- line = 0; +- +- for (i = 1; i < max_line; i++){ +- widget_move (&l->widget, i, l->width); +- if (i != line) +- one_vline (); +- else +- addch ('*'); ++ line = 0; ++ ++ for (i = tpad + 1; i < height-1-bpad; i++){ ++ widget_move (&widget, i, width); ++ if (i != line) ++#ifndef UTF8 ++ one_vline (); ++ else ++ addch ('*'); ++#else ++ if (is_utf8) ++ SLsmg_write_string("â–’"); ++ else ++ one_vline(); ++ else { ++ if (color) attrset (MARKED_COLOR); ++ if (is_utf8) ++ SLsmg_write_string("â—ˆ"); ++ else ++ addch('*'); ++ if (color) attrset (NORMAL_COLOR); ++ } ++#endif + } + } +- +-static void ++ ++ ++/* Listbox widget */ ++ ++/* Should draw the scrollbar, but currently draws only ++ * indications that there is more information ++ */ ++static int listbox_cdiff (WLEntry *s, WLEntry *e); ++ ++void + listbox_draw (WListbox *l, int focused) + { + WLEntry *e; +@@ -1791,7 +2063,7 @@ listbox_draw (WListbox *l, int focused) + if (!l->scrollbar) + return; + attrset (normalc); +- listbox_drawscroll (l); ++ vscrollbar (l->widget, l->height, l->width, 0, 0, l->pos, l->count, FALSE); + } + + /* Returns the number of items between s and e, +diff --git a/src/widget.h b/src/widget.h +index 8c6f781..d1d91f2 100644 +--- a/src/widget.h ++++ b/src/widget.h +@@ -39,6 +39,7 @@ typedef struct WButton { char *text; /* text of button */ int hotkey; /* hot KEY */ int hotpos; /* offset hot KEY char in text */ @@ -5306,7 +6814,7 @@ diff -up mc-4.6.2-pre1/src/widget.h.utf8 mc-4.6.2-pre1/src/widget.h bcback callback; /* Callback function */ } WButton; -@@ -42,6 +43,7 @@ typedef struct WCheck { +@@ -59,6 +60,7 @@ typedef struct WCheck { char *text; /* text of check button */ int hotkey; /* hot KEY */ int hotpos; /* offset hot KEY char in text */ @@ -5314,7 +6822,7 @@ diff -up mc-4.6.2-pre1/src/widget.h.utf8 mc-4.6.2-pre1/src/widget.h } WCheck; typedef struct WGauge { -@@ -57,16 +59,20 @@ char *show_hist (GList *history, int wid +@@ -74,16 +76,20 @@ char *show_hist (GList *history, int widget_y, int widget_x); typedef struct { Widget widget; @@ -5340,10 +6848,22 @@ diff -up mc-4.6.2-pre1/src/widget.h.utf8 mc-4.6.2-pre1/src/widget.h GList *history; /* The history */ int need_push; /* need to push the current Input on hist? */ char **completions; /* Possible completions array */ -diff -up mc-4.6.2-pre1/src/wtools.c.utf8 mc-4.6.2-pre1/src/wtools.c ---- mc-4.6.2-pre1/src/wtools.c.utf8 2006-09-14 11:12:49.000000000 +0200 -+++ mc-4.6.2-pre1/src/wtools.c 2008-12-04 13:25:34.000000000 +0100 -@@ -49,11 +49,11 @@ create_listbox_window (int cols, int lin +@@ -181,6 +187,10 @@ void button_set_text (WButton *b, const char *text); + /* Listbox manager */ + WLEntry *listbox_get_data (WListbox *l, int pos); + ++/* Vertical scrollbar */ ++void vscrollbar (Widget widget, int height, int width, int tpad, int bpad, ++ int selected, int count, gboolean color); ++ + /* search text int listbox entries */ + WLEntry *listbox_search_text (WListbox *l, const char *text); + void listbox_select_entry (WListbox *l, WLEntry *dest); +diff --git a/src/wtools.c b/src/wtools.c +index ba317e9..a6eaffa 100644 +--- a/src/wtools.c ++++ b/src/wtools.c +@@ -49,11 +49,11 @@ create_listbox_window (int cols, int lines, const char *title, const char *help) /* Adjust sizes */ lines = (lines > LINES - 6) ? LINES - 6 : lines; @@ -5357,7 +6877,7 @@ diff -up mc-4.6.2-pre1/src/wtools.c.utf8 mc-4.6.2-pre1/src/wtools.c cols = len; cols = cols > COLS - 6 ? COLS - 6 : cols; -@@ -124,7 +124,7 @@ query_dialog (const char *header, const +@@ -124,7 +124,7 @@ query_dialog (const char *header, const char *text, int flags, int count, ...) va_start (ap, count); for (i = 0; i < count; i++) { char *cp = va_arg (ap, char *); @@ -5366,7 +6886,7 @@ diff -up mc-4.6.2-pre1/src/wtools.c.utf8 mc-4.6.2-pre1/src/wtools.c if (strchr (cp, '&') != NULL) win_len--; } -@@ -133,7 +133,7 @@ query_dialog (const char *header, const +@@ -133,7 +133,7 @@ query_dialog (const char *header, const char *text, int flags, int count, ...) /* count coordinates */ msglen (text, &lines, &cols); @@ -5375,7 +6895,7 @@ diff -up mc-4.6.2-pre1/src/wtools.c.utf8 mc-4.6.2-pre1/src/wtools.c lines += 4 + (count > 0 ? 2 : 0); xpos = COLS / 2 - cols / 2; ypos = LINES / 3 - (lines - 3) / 2; -@@ -148,7 +148,7 @@ query_dialog (const char *header, const +@@ -148,7 +148,7 @@ query_dialog (const char *header, const char *text, int flags, int count, ...) va_start (ap, count); for (i = 0; i < count; i++) { cur_name = va_arg (ap, char *); @@ -5384,8 +6904,8 @@ diff -up mc-4.6.2-pre1/src/wtools.c.utf8 mc-4.6.2-pre1/src/wtools.c if (strchr (cur_name, '&') != NULL) xpos--; -@@ -463,7 +463,7 @@ fg_input_dialog_help (const char *header - quick_widgets[2].histname = histname; +@@ -467,7 +467,7 @@ fg_input_dialog_help (const char *header, const char *text, const char *help, + } msglen (text, &lines, &cols); - len = max ((int) strlen (header), cols) + 4; @@ -5393,7 +6913,7 @@ diff -up mc-4.6.2-pre1/src/wtools.c.utf8 mc-4.6.2-pre1/src/wtools.c len = max (len, 64); /* The special value of def_text is used to identify password boxes -@@ -485,7 +485,7 @@ fg_input_dialog_help (const char *header +@@ -489,7 +489,7 @@ fg_input_dialog_help (const char *header, const char *text, const char *help, quick_widgets[1].text = _(quick_widgets[1].text); quick_widgets[0].relative_x = len / 2 + 4; quick_widgets[1].relative_x = @@ -5402,3 +6922,96 @@ diff -up mc-4.6.2-pre1/src/wtools.c.utf8 mc-4.6.2-pre1/src/wtools.c quick_widgets[0].x_divisions = quick_widgets[1].x_divisions = len; #endif /* ENABLE_NLS */ +diff --git a/vfs/vfs.c b/vfs/vfs.c +index 39fdc73..1658eaa 100644 +--- a/vfs/vfs.c ++++ b/vfs/vfs.c +@@ -56,6 +56,11 @@ + #include "smbfs.h" + #include "local.h" + ++#include "../src/panel.h" ++#ifdef HAVE_CHARSET ++#include "../src/recode.h" ++#endif ++ + /* They keep track of the current directory */ + static struct vfs_class *current_vfs; + static char *current_dir; +@@ -688,8 +693,66 @@ mc_chdir (const char *path) + vfsid old_vfsid; + int result; + ++#ifdef HAVE_CHARSET ++ char* errmsg; ++#endif ++ WPanel* p=ret_panel; ++ + new_dir = vfs_canon (path); + new_vfs = vfs_get_class (new_dir); ++ old_vfsid = vfs_getid (current_vfs, current_dir); ++ old_vfs = current_vfs; ++ ++ if(p) { ++ ++ // Change from localfs to ftpfs ++ ret_panel=NULL; ++ if( (strcmp(old_vfs->name,"localfs")==0) && ++ (strcmp(new_vfs->name,"ftpfs")==0)){ ++ p->is_return=1; ++ strncpy(p->retdir,current_dir, MC_MAXPATHLEN); ++#ifdef HAVE_CHARSET ++ p->ret_codepage=p->src_codepage; ++ p->src_codepage=ftp_codepage; ++ errmsg=my_init_tt(display_codepage,p->src_codepage,p->tr_table); ++ if(errmsg) { ++ panel_reset_codepage(p); ++ message( 1, MSG_ERROR, "%s", errmsg ); ++ } ++ errmsg=my_init_tt(p->src_codepage,display_codepage,p->tr_table_input); ++ if(errmsg) { ++ panel_reset_codepage(p); ++ message( 1, MSG_ERROR, "%s", errmsg ); ++ } ++#endif ++ } ++ ++ // Change from ftpfs to localfs ++ if( (strcmp(old_vfs->name,"ftpfs")==0) && ++ (strcmp(new_vfs->name,"localfs")==0) && ++ p->is_return){ ++ p->is_return=0; ++ g_free(new_dir); ++ new_dir = vfs_canon (p->retdir); ++ new_vfs = vfs_get_class (new_dir); ++#ifdef HAVE_CHARSET ++ p->src_codepage=p->ret_codepage; ++ errmsg=my_init_tt(display_codepage,p->src_codepage,p->tr_table); ++ if(errmsg) { ++ panel_reset_codepage(p); ++ message( 1, MSG_ERROR, "%s", errmsg ); ++ } ++ errmsg=my_init_tt(p->src_codepage,display_codepage,p->tr_table_input); ++ if(errmsg) { ++ panel_reset_codepage(p); ++ message( 1, MSG_ERROR, "%s", errmsg ); ++ } ++#endif ++ } ++ } ++ ++ ++ + if (!new_vfs->chdir) { + g_free (new_dir); + return -1; +@@ -703,9 +766,6 @@ mc_chdir (const char *path) + return -1; + } + +- old_vfsid = vfs_getid (current_vfs, current_dir); +- old_vfs = current_vfs; +- + /* Actually change directory */ + g_free (current_dir); + current_dir = new_dir; diff --git a/mc-7zip.patch b/mc-7zip.patch deleted file mode 100644 index 49c829a..0000000 --- a/mc-7zip.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff -ru mc-4.6.2-pre1/vfs/extfs/u7z mc-4.6.2-pre1_u7z/vfs/extfs/u7z ---- mc-4.6.2-pre1/vfs/extfs/u7z 2005-06-22 06:21:43.000000000 +0400 -+++ mc-4.6.2-pre1_u7z/vfs/extfs/u7z 2008-06-19 08:49:05.000000000 +0400 -@@ -47,8 +47,8 @@ - } - - # override any locale for dates --LC_ALL=C --export LC_ALL -+LC_DATE=C -+export LC_DATE - - umask 077 - -@@ -56,7 +56,7 @@ - shift - - case "$cmd" in -- list) mcu7zip_list "$@" ;; -+ list) mcu7zip_list "$@"|sort -k 8 ;; - copyout) mcu7zip_copyout "$@" ;; - copyin) mcu7zip_copyin "$@" ;; - mkdir) mcu7zip_mkdir "$@" ;; diff --git a/mc-cloexec.patch b/mc-cloexec.patch deleted file mode 100644 index 1cdfff5..0000000 --- a/mc-cloexec.patch +++ /dev/null @@ -1,18 +0,0 @@ ---- mc-2006-11-14-16/src/subshell.c.desleak 2006-05-08 22:59:48.000000000 +0200 -+++ mc-2006-11-14-16/src/subshell.c 2006-11-23 09:50:30.000000000 +0100 -@@ -1150,6 +1152,7 @@ - #endif /* I_FIND && I_PUSH */ - #endif /* __osf__ || __linux__ */ - -+ fcntl(pty_slave, F_SETFD, FD_CLOEXEC); - return pty_slave; - } - -@@ -1203,6 +1207,7 @@ - } - if ((pty_slave = open (pty_name, O_RDWR)) == -1) - fprintf (stderr, "open (pty_name, O_RDWR): %s\r\n", pty_name); -+ fcntl(pty_slave, F_SETFD, FD_CLOEXEC); - return pty_slave; - } - diff --git a/mc-concat.patch b/mc-concat.patch deleted file mode 100644 index cddcfcc..0000000 --- a/mc-concat.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- mc-4.6.1a/src/util.c.jn 2005-12-02 11:08:26.000000000 +0100 -+++ mc-4.6.1a/src/util.c 2005-12-02 13:11:19.000000000 +0100 -@@ -1515,9 +1515,16 @@ - - /* If filename is NULL, then we just append PATH_SEP to the dir */ - char * --concat_dir_and_file (const char *dir, const char *file) -+concat_dir_and_file (const char *dir, const char *filename) - { - int i = strlen (dir); -+ const char *file = filename; -+ -+ /* Return filename when dir is empty */ -+ if (!i) return g_strdup (filename); -+ -+ if (file != NULL && *file == PATH_SEP) -+ file++; - - if (dir [i-1] == PATH_SEP) - return g_strconcat (dir, file, (char *) NULL); diff --git a/mc-etcmc.patch b/mc-etcmc.patch index 14040b0..bd26f4b 100644 --- a/mc-etcmc.patch +++ b/mc-etcmc.patch @@ -1,6 +1,66 @@ ---- mc-4.6.1a/src/charsets.c.etcmc 2005-05-27 05:35:15.000000000 +0200 -+++ mc-4.6.1a/src/charsets.c 2006-02-24 15:17:05.000000000 +0100 -@@ -45,12 +45,17 @@ load_codepages_list (void) +diff -up mc-4.6.2/edit/editcmd.c.etcmc mc-4.6.2/edit/editcmd.c +--- mc-4.6.2/edit/editcmd.c.etcmc 2009-05-26 18:05:21.000000000 +0200 ++++ mc-4.6.2/edit/editcmd.c 2009-05-26 18:05:21.000000000 +0200 +@@ -51,7 +51,7 @@ + #include "../src/tty.h" /* LINES */ + #include "../src/widget.h" /* listbox_new() */ + #include "../src/layout.h" /* clr_scr() */ +-#include "../src/main.h" /* mc_home */ ++#include "../src/main.h" /* mc_home, mc_home_alt */ + #include "../src/help.h" /* interactive_display() */ + #include "../src/key.h" /* XCTRL */ + #include "../src/dialog.h" /* do_refresh() */ +@@ -2833,12 +2833,15 @@ edit_block_process_cmd (WEdit *edit, con + return; + } + if (!(script_src = fopen (o, "r"))) { +- fclose (script_home); +- unlink (h); +- edit_error_dialog ("", get_sys_error (catstrs +- (_("Error reading script:"), +- o, (char *) NULL))); +- return; ++ o = catstrs (mc_home_alt, shell_cmd, (char *) NULL); ++ if (!(script_src = fopen (o, "r"))) { ++ fclose (script_home); ++ unlink (h); ++ edit_error_dialog ("", get_sys_error (catstrs ++ (_("Error reading script:"), ++ o, (char *) NULL))); ++ return; ++ } + } + while (fgets (buf, sizeof (buf), script_src)) + fputs (buf, script_home); +diff -up mc-4.6.2/edit/syntax.c.etcmc mc-4.6.2/edit/syntax.c +--- mc-4.6.2/edit/syntax.c.etcmc 2009-02-01 20:30:21.000000000 +0100 ++++ mc-4.6.2/edit/syntax.c 2009-05-26 18:05:21.000000000 +0200 +@@ -39,7 +39,7 @@ + #include "edit.h" + #include "edit-widget.h" + #include "../src/color.h" /* use_colors */ +-#include "../src/main.h" /* mc_home */ ++#include "../src/main.h" /* mc_home, mc_home_alt */ + #include "../src/wtools.h" /* message() */ + + /* bytes */ +@@ -682,6 +682,12 @@ static FILE *open_include_file (const ch + g_free (error_file_name); + error_file_name = g_strconcat (mc_home, PATH_SEP_STR "syntax" PATH_SEP_STR, + filename, (char *) NULL); ++ if (!(f = fopen (error_file_name, "r"))) { ++ g_free (error_file_name); ++ error_file_name = g_strconcat (mc_home_alt, PATH_SEP_STR "syntax" PATH_SEP_STR, ++ filename, (char *) NULL); ++ } else return f; ++ + return fopen (error_file_name, "r"); + } + +diff -up mc-4.6.2/src/charsets.c.etcmc mc-4.6.2/src/charsets.c +--- mc-4.6.2/src/charsets.c.etcmc 2009-05-26 18:05:21.000000000 +0200 ++++ mc-4.6.2/src/charsets.c 2009-05-26 18:05:21.000000000 +0200 +@@ -47,12 +47,17 @@ load_codepages_list (void) char *fname; char buf[256]; extern char *mc_home; @@ -8,20 +68,130 @@ extern int display_codepage; char *default_codepage = NULL; - fname = concat_dir_and_file (mc_home, CHARSETS_INDEX); + fname = mhl_str_dir_plus_file (mc_home, CHARSETS_INDEX); if (!(f = fopen (fname, "r"))) { - fprintf (stderr, _("Warning: file %s not found\n"), fname); + g_free (fname); -+ fname = concat_dir_and_file (mc_home_alt, CHARSETS_INDEX); ++ fname = mhl_str_dir_plus_file (mc_home_alt, CHARSETS_INDEX); + if (!(f = fopen (fname, "r"))) { + fprintf (stderr, _("Warning: file %s not found\n"), fname); + } g_free (fname); return -1; } ---- mc-4.6.1a/src/main.h.etcmc 2006-02-24 15:17:05.000000000 +0100 -+++ mc-4.6.1a/src/main.h 2006-02-24 15:17:05.000000000 +0100 -@@ -112,7 +112,7 @@ void print_vfs_message(const char *msg, +diff -up mc-4.6.2/src/cmd.c.etcmc mc-4.6.2/src/cmd.c +--- mc-4.6.2/src/cmd.c.etcmc 2009-05-26 18:05:21.000000000 +0200 ++++ mc-4.6.2/src/cmd.c 2009-05-26 18:05:21.000000000 +0200 +@@ -592,8 +592,13 @@ void ext_cmd (void) + check_for_default (extdir, buffer); + do_edit (buffer); + g_free (buffer); +- } else if (dir == 1) ++ } else if (dir == 1) { ++ if (!exist_file(extdir)) { ++ g_free (extdir); ++ extdir = mhl_str_dir_plus_file (mc_home_alt, MC_LIB_EXT); ++ } + do_edit (extdir); ++ } + + g_free (extdir); + flush_extension_file (); +@@ -616,6 +621,11 @@ menu_edit_cmd (int where) + ); + + menufile = mhl_str_dir_plus_file (mc_home, where ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); ++ ++ if (!exist_file(menufile)) { ++ g_free (menufile); ++ menufile = mhl_str_dir_plus_file (mc_home_alt, where ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); ++ } + + switch (dir) { + case 0: +@@ -630,6 +640,10 @@ menu_edit_cmd (int where) + + case 2: + buffer = mhl_str_dir_plus_file (mc_home, where ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); ++ if (!exist_file(buffer)) { ++ g_free (buffer); ++ buffer = mhl_str_dir_plus_file (mc_home_alt, where ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); ++ } + break; + + default: +@@ -688,7 +702,7 @@ edit_syntax_cmd (void) + _(" Which syntax file you want to edit? "), 0, 2, + _("&User"), _("&System Wide")); + } +- extdir = mhl_str_dir_plus_file (mc_home, "syntax" PATH_SEP_STR "Syntax"); ++ extdir = mhl_str_dir_plus_file (mc_home_alt, "syntax" PATH_SEP_STR "Syntax"); + + if (dir == 0) { + buffer = mhl_str_dir_plus_file (home_dir, SYNTAX_FILE); +diff -up mc-4.6.2/src/ext.c.etcmc mc-4.6.2/src/ext.c +--- mc-4.6.2/src/ext.c.etcmc 2009-02-01 20:30:21.000000000 +0100 ++++ mc-4.6.2/src/ext.c 2009-05-26 18:05:21.000000000 +0200 +@@ -446,6 +446,10 @@ regex_command (const char *filename, con + g_free (extension_file); + check_stock_mc_ext: + extension_file = mhl_str_dir_plus_file (mc_home, MC_LIB_EXT); ++ if (!exist_file (extension_file)) { ++ g_free (extension_file); ++ extension_file = mhl_str_dir_plus_file (mc_home_alt, MC_LIB_EXT); ++ } + mc_user_ext = 0; + } + data = load_file (extension_file); +diff -up mc-4.6.2/src/main.c.etcmc mc-4.6.2/src/main.c +--- mc-4.6.2/src/main.c.etcmc 2009-05-26 18:05:21.000000000 +0200 ++++ mc-4.6.2/src/main.c 2009-05-26 18:07:07.000000000 +0200 +@@ -291,9 +291,12 @@ char *xterm_title_str = NULL; + /* Is the LANG UTF-8 ? */ + gboolean is_utf8 = FALSE; + +-/* mc_home: The home of MC */ ++/* mc_home: The home of MC - /etc/mc or defined by MC_DATADIR */ + char *mc_home = NULL; + ++/* mc_home_alt: Alternative home of MC - deprecated /usr/share/mc */ ++char *mc_home_alt = NULL; ++ + char cmd_buf[512]; + + static void +@@ -1858,8 +1861,9 @@ OS_Setup (void) + if ((mc_libdir = getenv ("MC_DATADIR")) != NULL) { + mc_home = g_strdup (mc_libdir); + } else { +- mc_home = g_strdup (DATADIR); ++ mc_home = g_strdup (SYSCONFDIR); + } ++ mc_home_alt = mc_libdir != NULL ? g_strdup (SYSCONFDIR) : g_strdup (DATADIR); + } + + static void +@@ -1989,7 +1993,7 @@ process_args (poptContext ctx, int c, co + break; + + case 'f': +- printf ("%s\n", mc_home); ++ printf ("%s (%s)\n", mc_home, mc_home_alt); + exit (0); + break; + +@@ -2339,6 +2343,7 @@ main (int argc, char *argv[]) + } + g_free (last_wd_string); + ++ g_free (mc_home_alt); + g_free (mc_home); + done_key (); + #ifdef HAVE_CHARSET +diff -up mc-4.6.2/src/main.h.etcmc mc-4.6.2/src/main.h +--- mc-4.6.2/src/main.h.etcmc 2009-05-26 18:05:21.000000000 +0200 ++++ mc-4.6.2/src/main.h 2009-05-26 18:05:21.000000000 +0200 +@@ -114,7 +114,7 @@ void print_vfs_message(const char *msg, extern const char *prompt; extern const char *edit_one_file; @@ -30,52 +200,9 @@ char *get_mc_lib_dir (void); int maybe_cd (int move_up_dir); ---- mc-4.6.1a/src/ext.c.etcmc 2005-07-31 22:29:35.000000000 +0200 -+++ mc-4.6.1a/src/ext.c 2006-02-24 15:17:05.000000000 +0100 -@@ -444,6 +444,10 @@ regex_command (const char *filename, con - g_free (extension_file); - check_stock_mc_ext: - extension_file = concat_dir_and_file (mc_home, MC_LIB_EXT); -+ if (!exist_file (extension_file)) { -+ g_free (extension_file); -+ extension_file = concat_dir_and_file (mc_home_alt, MC_LIB_EXT); -+ } - mc_user_ext = 0; - } - data = load_file (extension_file); ---- mc-4.6.1a/src/setup.c.etcmc 2006-01-29 21:26:05.000000000 +0100 -+++ mc-4.6.1a/src/setup.c 2006-02-24 15:17:05.000000000 +0100 -@@ -481,8 +481,15 @@ setup_init (void) - if (exist_file (inifile)){ - g_free (profile); - profile = inifile; -- } else -+ } else { - g_free (inifile); -+ inifile = concat_dir_and_file (mc_home_alt, "mc.ini"); -+ if (exist_file (inifile)) { -+ g_free (profile); -+ profile = inifile; -+ } else -+ g_free (inifile); -+ } - } - - profile_name = profile; -@@ -501,6 +508,11 @@ load_setup (void) - /* mc.lib is common for all users, but has priority lower than - ~/.mc/ini. FIXME: it's only used for keys and treestore now */ - global_profile_name = concat_dir_and_file (mc_home, "mc.lib"); -+ -+ if (!exist_file(global_profile_name)) { -+ g_free (global_profile_name); -+ global_profile_name = concat_dir_and_file (mc_home_alt, "mc.lib"); -+ } - - /* Load integer boolean options */ - for (i = 0; int_options[i].opt_name; i++) ---- mc-4.6.1a/src/Makefile.am.etcmc 2006-02-04 12:13:30.000000000 +0100 -+++ mc-4.6.1a/src/Makefile.am 2006-02-24 15:17:05.000000000 +0100 +diff -up mc-4.6.2/src/Makefile.am.etcmc mc-4.6.2/src/Makefile.am +--- mc-4.6.2/src/Makefile.am.etcmc 2009-05-26 18:05:21.000000000 +0200 ++++ mc-4.6.2/src/Makefile.am 2009-05-26 18:05:21.000000000 +0200 @@ -8,9 +8,11 @@ bin_PROGRAMS = mc mcmfmt if CONS_SAVER pkglibexec_PROGRAMS = cons.saver @@ -90,9 +217,72 @@ endif noinst_PROGRAMS = man2hlp ---- mc-4.6.1a/src/util.c.etcmc 2006-02-24 15:17:05.000000000 +0100 -+++ mc-4.6.1a/src/util.c 2006-02-24 15:17:05.000000000 +0100 -@@ -40,7 +40,7 @@ +diff -up mc-4.6.2/src/Makefile.in.etcmc mc-4.6.2/src/Makefile.in +--- mc-4.6.2/src/Makefile.in.etcmc 2009-02-01 20:46:26.000000000 +0100 ++++ mc-4.6.2/src/Makefile.in 2009-05-26 18:09:15.000000000 +0200 +@@ -294,9 +294,8 @@ top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + AM_CFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir) + pkglibexecdir = $(libexecdir)/@PACKAGE@ +-@CONS_SAVER_FALSE@AM_CPPFLAGS = -DDATADIR=\""$(pkgdatadir)/"\" -DLOCALEDIR=\""$(localedir)"\" +-@CONS_SAVER_TRUE@AM_CPPFLAGS = -DDATADIR=\""$(pkgdatadir)/"\" -DLOCALEDIR=\""$(localedir)"\" \ +-@CONS_SAVER_TRUE@ -DSAVERDIR=\""$(pkglibexecdir)"\" ++@CONS_SAVER_FALSE@AM_CPPFLAGS = -DDATADIR=\""$(pkgdatadir)/"\" -DLOCALEDIR=\""$(localedir)"\" -DSYSCONFDIR=\""$(sysconfdir)/@PACKAGE@/"\" ++@CONS_SAVER_TRUE@AM_CPPFLAGS = -DDATADIR=\""$(pkgdatadir)/"\" -DLOCALEDIR=\""$(localedir)"\" -DSAVERDIR=\""$(pkglibexecdir)"\" -DSYSCONFDIR=\""$(sysconfdir)/@PACKAGE@/"\" + + man2hlp_LDADD = $(GLIB_LIBS) + mcmfmt_SOURCES = mfmt.c +diff -up mc-4.6.2/src/setup.c.etcmc mc-4.6.2/src/setup.c +--- mc-4.6.2/src/setup.c.etcmc 2009-05-26 18:05:21.000000000 +0200 ++++ mc-4.6.2/src/setup.c 2009-05-26 18:05:21.000000000 +0200 +@@ -522,8 +522,15 @@ setup_init (void) + if (exist_file (inifile)){ + g_free (profile); + profile = inifile; +- } else ++ } else { + g_free (inifile); ++ inifile = mhl_str_dir_plus_file (mc_home_alt, "mc.ini"); ++ if (exist_file (inifile)) { ++ g_free (profile); ++ profile = inifile; ++ } else ++ g_free (inifile); ++ } + } + + profile_name = profile; +@@ -542,6 +549,11 @@ load_setup (void) + /* mc.lib is common for all users, but has priority lower than + ~/.mc/ini. FIXME: it's only used for keys and treestore now */ + global_profile_name = mhl_str_dir_plus_file (mc_home, "mc.lib"); ++ ++ if (!exist_file(global_profile_name)) { ++ g_free (global_profile_name); ++ global_profile_name = mhl_str_dir_plus_file (mc_home_alt, "mc.lib"); ++ } + + /* Load integer boolean options */ + for (i = 0; int_options[i].opt_name; i++) +diff -up mc-4.6.2/src/user.c.etcmc mc-4.6.2/src/user.c +--- mc-4.6.2/src/user.c.etcmc 2009-02-01 20:30:21.000000000 +0100 ++++ mc-4.6.2/src/user.c 2009-05-26 18:05:21.000000000 +0200 +@@ -729,6 +729,11 @@ user_menu_cmd (struct WEdit *edit_widget + g_free (menu); + menu = mhl_str_dir_plus_file \ + (mc_home, edit_widget ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); ++ if (!exist_file (menu)) { ++ g_free (menu); ++ menu = mhl_str_dir_plus_file \ ++ (mc_home_alt, edit_widget ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); ++ } + } + } + +diff -up mc-4.6.2/src/util.c.etcmc mc-4.6.2/src/util.c +--- mc-4.6.2/src/util.c.etcmc 2009-05-26 18:05:21.000000000 +0200 ++++ mc-4.6.2/src/util.c 2009-05-26 18:05:21.000000000 +0200 +@@ -44,7 +44,7 @@ #include "tty.h" #include "global.h" #include "profile.h" @@ -101,7 +291,7 @@ #include "cmd.h" /* guess_message_value */ #include "mountlist.h" #include "win.h" /* xterm_flag */ -@@ -950,16 +950,25 @@ load_mc_home_file (const char *filename, +@@ -978,16 +978,25 @@ load_mc_home_file (const char *filename, if (!data) { g_free (hintfile); @@ -110,7 +300,7 @@ - lang[2] = 0; + g_free (hintfile_base); + -+ hintfile_base = concat_dir_and_file (mc_home_alt, filename); ++ hintfile_base = mhl_str_dir_plus_file (mc_home_alt, filename); + hintfile = g_strconcat (hintfile_base, ".", lang, (char *) NULL); data = load_file (hintfile); @@ -134,211 +324,33 @@ } } ---- mc-4.6.1a/src/cmd.c.etcmc 2006-02-04 12:12:28.000000000 +0100 -+++ mc-4.6.1a/src/cmd.c 2006-02-24 15:17:05.000000000 +0100 -@@ -570,8 +570,13 @@ void ext_cmd (void) - check_for_default (extdir, buffer); - do_edit (buffer); - g_free (buffer); -- } else if (dir == 1) -+ } else if (dir == 1) { -+ if (!exist_file(extdir)) { -+ g_free (extdir); -+ extdir = concat_dir_and_file (mc_home_alt, MC_LIB_EXT); -+ } - do_edit (extdir); -+ } - - g_free (extdir); - flush_extension_file (); -@@ -594,6 +599,11 @@ menu_edit_cmd (int where) - ); - - menufile = concat_dir_and_file (mc_home, where ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); -+ -+ if (!exist_file(menufile)) { -+ g_free (menufile); -+ menufile = concat_dir_and_file (mc_home_alt, where ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); -+ } - - switch (dir) { - case 0: -@@ -608,6 +618,10 @@ menu_edit_cmd (int where) - - case 2: - buffer = concat_dir_and_file (mc_home, where ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); -+ if (!exist_file(buffer)) { -+ g_free (buffer); -+ buffer = concat_dir_and_file (mc_home_alt, where ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); -+ } - break; - - default: -@@ -666,7 +680,7 @@ edit_syntax_cmd (void) - _(" Which syntax file you want to edit? "), 0, 2, - _("&User"), _("&System Wide")); - } -- extdir = concat_dir_and_file (mc_home, "syntax" PATH_SEP_STR "Syntax"); -+ extdir = concat_dir_and_file (mc_home_alt, "syntax" PATH_SEP_STR "Syntax"); - - if (dir == 0) { - buffer = concat_dir_and_file (home_dir, SYNTAX_FILE); ---- mc-4.6.1a/src/main.c.etcmc 2006-02-24 15:17:05.000000000 +0100 -+++ mc-4.6.1a/src/main.c 2006-02-24 15:17:05.000000000 +0100 -@@ -282,9 +282,12 @@ gboolean is_utf8 = FALSE; - /* The xterm title */ - char *xterm_title_str = NULL; - --/* mc_home: The home of MC */ -+/* mc_home: The home of MC - /etc/mc or defined by MC_DATADIR */ - char *mc_home = NULL; - -+/* mc_home_alt: Alternative home of MC - deprecated /usr/share/mc */ -+char *mc_home_alt = NULL; -+ - char cmd_buf[512]; - - static void -@@ -1817,8 +1820,9 @@ OS_Setup (void) - if ((mc_libdir = getenv ("MC_DATADIR")) != NULL) { - mc_home = g_strdup (mc_libdir); - } else { -- mc_home = g_strdup (DATADIR); -+ mc_home = g_strdup (SYSCONFDIR); - } -+ mc_home_alt = mc_libdir != NULL ? g_strdup (SYSCONFDIR) : g_strdup (DATADIR); - } - - static void -@@ -1948,7 +1952,7 @@ process_args (poptContext ctx, int c, co - break; - - case 'f': -- printf ("%s\n", mc_home); -+ printf ("%s (%s)\n", mc_home, mc_home_alt); - exit (0); - break; - -@@ -2326,6 +2330,7 @@ main (int argc, char *argv[]) - } - g_free (last_wd_string); - -+ g_free (mc_home_alt); - g_free (mc_home); - done_key (); - #ifdef HAVE_CHARSET ---- mc-4.6.1a/src/Makefile.in.etcmc 2006-02-15 21:12:44.000000000 +0100 -+++ mc-4.6.1a/src/Makefile.in 2006-02-24 15:17:05.000000000 +0100 -@@ -314,9 +314,10 @@ target_alias = @target_alias@ - AM_CFLAGS = $(GLIB_CFLAGS) - localedir = $(datadir)/locale - pkglibexecdir = $(libexecdir)/@PACKAGE@ --@CONS_SAVER_FALSE@AM_CPPFLAGS = -DDATADIR=\""$(pkgdatadir)/"\" -DLOCALEDIR=\""$(localedir)"\" -+@CONS_SAVER_FALSE@AM_CPPFLAGS = -DDATADIR=\""$(pkgdatadir)/"\" -DLOCALEDIR=\""$(localedir)"\" \ -+@CONS_SAVER_FALSE@ -DSYSCONFDIR=\""$(sysconfdir)/@PACKAGE@/"\" - @CONS_SAVER_TRUE@AM_CPPFLAGS = -DDATADIR=\""$(pkgdatadir)/"\" -DLOCALEDIR=\""$(localedir)"\" \ --@CONS_SAVER_TRUE@ -DSAVERDIR=\""$(pkglibexecdir)"\" -+@CONS_SAVER_TRUE@ -DSAVERDIR=\""$(pkglibexecdir)"\" -DSYSCONFDIR=\""$(sysconfdir)/@PACKAGE@/"\" - - man2hlp_LDADD = $(GLIB_LIBS) - mcmfmt_SOURCES = mfmt.c ---- mc-4.6.1a/src/user.c.etcmc 2006-02-04 15:41:42.000000000 +0100 -+++ mc-4.6.1a/src/user.c 2006-02-24 15:17:05.000000000 +0100 -@@ -726,6 +726,11 @@ user_menu_cmd (struct WEdit *edit_widget - g_free (menu); - menu = concat_dir_and_file \ - (mc_home, edit_widget ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); -+ if (!exist_file (menu)) { -+ g_free (menu); -+ menu = concat_dir_and_file \ -+ (mc_home_alt, edit_widget ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); -+ } - } - } - ---- mc-4.6.1a/edit/editcmd.c.etcmc 2006-02-24 15:17:05.000000000 +0100 -+++ mc-4.6.1a/edit/editcmd.c 2006-02-24 15:17:05.000000000 +0100 -@@ -49,7 +49,7 @@ - #include "../src/tty.h" /* LINES */ - #include "../src/widget.h" /* listbox_new() */ - #include "../src/layout.h" /* clr_scr() */ --#include "../src/main.h" /* mc_home */ -+#include "../src/main.h" /* mc_home, mc_home_alt */ - #include "../src/help.h" /* interactive_display() */ - #include "../src/key.h" /* XCTRL */ - #include "../src/dialog.h" /* do_refresh() */ -@@ -2790,12 +2790,15 @@ edit_block_process_cmd (WEdit *edit, con - return; - } - if (!(script_src = fopen (o, "r"))) { -- fclose (script_home); -- unlink (h); -- edit_error_dialog ("", get_sys_error (catstrs -- (_("Error reading script:"), -- o, (char *) NULL))); -- return; -+ o = catstrs (mc_home_alt, shell_cmd, (char *) NULL); -+ if (!(script_src = fopen (o, "r"))) { -+ fclose (script_home); -+ unlink (h); -+ edit_error_dialog ("", get_sys_error (catstrs -+ (_("Error reading script:"), -+ o, (char *) NULL))); -+ return; -+ } - } - while (fgets (buf, sizeof (buf), script_src)) - fputs (buf, script_home); ---- mc-4.6.1a/edit/syntax.c.etcmc 2006-02-04 15:41:42.000000000 +0100 -+++ mc-4.6.1a/edit/syntax.c 2006-02-24 15:17:05.000000000 +0100 -@@ -37,7 +37,7 @@ - #include "edit.h" - #include "edit-widget.h" - #include "../src/color.h" /* use_colors */ --#include "../src/main.h" /* mc_home */ -+#include "../src/main.h" /* mc_home, mc_home_alt */ - #include "../src/wtools.h" /* message() */ - - /* bytes */ -@@ -680,6 +680,12 @@ static FILE *open_include_file (const ch - g_free (error_file_name); - error_file_name = g_strconcat (mc_home, PATH_SEP_STR "syntax" PATH_SEP_STR, - filename, (char *) NULL); -+ if (!(f = fopen (error_file_name, "r"))) { -+ g_free (error_file_name); -+ error_file_name = g_strconcat (mc_home_alt, PATH_SEP_STR "syntax" PATH_SEP_STR, -+ filename, (char *) NULL); -+ } else return f; -+ - return fopen (error_file_name, "r"); - } - ---- mc-4.6.1a/vfs/extfs.c.etcmc 2005-09-05 02:52:57.000000000 +0200 -+++ mc-4.6.1a/vfs/extfs.c 2006-02-24 15:22:16.000000000 +0100 -@@ -242,7 +242,7 @@ extfs_open_archive (int fstype, const ch +diff -up mc-4.6.2/vfs/extfs.c.etcmc mc-4.6.2/vfs/extfs.c +--- mc-4.6.2/vfs/extfs.c.etcmc 2009-02-01 20:30:21.000000000 +0100 ++++ mc-4.6.2/vfs/extfs.c 2009-05-26 18:05:21.000000000 +0200 +@@ -249,7 +249,7 @@ extfs_open_archive (int fstype, const ch tmp = name_quote (name, 0); } -- mc_extfsdir = concat_dir_and_file (mc_home, "extfs" PATH_SEP_STR); -+ mc_extfsdir = concat_dir_and_file (mc_home_alt, "extfs" PATH_SEP_STR); +- mc_extfsdir = mhl_str_dir_plus_file (mc_home, "extfs" PATH_SEP_STR); ++ mc_extfsdir = mhl_str_dir_plus_file (mc_home_alt, "extfs" PATH_SEP_STR); cmd = g_strconcat (mc_extfsdir, extfs_prefixes[fstype], " list ", local_name ? local_name : tmp, (char *) NULL); -@@ -617,7 +617,7 @@ extfs_cmd (const char *extfs_cmd, struct +@@ -624,7 +624,7 @@ extfs_cmd (const char *extfs_cmd, struct archive_name = name_quote (extfs_get_archive_name (archive), 0); quoted_localname = name_quote (localname, 0); -- mc_extfsdir = concat_dir_and_file (mc_home, "extfs" PATH_SEP_STR); -+ mc_extfsdir = concat_dir_and_file (mc_home_alt, "extfs" PATH_SEP_STR); +- mc_extfsdir = mhl_str_dir_plus_file (mc_home, "extfs" PATH_SEP_STR); ++ mc_extfsdir = mhl_str_dir_plus_file (mc_home_alt, "extfs" PATH_SEP_STR); cmd = g_strconcat (mc_extfsdir, extfs_prefixes[archive->fstype], extfs_cmd, archive_name, " ", quoted_file, " ", quoted_localname, (char *) NULL); -@@ -646,7 +646,7 @@ extfs_run (struct vfs_class *me, const c +@@ -653,7 +653,7 @@ extfs_run (struct vfs_class *me, const c g_free (p); archive_name = name_quote (extfs_get_archive_name (archive), 0); -- mc_extfsdir = concat_dir_and_file (mc_home, "extfs" PATH_SEP_STR); -+ mc_extfsdir = concat_dir_and_file (mc_home_alt, "extfs" PATH_SEP_STR); +- mc_extfsdir = mhl_str_dir_plus_file (mc_home, "extfs" PATH_SEP_STR); ++ mc_extfsdir = mhl_str_dir_plus_file (mc_home_alt, "extfs" PATH_SEP_STR); cmd = g_strconcat (mc_extfsdir, extfs_prefixes[archive->fstype], " run ", archive_name, " ", q, (char *) NULL); g_free (mc_extfsdir); diff --git a/mc-extensions.patch b/mc-extensions.patch index d83829d..25b7570 100644 --- a/mc-extensions.patch +++ b/mc-extensions.patch @@ -1,7 +1,7 @@ -diff -up mc-4.6.2-pre1/configure.ac.extensions mc-4.6.2-pre1/configure.ac ---- mc-4.6.2-pre1/configure.ac.extensions 2007-09-10 16:25:30.000000000 +0200 -+++ mc-4.6.2-pre1/configure.ac 2009-04-15 15:29:14.000000000 +0200 -@@ -83,7 +83,7 @@ AC_PROG_LN_S +diff -up mc-4.6.2/configure.ac.extensions mc-4.6.2/configure.ac +--- mc-4.6.2/configure.ac.extensions 2009-02-01 20:30:21.000000000 +0100 ++++ mc-4.6.2/configure.ac 2009-05-26 14:42:48.000000000 +0200 +@@ -81,7 +81,7 @@ AC_PROG_LN_S AC_CHECK_TOOL(AR, ar, ar) dnl Only list browsers here that can be run in background (i.e. with `&') @@ -10,10 +10,10 @@ diff -up mc-4.6.2-pre1/configure.ac.extensions mc-4.6.2-pre1/configure.ac dnl dnl Ovverriding mmap support. This has to be before AC_FUNC_MMAP is used. -diff -up mc-4.6.2-pre1/configure.extensions mc-4.6.2-pre1/configure ---- mc-4.6.2-pre1/configure.extensions 2007-09-11 16:33:32.000000000 +0200 -+++ mc-4.6.2-pre1/configure 2009-04-15 15:29:14.000000000 +0200 -@@ -5736,7 +5736,7 @@ else +diff -up mc-4.6.2/configure.extensions mc-4.6.2/configure +--- mc-4.6.2/configure.extensions 2009-02-01 20:46:23.000000000 +0100 ++++ mc-4.6.2/configure 2009-05-26 14:42:48.000000000 +0200 +@@ -6843,7 +6843,7 @@ else fi @@ -22,9 +22,9 @@ diff -up mc-4.6.2-pre1/configure.extensions mc-4.6.2-pre1/configure do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -diff -up mc-4.6.2-pre1/lib/mc.ext.in.extensions mc-4.6.2-pre1/lib/mc.ext.in ---- mc-4.6.2-pre1/lib/mc.ext.in.extensions 2006-12-28 04:57:01.000000000 +0100 -+++ mc-4.6.2-pre1/lib/mc.ext.in 2009-04-15 15:30:51.000000000 +0200 +diff -up mc-4.6.2/lib/mc.ext.in.extensions mc-4.6.2/lib/mc.ext.in +--- mc-4.6.2/lib/mc.ext.in.extensions 2009-02-01 20:30:21.000000000 +0100 ++++ mc-4.6.2/lib/mc.ext.in 2009-05-26 14:44:46.000000000 +0200 @@ -119,6 +119,11 @@ regex/\.t(ar\.bz2|bz|b2)$ Open=%cd %p#utar View=%view{ascii} bzip2 -dc %f 2>/dev/null | tar tvvf - @@ -177,23 +177,17 @@ diff -up mc-4.6.2-pre1/lib/mc.ext.in.extensions mc-4.6.2-pre1/lib/mc.ext.in ### Video ### -@@ -395,20 +433,27 @@ regex/\.([mM][oO][vV]|[qQ][tT])$ - regex/\.([mM][pP]4|[mM][pP][eE]?[gG])$ +@@ -389,6 +427,9 @@ regex/\.([aA][sS][fFxX])$ + regex/\.([dD][iI][vV][xX])$ Include=video +regex/\.([mM][kK][vV])$ + Include=video + - regex/\.([vV][oO][bB])$ + regex/\.([mM][oO][vV]|[qQ][tT])$ Include=video - regex/\.([wW][mM][vV])$ - Include=video - -+regex/\.([fF][lL][iIcC])$ -+ Include=video -+ - regex/\.([oO][gG][mM])$ +@@ -408,10 +449,11 @@ regex/\.([oO][gG][mM])$ Include=video regex/\.([rR][aA]?[mM])$ @@ -206,7 +200,7 @@ diff -up mc-4.6.2-pre1/lib/mc.ext.in.extensions mc-4.6.2-pre1/lib/mc.ext.in #Open=(gtv %f >/dev/null 2>&1 &) #Open=(xanim %f >/dev/null 2>&1 &) -@@ -417,12 +462,13 @@ include/video +@@ -420,12 +462,13 @@ include/video # Postscript type/^PostScript @@ -222,7 +216,7 @@ diff -up mc-4.6.2-pre1/lib/mc.ext.in.extensions mc-4.6.2-pre1/lib/mc.ext.in #Open=(acroread %f &) #Open=(ghostview %f &) View=%view{ascii} pdftotext %f - -@@ -433,7 +479,7 @@ type/^PDF +@@ -436,7 +479,7 @@ type/^PDF # html regex/\.([hH][tT][mM][lL]?)$ Open=(if test -n "@X11_WWW@" && test -n "$DISPLAY"; then (@X11_WWW@ file://%d/%p &) 1>&2; else links %f || lynx -force_html %f || ${PAGER:-more} %f; fi) 2>/dev/null @@ -231,7 +225,7 @@ diff -up mc-4.6.2-pre1/lib/mc.ext.in.extensions mc-4.6.2-pre1/lib/mc.ext.in # StarOffice 5.2 shell/.sdw -@@ -450,22 +496,27 @@ shell/.abw +@@ -453,22 +496,27 @@ shell/.abw # Microsoft Word Document regex/\.([Dd][oO][cCtT]|[Ww][rR][iI])$ @@ -264,7 +258,7 @@ diff -up mc-4.6.2-pre1/lib/mc.ext.in.extensions mc-4.6.2-pre1/lib/mc.ext.in View=%view{ascii} xls2csv %f || strings %f # Use OpenOffice.org to open any MS Office documents -@@ -542,6 +593,11 @@ type/^compress +@@ -545,6 +593,11 @@ type/^compress Open=gzip -dc %f | %var{PAGER:more} View=%view{ascii} gzip -dc %f 2>/dev/null diff --git a/mc-newlinedir.patch b/mc-newlinedir.patch index d9eb6ea..c74d9e3 100644 --- a/mc-newlinedir.patch +++ b/mc-newlinedir.patch @@ -1,9 +1,10 @@ ---- mc-2006-11-14-16/src/main.c.newlinedir 2006-11-20 14:54:21.000000000 +0100 -+++ mc-2006-11-14-16/src/main.c 2006-11-20 14:47:52.000000000 +0100 -@@ -647,7 +647,7 @@ - } +diff -up mc-4.6.2/src/main.c.newlinedir mc-4.6.2/src/main.c +--- mc-4.6.2/src/main.c.newlinedir 2009-05-26 15:55:43.000000000 +0200 ++++ mc-4.6.2/src/main.c 2009-05-26 15:56:47.000000000 +0200 +@@ -640,7 +640,7 @@ _do_panel_cd (WPanel *panel, const char directory = *new_dir ? new_dir : home_dir; + ret_panel=panel; - if (mc_chdir (directory) == -1) { + if (strchr(directory,'\n') || mc_chdir (directory) == -1) { strcpy (panel->cwd, olddir); diff --git a/mc-preserveattr.patch b/mc-preserveattr.patch deleted file mode 100644 index 5ce71df..0000000 --- a/mc-preserveattr.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up mc-2007-06-04-22/src/file.c.preserveattr mc-2007-06-04-22/src/file.c ---- mc-2007-06-04-22/src/file.c.preserveattr 2007-11-14 14:45:23.000000000 +0100 -+++ mc-2007-06-04-22/src/file.c 2007-11-14 14:45:23.000000000 +0100 -@@ -800,7 +800,7 @@ copy_file_file (FileOpContext *ctx, cons - } - } - -- if (!appending) { -+ if (!appending && ctx->preserve) { - while (mc_chmod (dst_path, (src_mode & ctx->umask_kill))) { - temp_status = file_error ( - _(" Cannot chmod target file \"%s\" \n %s "), dst_path); diff --git a/mc-showfree.patch b/mc-showfree.patch index a997d13..52b6e2f 100644 --- a/mc-showfree.patch +++ b/mc-showfree.patch @@ -1,16 +1,186 @@ ---- mc-2007-01-24-03/src/setup.c.showfree 2006-02-23 16:45:06.000000000 +0100 -+++ mc-2007-01-24-03/src/setup.c 2007-02-15 09:53:48.000000000 +0100 -@@ -134,6 +134,7 @@ - { "show_mini_info", &show_mini_info }, - { "permission_mode", &permission_mode }, - { "filetype_mode", &filetype_mode }, -+ { "free_space", &free_space }, - { 0, 0 } - }; +diff -up mc-4.6.2/src/layout.c.showfree mc-4.6.2/src/layout.c +--- mc-4.6.2/src/layout.c.showfree 2009-05-26 14:57:36.000000000 +0200 ++++ mc-4.6.2/src/layout.c 2009-05-26 14:57:36.000000000 +0200 +@@ -97,6 +97,9 @@ int message_visible = 1; + /* Set to show current working dir in xterm window title */ + int xterm_title = 1; ---- mc-2007-01-24-03/src/main.c.showfree 2007-02-15 09:53:48.000000000 +0100 -+++ mc-2007-01-24-03/src/main.c 2007-02-15 09:53:48.000000000 +0100 -@@ -61,6 +61,7 @@ ++/* Set to show free space on device assigned to current directory */ ++int free_space = 1; ++ + /* The starting line for the output of the subprogram */ + int output_start_y = 0; + +@@ -126,6 +129,7 @@ static int _command_prompt; + static int _keybar_visible; + static int _message_visible; + static int _xterm_title; ++static int _free_space; + static int _permission_mode; + static int _filetype_mode; + +@@ -156,6 +160,7 @@ static struct { + int *variable; + WCheck *widget; + } check_options [] = { ++ { N_("show free sp&Ace"), &free_space, 0 }, + { N_("&Xterm window title"), &xterm_title, 0 }, + { N_("h&Intbar visible"), &message_visible, 0 }, + { N_("&Keybar visible"), &keybar_visible, 0 }, +@@ -227,8 +232,8 @@ static int b2left_cback (int action) + if (_equal_split){ + /* Turn equal split off */ + _equal_split = 0; +- check_options [6].widget->state = check_options [6].widget->state & ~C_BOOL; +- dlg_select_widget (check_options [6].widget); ++ check_options [7].widget->state = check_options [7].widget->state & ~C_BOOL; ++ dlg_select_widget (check_options [7].widget); + dlg_select_widget (bleft_widget); + } + _first_panel_size++; +@@ -242,8 +247,8 @@ static int b2right_cback (int action) + if (_equal_split){ + /* Turn equal split off */ + _equal_split = 0; +- check_options [6].widget->state = check_options [6].widget->state & ~C_BOOL; +- dlg_select_widget (check_options [6].widget); ++ check_options [7].widget->state = check_options [7].widget->state & ~C_BOOL; ++ dlg_select_widget (check_options [7].widget); + dlg_select_widget (bright_widget); + } + _first_panel_size--; +@@ -289,23 +294,24 @@ layout_callback (struct Dlg_head *h, dlg + if (old_output_lines != _output_lines){ + old_output_lines = _output_lines; + attrset (COLOR_NORMAL); +- dlg_move (h, 9, 16 + first_width); ++ dlg_move (h, 10, 16 + first_width); + addstr (output_lines_label); +- dlg_move (h, 9, 10 + first_width); ++ dlg_move (h, 10, 10 + first_width); + tty_printf ("%02d", _output_lines); + } + } + return MSG_HANDLED; + + case DLG_POST_KEY: +- _filetype_mode = check_options [8].widget->state & C_BOOL; +- _permission_mode = check_options [7].widget->state & C_BOOL; +- _equal_split = check_options [6].widget->state & C_BOOL; +- _menubar_visible = check_options [5].widget->state & C_BOOL; +- _command_prompt = check_options [4].widget->state & C_BOOL; +- _keybar_visible = check_options [2].widget->state & C_BOOL; +- _message_visible = check_options [1].widget->state & C_BOOL; +- _xterm_title = check_options [0].widget->state & C_BOOL; ++ _filetype_mode = check_options [9].widget->state & C_BOOL; ++ _permission_mode = check_options [8].widget->state & C_BOOL; ++ _equal_split = check_options [7].widget->state & C_BOOL; ++ _menubar_visible = check_options [6].widget->state & C_BOOL; ++ _command_prompt = check_options [5].widget->state & C_BOOL; ++ _keybar_visible = check_options [3].widget->state & C_BOOL; ++ _message_visible = check_options [2].widget->state & C_BOOL; ++ _xterm_title = check_options [1].widget->state & C_BOOL; ++ _free_space = check_options [0].widget->state & C_BOOL; + if (console_flag){ + int minimum; + if (_output_lines < 0) +@@ -333,7 +339,7 @@ layout_callback (struct Dlg_head *h, dlg + if (old_output_lines != _output_lines){ + old_output_lines = _output_lines; + attrset (COLOR_NORMAL); +- dlg_move (h, 9, 10 + first_width); ++ dlg_move (h, 10, 10 + first_width); + tty_printf ("%02d", _output_lines); + } + } +@@ -372,7 +378,7 @@ init_layout (void) + first_width = l1; + } + +- for (i = 0; i <= 8; i++) { ++ for (i = 0; i <= 9; i++) { + check_options[i].text = _(check_options[i].text); + l1 = mbstrlen (check_options[i].text) + 7; + if (l1 > first_width) +@@ -389,7 +395,7 @@ init_layout (void) + + + second_width = mbstrlen (title3) + 1; +- for (i = 0; i < 6; i++) { ++ for (i = 0; i < 7; i++) { + check_options[i].text = _(check_options[i].text); + l1 = mbstrlen (check_options[i].text) + 7; + if (l1 > second_width) +@@ -444,23 +450,23 @@ init_layout (void) + 0)); + if (console_flag) { + add_widget (layout_dlg, +- button_new (9, 12 + first_width, B_MINUS, ++ button_new (10, 12 + first_width, B_MINUS, + NARROW_BUTTON, "&-", bminus_cback)); + add_widget (layout_dlg, +- button_new (9, 7 + first_width, B_PLUS, NARROW_BUTTON, ++ button_new (10, 7 + first_width, B_PLUS, NARROW_BUTTON, + "&+", bplus_cback)); + } + #define XTRACT(i) *check_options[i].variable, check_options[i].text + +- for (i = 0; i < 6; i++) { ++ for (i = 0; i < 7; i++) { + check_options[i].widget = +- check_new (8 - i, 7 + first_width, XTRACT (i)); ++ check_new (9 - i, 7 + first_width, XTRACT (i)); + add_widget (layout_dlg, check_options[i].widget); + } +- check_options[8].widget = check_new (10, 6, XTRACT (8)); ++ check_options[9].widget = check_new (10, 6, XTRACT (9)); ++ add_widget (layout_dlg, check_options[9].widget); ++ check_options[8].widget = check_new (9, 6, XTRACT (8)); + add_widget (layout_dlg, check_options[8].widget); +- check_options[7].widget = check_new (9, 6, XTRACT (7)); +- add_widget (layout_dlg, check_options[7].widget); + + _filetype_mode = filetype_mode; + _permission_mode = permission_mode; +@@ -470,20 +476,21 @@ init_layout (void) + _keybar_visible = keybar_visible; + _message_visible = message_visible; + _xterm_title = xterm_title; ++ _free_space = free_space; + bright_widget = + button_new (6, 15, B_2RIGHT, NARROW_BUTTON, "&>", b2right_cback); + add_widget (layout_dlg, bright_widget); + bleft_widget = + button_new (6, 9, B_2LEFT, NARROW_BUTTON, "&<", b2left_cback); + add_widget (layout_dlg, bleft_widget); +- check_options[6].widget = check_new (5, 6, XTRACT (6)); ++ check_options[7].widget = check_new (5, 6, XTRACT (7)); + old_first_panel_size = -1; + old_horizontal_split = -1; + old_output_lines = -1; + + _first_panel_size = first_panel_size; + _output_lines = output_lines; +- add_widget (layout_dlg, check_options[6].widget); ++ add_widget (layout_dlg, check_options[7].widget); + radio_widget = radio_new (3, 6, 2, s_split_direction); + add_widget (layout_dlg, radio_widget); + radio_widget->sel = horizontal_split; +diff -up mc-4.6.2/src/layout.h.showfree mc-4.6.2/src/layout.h +--- mc-4.6.2/src/layout.h.showfree 2009-02-01 20:30:21.000000000 +0100 ++++ mc-4.6.2/src/layout.h 2009-05-26 14:57:36.000000000 +0200 +@@ -39,6 +39,7 @@ extern int keybar_visible; + extern int output_start_y; + extern int message_visible; + extern int xterm_title; ++extern int free_space; + + extern int horizontal_split; + extern int nice_rotating_dash; +diff -up mc-4.6.2/src/main.c.showfree mc-4.6.2/src/main.c +--- mc-4.6.2/src/main.c.showfree 2009-05-26 14:57:36.000000000 +0200 ++++ mc-4.6.2/src/main.c 2009-05-26 14:57:36.000000000 +0200 +@@ -62,6 +62,7 @@ #include "listmode.h" #include "execute.h" #include "ext.h" /* For flush_extension_file() */ @@ -18,7 +188,7 @@ /* Listbox for the command history feature */ #include "widget.h" -@@ -231,6 +232,12 @@ +@@ -233,6 +234,12 @@ Dlg_head *midnight_dlg; /* We need to paint it after CONSOLE_RESTORE, see: load_prompt */ int update_prompt = 0; @@ -31,7 +201,7 @@ /* The home directory */ const char *home_dir = NULL; -@@ -402,6 +409,8 @@ +@@ -404,6 +411,8 @@ update_panels (int force_update, const c int reload_other = !(force_update & UP_ONLY_CURRENT); WPanel *panel; @@ -40,7 +210,7 @@ update_one_panel (get_current_index (), force_update, current_file); if (reload_other) update_one_panel (get_other_index (), force_update, UP_KEEPSEL); -@@ -467,6 +476,38 @@ +@@ -469,6 +478,38 @@ stop_dialogs (void) } } @@ -79,9 +249,10 @@ static int quit_cmd_internal (int quiet) { ---- mc-2007-01-24-03/src/main.h.showfree 2007-02-15 09:53:48.000000000 +0100 -+++ mc-2007-01-24-03/src/main.h 2007-02-15 09:53:48.000000000 +0100 -@@ -55,6 +55,7 @@ +diff -up mc-4.6.2/src/main.h.showfree mc-4.6.2/src/main.h +--- mc-4.6.2/src/main.h.showfree 2009-05-26 14:57:36.000000000 +0200 ++++ mc-4.6.2/src/main.h 2009-05-26 14:57:36.000000000 +0200 +@@ -55,6 +55,7 @@ extern int cd_symlinks; extern int show_all_if_ambiguous; extern int slow_terminal; extern int update_prompt; /* To comunicate with subshell */ @@ -89,7 +260,7 @@ extern int safe_delete; extern int confirm_delete; extern int confirm_directory_hotlist_delete; -@@ -102,6 +103,7 @@ +@@ -102,6 +103,7 @@ void change_panel (void); int load_prompt (int, void *); void save_cwds_stat (void); void quiet_quit_cmd (void); /* For cmd.c and command.c */ @@ -97,9 +268,10 @@ void touch_bar (void); void update_xterm_title_path (void); ---- mc-2007-01-24-03/src/screen.c.showfree 2007-02-15 09:53:48.000000000 +0100 -+++ mc-2007-01-24-03/src/screen.c 2007-02-15 09:53:48.000000000 +0100 -@@ -47,7 +47,7 @@ +diff -up mc-4.6.2/src/screen.c.showfree mc-4.6.2/src/screen.c +--- mc-4.6.2/src/screen.c.showfree 2009-05-26 14:57:36.000000000 +0200 ++++ mc-4.6.2/src/screen.c 2009-05-26 14:59:37.000000000 +0200 +@@ -49,7 +49,7 @@ #include "widget.h" #include "menu.h" /* menubar_visible */ #define WANT_WIDGETS @@ -107,16 +279,16 @@ +#include "main.h" /* the_menubar, show_free_space() */ #include "unixcompat.h" - #define ELEMENTS(arr) ( sizeof(arr) / sizeof((arr)[0]) ) -@@ -866,6 +866,7 @@ + #ifdef HAVE_CHARSET +@@ -884,6 +884,7 @@ mini_info_separator (WPanel *panel) hline ((slow_terminal ? '-' : ACS_HLINE) | NORMAL_COLOR, panel->widget.cols - 2); #endif /* !HAVE_SLANG */ + show_free_space (panel); } - static void -@@ -910,6 +911,8 @@ + void +@@ -938,6 +939,8 @@ show_dir (WPanel *panel) widget_move (&panel->widget, 0, panel->widget.cols - 3); addstr ("v"); @@ -125,180 +297,14 @@ if (panel->active) standend (); } ---- mc-2007-01-24-03/src/layout.c.showfree 2007-02-15 09:53:47.000000000 +0100 -+++ mc-2007-01-24-03/src/layout.c 2007-02-15 09:53:48.000000000 +0100 -@@ -96,6 +96,9 @@ - /* Set to show current working dir in xterm window title */ - int xterm_title = 1; +diff -up mc-4.6.2/src/setup.c.showfree mc-4.6.2/src/setup.c +--- mc-4.6.2/src/setup.c.showfree 2009-05-26 14:57:36.000000000 +0200 ++++ mc-4.6.2/src/setup.c 2009-05-26 14:57:36.000000000 +0200 +@@ -138,6 +138,7 @@ static const struct { + { "show_mini_info", &show_mini_info }, + { "permission_mode", &permission_mode }, + { "filetype_mode", &filetype_mode }, ++ { "free_space", &free_space }, + { 0, 0 } + }; -+/* Set to show free space on device assigned to current directory */ -+int free_space = 1; -+ - /* The starting line for the output of the subprogram */ - int output_start_y = 0; - -@@ -125,6 +128,7 @@ - static int _keybar_visible; - static int _message_visible; - static int _xterm_title; -+static int _free_space; - static int _permission_mode; - static int _filetype_mode; - -@@ -155,6 +159,7 @@ - int *variable; - WCheck *widget; - } check_options [] = { -+ { N_("show free sp&Ace"), &free_space, 0 }, - { N_("&Xterm window title"), &xterm_title, 0 }, - { N_("h&Intbar visible"), &message_visible, 0 }, - { N_("&Keybar visible"), &keybar_visible, 0 }, -@@ -226,8 +231,8 @@ - if (_equal_split){ - /* Turn equal split off */ - _equal_split = 0; -- check_options [6].widget->state = check_options [6].widget->state & ~C_BOOL; -- dlg_select_widget (check_options [6].widget); -+ check_options [7].widget->state = check_options [7].widget->state & ~C_BOOL; -+ dlg_select_widget (check_options [7].widget); - dlg_select_widget (bleft_widget); - } - _first_panel_size++; -@@ -241,8 +246,8 @@ - if (_equal_split){ - /* Turn equal split off */ - _equal_split = 0; -- check_options [6].widget->state = check_options [6].widget->state & ~C_BOOL; -- dlg_select_widget (check_options [6].widget); -+ check_options [7].widget->state = check_options [7].widget->state & ~C_BOOL; -+ dlg_select_widget (check_options [7].widget); - dlg_select_widget (bright_widget); - } - _first_panel_size--; -@@ -288,23 +293,24 @@ - if (old_output_lines != _output_lines){ - old_output_lines = _output_lines; - attrset (COLOR_NORMAL); -- dlg_move (h, 9, 16 + first_width); -+ dlg_move (h, 10, 16 + first_width); - addstr (output_lines_label); -- dlg_move (h, 9, 10 + first_width); -+ dlg_move (h, 10, 10 + first_width); - tty_printf ("%02d", _output_lines); - } - } - return MSG_HANDLED; - - case DLG_POST_KEY: -- _filetype_mode = check_options [8].widget->state & C_BOOL; -- _permission_mode = check_options [7].widget->state & C_BOOL; -- _equal_split = check_options [6].widget->state & C_BOOL; -- _menubar_visible = check_options [5].widget->state & C_BOOL; -- _command_prompt = check_options [4].widget->state & C_BOOL; -- _keybar_visible = check_options [2].widget->state & C_BOOL; -- _message_visible = check_options [1].widget->state & C_BOOL; -- _xterm_title = check_options [0].widget->state & C_BOOL; -+ _filetype_mode = check_options [9].widget->state & C_BOOL; -+ _permission_mode = check_options [8].widget->state & C_BOOL; -+ _equal_split = check_options [7].widget->state & C_BOOL; -+ _menubar_visible = check_options [6].widget->state & C_BOOL; -+ _command_prompt = check_options [5].widget->state & C_BOOL; -+ _keybar_visible = check_options [3].widget->state & C_BOOL; -+ _message_visible = check_options [2].widget->state & C_BOOL; -+ _xterm_title = check_options [1].widget->state & C_BOOL; -+ _free_space = check_options [0].widget->state & C_BOOL; - if (console_flag){ - int minimum; - if (_output_lines < 0) -@@ -332,7 +338,7 @@ - if (old_output_lines != _output_lines){ - old_output_lines = _output_lines; - attrset (COLOR_NORMAL); -- dlg_move (h, 9, 10 + first_width); -+ dlg_move (h, 10, 10 + first_width); - tty_printf ("%02d", _output_lines); - } - } -@@ -371,7 +377,7 @@ - first_width = l1; - } - -- for (i = 0; i <= 8; i++) { -+ for (i = 0; i <= 9; i++) { - check_options[i].text = _(check_options[i].text); - l1 = mbstrlen (check_options[i].text) + 7; - if (l1 > first_width) -@@ -388,7 +394,7 @@ - - - second_width = mbstrlen (title3) + 1; -- for (i = 0; i < 6; i++) { -+ for (i = 0; i < 7; i++) { - check_options[i].text = _(check_options[i].text); - l1 = mbstrlen (check_options[i].text) + 7; - if (l1 > second_width) -@@ -443,23 +449,23 @@ - 0)); - if (console_flag) { - add_widget (layout_dlg, -- button_new (9, 12 + first_width, B_MINUS, -+ button_new (10, 12 + first_width, B_MINUS, - NARROW_BUTTON, "&-", bminus_cback)); - add_widget (layout_dlg, -- button_new (9, 7 + first_width, B_PLUS, NARROW_BUTTON, -+ button_new (10, 7 + first_width, B_PLUS, NARROW_BUTTON, - "&+", bplus_cback)); - } - #define XTRACT(i) *check_options[i].variable, check_options[i].text - -- for (i = 0; i < 6; i++) { -+ for (i = 0; i < 7; i++) { - check_options[i].widget = -- check_new (8 - i, 7 + first_width, XTRACT (i)); -+ check_new (9 - i, 7 + first_width, XTRACT (i)); - add_widget (layout_dlg, check_options[i].widget); - } -- check_options[8].widget = check_new (10, 6, XTRACT (8)); -+ check_options[9].widget = check_new (10, 6, XTRACT (9)); -+ add_widget (layout_dlg, check_options[9].widget); -+ check_options[8].widget = check_new (9, 6, XTRACT (8)); - add_widget (layout_dlg, check_options[8].widget); -- check_options[7].widget = check_new (9, 6, XTRACT (7)); -- add_widget (layout_dlg, check_options[7].widget); - - _filetype_mode = filetype_mode; - _permission_mode = permission_mode; -@@ -469,20 +475,21 @@ - _keybar_visible = keybar_visible; - _message_visible = message_visible; - _xterm_title = xterm_title; -+ _free_space = free_space; - bright_widget = - button_new (6, 15, B_2RIGHT, NARROW_BUTTON, "&>", b2right_cback); - add_widget (layout_dlg, bright_widget); - bleft_widget = - button_new (6, 9, B_2LEFT, NARROW_BUTTON, "&<", b2left_cback); - add_widget (layout_dlg, bleft_widget); -- check_options[6].widget = check_new (5, 6, XTRACT (6)); -+ check_options[7].widget = check_new (5, 6, XTRACT (7)); - old_first_panel_size = -1; - old_horizontal_split = -1; - old_output_lines = -1; - - _first_panel_size = first_panel_size; - _output_lines = output_lines; -- add_widget (layout_dlg, check_options[6].widget); -+ add_widget (layout_dlg, check_options[7].widget); - radio_widget = radio_new (3, 6, 2, s_split_direction); - add_widget (layout_dlg, radio_widget); - radio_widget->sel = horizontal_split; ---- mc-2007-01-24-03/src/layout.h.showfree 2004-12-03 20:17:47.000000000 +0100 -+++ mc-2007-01-24-03/src/layout.h 2007-02-15 09:53:48.000000000 +0100 -@@ -39,6 +39,7 @@ - extern int output_start_y; - extern int message_visible; - extern int xterm_title; -+extern int free_space; - - extern int horizontal_split; - extern int nice_rotating_dash; diff --git a/mc-userhost.patch b/mc-userhost.patch index e540652..59a6a04 100644 --- a/mc-userhost.patch +++ b/mc-userhost.patch @@ -1,14 +1,51 @@ ---- mc-4.6.1a/src/main.c.userhost 2005-10-16 18:11:07.000000000 +0200 -+++ mc-4.6.1a/src/main.c 2005-10-16 18:14:26.000000000 +0200 -@@ -28,6 +28,7 @@ - #include - #include - #include -+#include +diff -up mc-4.6.2/edit/editwidget.c.userhost mc-4.6.2/edit/editwidget.c +--- mc-4.6.2/edit/editwidget.c.userhost 2009-05-26 14:45:19.000000000 +0200 ++++ mc-4.6.2/edit/editwidget.c 2009-05-26 14:49:35.000000000 +0200 +@@ -46,6 +46,9 @@ + #include "../src/widget.h" /* buttonbar_redraw() */ + #include "../src/menu.h" /* menubar_new() */ + #include "../src/key.h" /* is_idle() */ ++#include "../src/main.h" /* xterm_title_str */ ++#include "../src/win.h" /* xterm_flag */ ++#include "../src/layout.h" /* xterm_title */ - #include - #include -@@ -1608,9 +1609,22 @@ void + WEdit *wedit; + struct WMenu *edit_menubar; +@@ -174,6 +177,11 @@ edit_file (const char *_file, int line) + Dlg_head *edit_dlg; + WButtonBar *edit_bar; + ++ if (xterm_flag && xterm_title && xterm_title_str) { ++ fprintf (stdout, "\33]0;mc - %s/%s\7", xterm_title_str, _file); ++ fflush(stdout); ++ } ++ + if (!made_directory) { + char *dir = mhl_str_dir_plus_file (home_dir, EDIT_DIR); + made_directory = (mkdir (dir, 0700) != -1 || errno == EEXIST); +@@ -208,6 +216,8 @@ edit_file (const char *_file, int line) + edit_done_menu (edit_menubar); /* editmenu.c */ + + destroy_dlg (edit_dlg); ++ ++ update_xterm_title_path(); + + return 1; + } +diff -up mc-4.6.2/src/main.c.userhost mc-4.6.2/src/main.c +--- mc-4.6.2/src/main.c.userhost 2009-05-26 14:45:19.000000000 +0200 ++++ mc-4.6.2/src/main.c 2009-05-26 14:48:06.000000000 +0200 +@@ -278,6 +278,9 @@ int midnight_shutdown = 0; + /* The user's shell */ + const char *shell = NULL; + ++/* The xterm title */ ++char *xterm_title_str = NULL; ++ + /* Is the LANG UTF-8 ? */ + gboolean is_utf8 = FALSE; + +@@ -1624,9 +1627,23 @@ void update_xterm_title_path (void) { char *p, *s; @@ -16,6 +53,7 @@ + struct passwd *pw; if (xterm_flag && xterm_title) { ++ if ( xterm_title_str ) g_free (xterm_title_str); p = s = g_strdup (strip_home_and_password (current_panel->cwd)); + if ( !gethostname (h, 64) ) { + h[63] = '\0'; /* Be sure the hostname is NUL terminated */ @@ -31,19 +69,30 @@ do { #ifndef UTF8 if (!is_printable ((unsigned char) *s)) ---- mc-4.6.1a/src/main.h.viewfile 2005-09-05 04:10:48.000000000 +0200 -+++ mc-4.6.1a/src/main.h 2005-10-17 14:41:46.000000000 +0200 -@@ -67,6 +67,7 @@ extern int alternate_plus_minus; +@@ -1639,7 +1656,7 @@ update_xterm_title_path (void) + numeric_keypad_mode (); + fprintf (stdout, "\33]0;mc - %s\7", p); + fflush (stdout); +- g_free (p); ++ xterm_title_str = p; + } + } + +diff -up mc-4.6.2/src/main.h.userhost mc-4.6.2/src/main.h +--- mc-4.6.2/src/main.h.userhost 2009-05-26 14:45:19.000000000 +0200 ++++ mc-4.6.2/src/main.h 2009-05-26 14:46:33.000000000 +0200 +@@ -69,6 +69,7 @@ extern int alternate_plus_minus; extern int only_leading_plus_minus; extern int output_starts_shell; extern int midnight_shutdown; +extern char *xterm_title_str; + extern gboolean is_utf8; extern char cmd_buf [512]; extern const char *shell; - ---- mc-4.6.1a/src/view.c.viewfile 2005-10-17 14:41:46.000000000 +0200 -+++ mc-4.6.1a/src/view.c 2005-10-17 15:11:54.000000000 +0200 -@@ -3344,6 +3344,11 @@ mc_internal_viewer (const char *command, +diff -up mc-4.6.2/src/view.c.userhost mc-4.6.2/src/view.c +--- mc-4.6.2/src/view.c.userhost 2009-05-26 14:45:19.000000000 +0200 ++++ mc-4.6.2/src/view.c 2009-05-26 14:45:19.000000000 +0200 +@@ -3368,6 +3368,11 @@ mc_internal_viewer (const char *command, WButtonBar *bar; Dlg_head *view_dlg; @@ -55,7 +104,7 @@ /* Create dialog and widgets, put them on the dialog */ view_dlg = create_dlg (0, 0, LINES, COLS, NULL, view_dialog_callback, -@@ -3367,6 +3372,8 @@ mc_internal_viewer (const char *command, +@@ -3391,6 +3396,8 @@ mc_internal_viewer (const char *command, } destroy_dlg (view_dlg); @@ -64,65 +113,3 @@ return succeeded; } ---- mc-4.6.1a/src/main.c.viewfile 2005-10-17 14:41:46.000000000 +0200 -+++ mc-4.6.1a/src/main.c 2005-10-17 14:41:46.000000000 +0200 -@@ -270,6 +270,9 @@ int midnight_shutdown = 0; - /* The user's shell */ - const char *shell = NULL; - -+/* The xterm title */ -+char *xterm_title_str = NULL; -+ - /* mc_home: The home of MC */ - char *mc_home = NULL; - -@@ -1617,6 +1620,7 @@ update_xterm_title_path (void) - struct passwd *pw; - - if (xterm_flag && xterm_title) { -+ if ( xterm_title_str ) g_free (xterm_title_str); - p = s = g_strdup (strip_home_and_password (current_panel->cwd)); - if ( !gethostname (h, 64) ) { - h[63] = '\0'; /* Be sure the hostname is NUL terminated */ -@@ -1639,7 +1643,7 @@ update_xterm_title_path (void) - } while (*++s); - fprintf (stdout, "\33]0;mc - %s\7", p); - fflush (stdout); -- g_free (p); -+ xterm_title_str = p; - } - } - ---- mc-4.6.1a/edit/editwidget.c.viewfile 2005-10-17 14:41:46.000000000 +0200 -+++ mc-4.6.1a/edit/editwidget.c 2005-10-17 14:41:46.000000000 +0200 -@@ -44,6 +44,9 @@ - #include "../src/widget.h" /* buttonbar_redraw() */ - #include "../src/menu.h" /* menubar_new() */ - #include "../src/key.h" /* is_idle() */ -+#include "../src/main.h" /* xterm_title_str */ -+#include "../src/win.h" /* xterm_flag */ -+#include "../src/layout.h" /* xterm_title */ - - WEdit *wedit; - struct WMenu *edit_menubar; -@@ -184,6 +187,11 @@ edit_file (const char *_file, int line) - static int made_directory = 0; - Dlg_head *edit_dlg; - WButtonBar *edit_bar; -+ -+ if (xterm_flag && xterm_title && xterm_title_str) { -+ fprintf (stdout, "\33]0;mc - %s/%s\7", xterm_title_str, _file); -+ fflush(stdout); -+ } - - if (!made_directory) { - char *dir = concat_dir_and_file (home_dir, EDIT_DIR); -@@ -219,6 +227,8 @@ edit_file (const char *_file, int line) - edit_done_menu (edit_menubar); /* editmenu.c */ - - destroy_dlg (edit_dlg); -+ -+ update_xterm_title_path(); - - return 1; - } diff --git a/mc-utf8-8bit-hex.patch b/mc-utf8-8bit-hex.patch deleted file mode 100644 index b634999..0000000 --- a/mc-utf8-8bit-hex.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- mc-2006-08-12-18/edit/editdraw.c.8bit-hex 2006-09-05 14:35:21.000000000 +0200 -+++ mc-2006-08-12-18/edit/editdraw.c 2006-09-05 14:35:21.000000000 +0200 -@@ -70,12 +70,22 @@ - */ - if (edit->curs1 < edit->last_byte) { - mc_wchar_t cur_byte = edit_get_byte (edit, edit->curs1); -+ mc_wchar_t cur_byte2 = cur_byte; - #ifndef UTF8 - g_snprintf (byte_str, sizeof (byte_str), "%c %3d 0x%02X", - is_printable (cur_byte) ? cur_byte : '.', - #else /* UTF8 */ -+ /* In 8-bit locales show the byte itself instead of its Unicode value */ -+ if (MB_CUR_MAX == 1) { -+ unsigned char cur_8bit_byte; -+ mbstate_t mbs; -+ memset (&mbs, 0, sizeof (mbs)); -+ if (wcrtomb(&cur_8bit_byte, cur_byte, &mbs) == 1) { -+ cur_byte = cur_8bit_byte; -+ } -+ } - g_snprintf (byte_str, sizeof(byte_str), "%lc %3d 0x%02X", -- iswprint(cur_byte) ? cur_byte : '.', -+ iswprint(cur_byte2) ? cur_byte2 : '.', - #endif /* UTF8 */ - (int) cur_byte, - (unsigned) cur_byte); diff --git a/mc-utf8-look-and-feel.patch b/mc-utf8-look-and-feel.patch deleted file mode 100644 index 96389c2..0000000 --- a/mc-utf8-look-and-feel.patch +++ /dev/null @@ -1,204 +0,0 @@ ---- mc-4.6.1a/src/main.c.laf 2005-11-24 16:55:06.000000000 +0100 -+++ mc-4.6.1a/src/main.c 2005-11-24 16:56:27.000000000 +0100 -@@ -270,6 +270,9 @@ int midnight_shutdown = 0; - /* The user's shell */ - const char *shell = NULL; - -+/* Is the LANG UTF-8 ? */ -+gboolean is_utf8 = FALSE; -+ - /* The xterm title */ - char *xterm_title_str = NULL; - -@@ -2167,6 +2170,16 @@ main (int argc, char *argv[]) - /* if on, it displays the information that files have been moved to ~/.mc */ - int show_change_notice = 0; - -+ /* Check whether we have UTF-8 locale */ -+ char *lang = getenv("LANG"); -+ size_t len = 0; -+ -+ if ( lang ) -+ len = strlen(lang); -+ -+ if ( len >= 5 && !strcasecmp(&lang[len-5],"UTF-8") ) -+ is_utf8 = TRUE; -+ - /* We had LC_CTYPE before, LC_ALL includs LC_TYPE as well */ - setlocale (LC_ALL, ""); - bindtextdomain ("mc", LOCALEDIR); ---- mc-4.6.1a/src/main.h.laf 2005-11-24 16:55:06.000000000 +0100 -+++ mc-4.6.1a/src/main.h 2005-11-24 16:55:06.000000000 +0100 -@@ -67,6 +67,7 @@ extern int alternate_plus_minus; - extern int only_leading_plus_minus; - extern int output_starts_shell; - extern int midnight_shutdown; -+extern gboolean is_utf8; - extern char *xterm_title_str; - extern char cmd_buf [512]; - extern const char *shell; ---- mc-4.6.1a/src/widget.c.laf 2005-11-24 16:55:06.000000000 +0100 -+++ mc-4.6.1a/src/widget.c 2005-11-24 16:55:06.000000000 +0100 -@@ -1948,52 +1948,86 @@ input_new (int y, int x, int color, int - return in; - } - -- --/* Listbox widget */ -- --/* Should draw the scrollbar, but currently draws only -- * indications that there is more information -- */ --static int listbox_cdiff (WLEntry *s, WLEntry *e); -+/* Vertical scrollbar widget */ - --static void --listbox_drawscroll (WListbox *l) -+void -+vscrollbar (Widget widget, int height, int width, int tpad, int bpad, -+ int selected, int count, gboolean color) - { - int line; -- int i, top; -- int max_line = l->height-1; -- -+ int i; -+ - /* Are we at the top? */ -- widget_move (&l->widget, 0, l->width); -- if (l->list == l->top) -- one_vline (); -+ widget_move (&widget, tpad, width); -+#ifndef UTF8 -+ if (!selected) -+ one_vline (); - else -- addch ('^'); -+ addch ('^'); -+#else -+ if (color) attrset (MARKED_COLOR); -+ if (is_utf8) -+ SLsmg_write_string("↑"); -+ else -+ addch ('^'); -+ if (color) attrset (NORMAL_COLOR); -+#endif - - /* Are we at the bottom? */ -- widget_move (&l->widget, max_line, l->width); -- top = listbox_cdiff (l->list, l->top); -- if ((top + l->height == l->count) || l->height >= l->count) -- one_vline (); -+ widget_move (&widget, height-1-bpad, width); -+#ifndef UTF8 -+ if (selected == count-1) -+ one_vline (); -+ else -+ addch ('v'); -+#else -+ if (color) attrset (MARKED_COLOR); -+ if (is_utf8) -+ SLsmg_write_string("↓"); - else -- addch ('v'); -+ addch('v'); -+ if (color) attrset (NORMAL_COLOR); -+#endif - - /* Now draw the nice relative pointer */ -- if (l->count) -- line = 1+ ((l->pos * (l->height-2)) / l->count); -+ if (count > 1) -+ line = tpad + 1 + ((selected * (height-3-tpad-bpad)) / (count-1)); - else -- line = 0; -- -- for (i = 1; i < max_line; i++){ -- widget_move (&l->widget, i, l->width); -- if (i != line) -- one_vline (); -- else -- addch ('*'); -+ line = 0; -+ -+ for (i = tpad + 1; i < height-1-bpad; i++){ -+ widget_move (&widget, i, width); -+ if (i != line) -+#ifndef UTF8 -+ one_vline (); -+ else -+ addch ('*'); -+#else -+ if (is_utf8) -+ SLsmg_write_string("â–’"); -+ else -+ one_vline(); -+ else { -+ if (color) attrset (MARKED_COLOR); -+ if (is_utf8) -+ SLsmg_write_string("â–®"); -+ else -+ addch('*'); -+ if (color) attrset (NORMAL_COLOR); -+ } -+#endif - } - } -- --static void -+ -+ -+/* Listbox widget */ -+ -+/* Should draw the scrollbar, but currently draws only -+ * indications that there is more information -+ */ -+static int listbox_cdiff (WLEntry *s, WLEntry *e); -+ -+void - listbox_draw (WListbox *l, int focused) - { - WLEntry *e; -@@ -2034,7 +2068,7 @@ listbox_draw (WListbox *l, int focused) - if (!l->scrollbar) - return; - attrset (normalc); -- listbox_drawscroll (l); -+ vscrollbar (l->widget, l->height, l->width, 0, 0, l->pos, l->count, FALSE); - } - - /* Returns the number of items between s and e, ---- mc-4.6.1a/src/screen.c.laf 2005-11-24 16:55:06.000000000 +0100 -+++ mc-4.6.1a/src/screen.c 2005-11-24 16:55:06.000000000 +0100 -@@ -888,6 +888,9 @@ show_dir (WPanel *panel) - } - #endif /* HAVE_SLANG */ - -+ vscrollbar (panel->widget, panel->widget.lines, panel->widget.cols-1, 2, 2, -+ panel->selected, panel->count, TRUE); -+ - if (panel->active) - attrset (REVERSE_COLOR); - -@@ -1504,7 +1507,7 @@ use_display_format (WPanel *panel, const - panel->dirty = 1; - - /* Status needn't to be split */ -- usable_columns = ((panel->widget.cols-2)/((isstatus) -+ usable_columns = ((panel->widget.cols-3)/((isstatus) - ? 1 - : (panel->split+1))) - (!isstatus && panel->split); - ---- mc-4.6.1a/src/widget.h.laf 2005-11-24 16:55:06.000000000 +0100 -+++ mc-4.6.1a/src/widget.h 2005-11-24 16:55:06.000000000 +0100 -@@ -170,6 +170,10 @@ void button_set_text (WButton *b, const - /* Listbox manager */ - WLEntry *listbox_get_data (WListbox *l, int pos); - -+/* Vertical scrollbar */ -+void vscrollbar (Widget widget, int height, int width, int tpad, int bpad, -+ int selected, int count, gboolean color); -+ - /* search text int listbox entries */ - WLEntry *listbox_search_text (WListbox *l, const char *text); - void listbox_select_entry (WListbox *l, WLEntry *dest); diff --git a/mc.spec b/mc.spec index cd2317e..85baf23 100644 --- a/mc.spec +++ b/mc.spec @@ -1,37 +1,34 @@ Summary: User-friendly text console file manager and visual shell Name: mc Version: 4.6.2 -Release: 10.pre1%{?dist} +Release: 11%{?dist} Epoch: 1 License: GPLv2 Group: System Environment/Shells -Source0: http://www.ibiblio.org/pub/Linux/utils/file/managers/mc/snapshots/mc-%{version}-pre1.tar.gz -URL: http://www.ibiblio.org/mc/ +# tarball from http://www.midnight-commander.org/downloads/3 +Source0: mc-%{version}.tar.gz +URL: http://www.midnight-commander.org/ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: glib2-devel e2fsprogs-devel slang-devel +BuildRequires: gettext cvs automake autoconf Requires: dev >= 0:3.3-3 -Patch0: mc-utf8.patch +# UTF-8 patch from http://www.midnight-commander.org/downloads/4 +Patch0: mc-4.6.2-utf8.patch Patch1: mc-extensions.patch Patch2: mc-userhost.patch Patch3: mc-64bit.patch -Patch4: mc-utf8-look-and-feel.patch -Patch5: mc-concat.patch Patch6: mc-showfree.patch Patch7: mc-cedit.patch Patch8: mc-delcheck.patch Patch9: mc-etcmc.patch Patch10: mc-exit.patch -Patch11: mc-utf8-8bit-hex.patch Patch12: mc-ipv6.patch Patch13: mc-newlinedir.patch -Patch14: mc-cloexec.patch Patch15: mc-prompt.patch Patch16: mc-refresh.patch -Patch17: mc-preserveattr.patch Patch18: mc-lzma.patch Patch19: mc-hintchk.patch -Patch20: mc-7zip.patch Patch21: mc-oldrpmtags.patch Patch22: mc-shellcwd.patch Patch23: mc-cedit-configurable-highlight.patch @@ -45,28 +42,22 @@ ability to FTP, view tar and zip files, and to poke into RPMs for specific files. %prep -%setup -q -n %{name}-%{version}-pre1 +%setup -q %patch0 -p1 -b .utf8 %patch1 -p1 -b .extensions %patch2 -p1 -b .userhost %patch3 -p1 -b .64bit -%patch4 -p1 -b .laf -%patch5 -p1 -b .concat %patch6 -p1 -b .showfree %patch7 -p1 -b .cedit %patch8 -p1 -b .delcheck %patch9 -p1 -b .etcmc %patch10 -p1 -b .exit -%patch11 -p1 -b .8bit-hex %patch12 -p1 -b .ipv6 %patch13 -p1 -b .newlinedir -%patch14 -p1 -b .cloexec %patch15 -p1 -b .prompt %patch16 -p1 -b .refresh -%patch17 -p1 -b .preserveattr %patch18 -p1 -b .lzmavfs %patch19 -p1 -b .hintchk -%patch20 -p1 -b .7zip %patch21 -p1 -b .oldrpmtags %patch22 -p1 -b .shellcwd %patch23 -p1 -b .cedit-configurable-highlight @@ -132,6 +123,7 @@ done popd %build +./autogen.sh export CFLAGS="-DUTF8=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $RPM_OPT_FLAGS -fgnu89-inline" %configure --with-screen=slang \ --enable-charset \ @@ -208,6 +200,14 @@ rm -rf $RPM_BUILD_ROOT %dir %{_libexecdir}/mc %changelog +* Wed May 17 2009 Jindrich Novy 4.6.2-11 +- update to mc-4.6.2 release +- drop .8bit-hex, .preserveattrs, .cloexec, .7zip and part of + .utf8-look-and-feel patch, applied upstream +- sync the rest of patches, adopt upstream version of UTF8 patch +- update URL and source links +- add required BR + * Fri May 15 2009 Jindrich Novy 4.6.2-10.pre1 - fix segfault in mc editor when pressing ctrl+right (skip one word) in binary file (#500818) diff --git a/sources b/sources index cd694a5..70216ee 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -7626c446f016b09fd1210f00b9d0c292 mc-4.6.2-pre1.tar.gz +ec92966f4d0c8b50c344fe901859ae2a mc-4.6.2.tar.gz