summaryrefslogtreecommitdiff
path: root/recipes/mc
diff options
context:
space:
mode:
authorDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
committerDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
commit709c4d66e0b107ca606941b988bad717c0b45d9b (patch)
tree37ee08b1eb308f3b2b6426d5793545c38396b838 /recipes/mc
parentfa6cd5a3b993f16c27de4ff82b42684516d433ba (diff)
rename packages/ to recipes/ per earlier agreement
See links below for more details: http://thread.gmane.org/gmane.comp.handhelds.openembedded/21326 http://thread.gmane.org/gmane.comp.handhelds.openembedded/21816 Signed-off-by: Denys Dmytriyenko <denis@denix.org> Acked-by: Mike Westerhof <mwester@dls.net> Acked-by: Philip Balister <philip@balister.org> Acked-by: Khem Raj <raj.khem@gmail.com> Acked-by: Marcin Juszkiewicz <hrw@openembedded.org> Acked-by: Koen Kooi <koen@openembedded.org> Acked-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Diffstat (limited to 'recipes/mc')
-rw-r--r--recipes/mc/mc-4.6.2/00-70-utf8-common.patch46
-rw-r--r--recipes/mc/mc-4.6.2/00-73-utf8-bottom-buttons-width.patch21
-rw-r--r--recipes/mc/mc-4.6.2/00-75-utf8-cmdline-help.patch63
-rw-r--r--recipes/mc/mc-4.6.2/00-76-utf8-hotlist-highlight.patch23
-rw-r--r--recipes/mc/mc-4.6.2/00-77-utf8-filename-search-highlight.patch17
-rw-r--r--recipes/mc/mc-4.6.2/01_ftpfs_symlink.patch32
-rw-r--r--recipes/mc/mc-4.6.2/02_ignore_ftp_chmod_error.patch11
-rw-r--r--recipes/mc/mc-4.6.2/99_regexp-replace-fixed.patch312
-rw-r--r--recipes/mc/mc-4.6.2/99b_fix-regex-pattern-lengths.patch53
-rw-r--r--recipes/mc/mc-4.6.2/cross-compile.patch16
-rw-r--r--recipes/mc/mc-4.6.2/mc-cursor-appearance.patch52
-rw-r--r--recipes/mc/mc-4.6.2/mc-esc-seq.patch11
-rw-r--r--recipes/mc/mc-4.6.2/mc-utf8-look-and-feel.patch206
-rw-r--r--recipes/mc/mc-4.6.2/mc-utf8-nlink.patch11
-rw-r--r--recipes/mc/mc-4.6.2/mc-utf8-slang-codeset.patch20
-rw-r--r--recipes/mc/mc-4.6.2/mc-utf8.patch5357
-rw-r--r--recipes/mc/mc-4.6.2/mhl-stdbool.patch16
-rw-r--r--recipes/mc/mc-4.6.2/multi-press-f-keys.patch55
-rw-r--r--recipes/mc/mc.inc47
-rw-r--r--recipes/mc/mc_4.6.0.bb2
-rw-r--r--recipes/mc/mc_4.6.1.bb2
-rw-r--r--recipes/mc/mc_4.6.2.bb76
22 files changed, 6449 insertions, 0 deletions
diff --git a/recipes/mc/mc-4.6.2/00-70-utf8-common.patch b/recipes/mc/mc-4.6.2/00-70-utf8-common.patch
new file mode 100644
index 0000000000..244a01580a
--- /dev/null
+++ b/recipes/mc/mc-4.6.2/00-70-utf8-common.patch
@@ -0,0 +1,46 @@
+Some common stuff used by other UTF-8 patches.
+
+================================================================================
+--- mc-4.6.2/src/util.c
++++ mc-4.6.2/src/util.c
+@@ -145,6 +145,30 @@
+ return strlen (str);
+ }
+
++int
++columns_to_bytes (const char *str, int col)
++{
++ int bytes = 0;
++ int columns = 0;
++ int i;
++#ifdef UTF8
++ if (SLsmg_Is_Unicode) {
++ static mbstate_t s;
++ while (columns < col) {
++ memset (&s, 0, sizeof (s));
++ i = mbrlen (str + bytes, -1, &s);
++ if (i <= 0) {
++ return col + bytes - columns;
++ }
++ bytes += i;
++ columns ++;
++ }
++ return col + bytes - columns;
++ } else
++#endif
++ return col;
++}
++
+ #ifdef UTF8
+
+ void
+--- mc-4.6.2/src/util.h
++++ mc-4.6.2/src/util.h
+@@ -104,6 +104,7 @@
+
+ void fix_utf8(char *str);
+ size_t mbstrlen (const char *);
++int columns_to_bytes (const char *, int);
+ wchar_t *mbstr_to_wchar (const char *);
+ char *wchar_to_mbstr (const wchar_t *);
+ char *utf8_to_local(char *str);
diff --git a/recipes/mc/mc-4.6.2/00-73-utf8-bottom-buttons-width.patch b/recipes/mc/mc-4.6.2/00-73-utf8-bottom-buttons-width.patch
new file mode 100644
index 0000000000..a7bc41c59b
--- /dev/null
+++ b/recipes/mc/mc-4.6.2/00-73-utf8-bottom-buttons-width.patch
@@ -0,0 +1,21 @@
+Use six character width cyan rectangles for bottom row's buttons.
+
+================================================================================
+--- mc-4.6.2/src/widget.c
++++ mc-4.6.2/src/widget.c
+@@ -2562,11 +2562,14 @@
+ attrset (DEFAULT_COLOR);
+ tty_printf ("%-*s", bb->widget.cols, "");
+ for (i = 0; i < COLS / 8 && i < 10; i++) {
++ int j;
+ widget_move (&bb->widget, 0, i * 8);
+ attrset (DEFAULT_COLOR);
+ tty_printf ("%d", i + 1);
+ attrset (SELECTED_COLOR);
+- tty_printf ("%-*s", ((i + 1) * 8 == COLS ? 5 : 6),
++ j = columns_to_bytes(bb->labels [i].text ? bb->labels [i].text : "",
++ ((i + 1) * 8 == COLS ? 5 : 6));
++ tty_printf ("%-*s", j,
+ bb->labels[i].text ? bb->labels[i].text : "");
+ attrset (DEFAULT_COLOR);
+ }
diff --git a/recipes/mc/mc-4.6.2/00-75-utf8-cmdline-help.patch b/recipes/mc/mc-4.6.2/00-75-utf8-cmdline-help.patch
new file mode 100644
index 0000000000..5f1227d30a
--- /dev/null
+++ b/recipes/mc/mc-4.6.2/00-75-utf8-cmdline-help.patch
@@ -0,0 +1,63 @@
+Fix formatting the output of "mc --help".
+
+================================================================================
+--- mc-4.6.2/src/main.c
++++ mc-4.6.2/src/main.c
+@@ -1865,7 +1865,7 @@
+
+ /* print help for options */
+ leftColWidth = poptPrintHelp (ctx, stream, 0);
+- fprintf (stream, " %-*s %s\n", leftColWidth, _("+number"),
++ fprintf (stream, " %-*s %s\n", leftColWidth + strlen(_("+number")) - mbstrlen(_("+number")), _("+number"),
+ _("Set initial line number for the internal editor"));
+ fputs (_
+ ("\n"
+--- mc-4.6.2/src/popthelp.c
++++ mc-4.6.2/src/popthelp.c
+@@ -101,7 +101,7 @@
+ goto out;
+ }
+
+- helpLength = strlen(help);
++ helpLength = mbstrlen(help);
+ while (helpLength > lineLength) {
+ ch = help + lineLength - 1;
+ while (ch > help && !isspace((unsigned char) *ch)) ch--;
+@@ -112,7 +112,7 @@
+ fprintf(f, "%.*s\n%*s", (int) (ch - help), help, indentLength, " ");
+ help = ch;
+ while (isspace((unsigned char) *help) && *help) help++;
+- helpLength = strlen(help);
++ helpLength = mbstrlen(help);
+ }
+
+ if (helpLength) fprintf(f, "%s\n", help);
+@@ -233,7 +233,7 @@
+ if (len == 3) return cursor;
+
+ if (argDescrip)
+- len += strlen(argDescrip) + 1;
++ len += mbstrlen(argDescrip) + 1;
+
+ if ((cursor + len) > 79) {
+ fprintf(f, "\n ");
+@@ -304,7 +304,7 @@
+ singleTableUsage(f, cursor, con->options, NULL);
+
+ if (con->otherHelp) {
+- cursor += strlen(con->otherHelp) + 1;
++ cursor += mbstrlen(con->otherHelp) + 1;
+ if (cursor > 79) fprintf(f, "\n ");
+ fprintf(f, " %s", con->otherHelp);
+ }
+--- mc-4.6.2/src/util.c
++++ mc-4.6.2/src/util.c
+@@ -152,7 +152,7 @@
+ int columns = 0;
+ int i;
+ #ifdef UTF8
+- if (SLsmg_Is_Unicode) {
++ if (1) {
+ static mbstate_t s;
+ while (columns < col) {
+ memset (&s, 0, sizeof (s));
diff --git a/recipes/mc/mc-4.6.2/00-76-utf8-hotlist-highlight.patch b/recipes/mc/mc-4.6.2/00-76-utf8-hotlist-highlight.patch
new file mode 100644
index 0000000000..38e0337ad6
--- /dev/null
+++ b/recipes/mc/mc-4.6.2/00-76-utf8-hotlist-highlight.patch
@@ -0,0 +1,23 @@
+Highlight the lines of hotlist in full width.
+
+================================================================================
+--- mc-4.6.2/src/widget.c
++++ mc-4.6.2/src/widget.c
+@@ -1994,6 +1994,7 @@
+ {
+ WLEntry *e;
+ int i;
++ int j;
+ int sel_line;
+ Dlg_head *h = l->widget.parent;
+ int normalc = DLG_NORMALC (h);
+@@ -2024,7 +2025,8 @@
+ text = e->text;
+ e = e->next;
+ }
+- tty_printf (" %-*s ", l->width-2, name_trunc (text, l->width-2));
++ j = columns_to_bytes (name_trunc (text, l->width-2), l->width-2);
++ tty_printf (" %-*s ", j, name_trunc (text, l->width-2));
+ }
+ l->cursor_y = sel_line;
+ if (!l->scrollbar)
diff --git a/recipes/mc/mc-4.6.2/00-77-utf8-filename-search-highlight.patch b/recipes/mc/mc-4.6.2/00-77-utf8-filename-search-highlight.patch
new file mode 100644
index 0000000000..912d8eb72b
--- /dev/null
+++ b/recipes/mc/mc-4.6.2/00-77-utf8-filename-search-highlight.patch
@@ -0,0 +1,17 @@
+Quick filename search (^S) highlights correct width.
+
+================================================================================
+--- mc-4.6.2/src/screen.c
++++ mc-4.6.2/src/screen.c
+@@ -771,8 +771,10 @@
+ widget_move (&panel->widget, llines (panel)+3, 1);
+
+ if (panel->searching){
++ int j;
+ attrset (INPUT_COLOR);
+- tty_printf ("/%-*s", panel->widget.cols-3, panel->search_buffer);
++ j = columns_to_bytes (panel->search_buffer, panel->widget.cols-3);
++ tty_printf ("/%-*s", j, panel->search_buffer);
+ attrset (NORMAL_COLOR);
+ return;
+ }
diff --git a/recipes/mc/mc-4.6.2/01_ftpfs_symlink.patch b/recipes/mc/mc-4.6.2/01_ftpfs_symlink.patch
new file mode 100644
index 0000000000..f05a424cac
--- /dev/null
+++ b/recipes/mc/mc-4.6.2/01_ftpfs_symlink.patch
@@ -0,0 +1,32 @@
+--- mc-4.6.2/vfs/direntry.c
++++ mc-4.6.2/vfs/direntry.c
+@@ -251,7 +251,13 @@
+ char * const pathref = g_strdup (a_path);
+ char *path = pathref;
+
+- canonicalize_pathname (path);
++ if (strncmp(me->name, "ftpfs", 5) != 0)
++ canonicalize_pathname (path);
++ else {
++ char *p = path + strlen (path) - 1;
++ while (p > path && *p == PATH_SEP)
++ *p-- = 0;
++ }
+
+ while (root) {
+ while (*path == PATH_SEP) /* Strip leading '/' */
+@@ -324,7 +330,13 @@
+ if (root->super->root != root)
+ vfs_die ("We have to use _real_ root. Always. Sorry.");
+
+- canonicalize_pathname (path);
++ if (strncmp (me->name, "ftpfs", 5) != 0)
++ canonicalize_pathname (path);
++ else {
++ char *p = path + strlen (path) - 1;
++ while (p > path && *p == PATH_SEP)
++ *p-- = 0;
++ }
+
+ if (!(flags & FL_DIR)) {
+ char *dirname, *name, *save;
diff --git a/recipes/mc/mc-4.6.2/02_ignore_ftp_chmod_error.patch b/recipes/mc/mc-4.6.2/02_ignore_ftp_chmod_error.patch
new file mode 100644
index 0000000000..6ad176dfa1
--- /dev/null
+++ b/recipes/mc/mc-4.6.2/02_ignore_ftp_chmod_error.patch
@@ -0,0 +1,11 @@
+--- mc-4.6.2/vfs/ftpfs.c
++++ mc-4.6.2/vfs/ftpfs.c
+@@ -1529,7 +1529,7 @@
+ char buf[BUF_SMALL];
+
+ g_snprintf(buf, sizeof(buf), "SITE CHMOD %4.4o /%%s", mode & 07777);
+- return ftpfs_send_command(me, path, buf, OPT_FLUSH);
++ return ftpfs_send_command(me, path, buf, OPT_FLUSH | OPT_IGNORE_ERROR);
+ }
+
+ static int ftpfs_chown (struct vfs_class *me, const char *path, int owner, int group)
diff --git a/recipes/mc/mc-4.6.2/99_regexp-replace-fixed.patch b/recipes/mc/mc-4.6.2/99_regexp-replace-fixed.patch
new file mode 100644
index 0000000000..612d77736b
--- /dev/null
+++ b/recipes/mc/mc-4.6.2/99_regexp-replace-fixed.patch
@@ -0,0 +1,312 @@
+--- mc-4.6.2/edit/editcmd.c
++++ mc-4.6.2/edit/editcmd.c
+@@ -2103,6 +2103,33 @@
+ edit_error_dialog (_("Error"), _(" Invalid regular expression, or scanf expression with too many conversions "));
+ }
+
++int mc_isdigit(mc_wchar_t c)
++{
++#ifndef UTF8
++ return isdigit(c);
++#else /* UTF8 */
++ return iswdigit(c);
++#endif /* UTF8 */
++}
++
++mc_wchar_t * mc_memmove(mc_wchar_t *to, mc_wchar_t *from, size_t size)
++{
++#ifndef UTF8
++ return memmove(to, from, size);
++#else /* UTF8 */
++ return wmemmove(to, from, size);
++#endif /* UTF8 */
++}
++
++mc_wchar_t * mc_strchr(mc_wchar_t *str, mc_wchar_t c)
++{
++#ifndef UTF8
++ return strchr(str, c);
++#else /* UTF8 */
++ return wcschr(str, c);
++#endif /* UTF8 */
++}
++
+ /* call with edit = 0 before shutdown to close memory leaks */
+ void
+ edit_replace_cmd (WEdit *edit, int again)
+@@ -2119,6 +2146,8 @@
+ int replace_continue;
+ int treplace_prompt = 0;
+ long times_replaced = 0, last_search;
++ mc_wchar_t *repl_templ;
++ mc_wchar_t *repl_str;
+ int argord[NUM_REPL_ARGS];
+
+ if (!edit) {
+@@ -2172,7 +2201,68 @@
+
+ }
+
+- {
++#ifndef UTF8
++ repl_templ = g_strdup(input2);
++#else /* UTF8 */
++ repl_templ = mbstr_to_wchar(input2);
++#endif /* UTF8 */
++
++ if (replace_regexp) {
++ /*
++ * edit replace template - convert subpattern references (\1) to
++ * snprintf_p arguments (%s) and fill "argord" array to match captured
++ * subpatterns
++ */
++ int ao;
++ int ord;
++ mc_wchar_t *s;
++ mc_wchar_t *param;
++ mc_wchar_t *endptr;
++#ifndef UTF8
++#define MC_CHAR(c) ((mc_wchar_t) c)
++#else /* UTF8 */
++#define MC_CHAR(c) (L##c)
++#endif /* UTF8 */
++
++ endptr = mc_strchr(repl_templ, MC_CHAR('\0'));
++ s = repl_templ;
++ ao = 0;
++ while ((s = mc_strchr(s, MC_CHAR('\\')))) {
++ param = s;
++ s++;
++ if (!s) break;
++ /* implement \n \r and \t escape sequences in replace string */
++ if (*s == MC_CHAR('n')) {
++ *s = MC_CHAR('\n');
++ } else if (*s == MC_CHAR('r')) {
++ *s = MC_CHAR('\r');
++ } else if (*s == MC_CHAR('t')) {
++ *s = MC_CHAR('\t');
++ }
++ if (!mc_isdigit(*s)) {
++ mc_memmove(param, s, endptr - s + 1);
++ continue;
++ }
++ ord = 0;
++ while (mc_isdigit(*s)) {
++ ord *= 10;
++ ord += *s - MC_CHAR('0');
++ s++;
++ }
++ if ((ord > 0) && (ord <= NUM_REPL_ARGS)) {
++ argord[ao++] = ord - 1;
++ *param++ = MC_CHAR('%');
++ *param++ = MC_CHAR('s');
++ mc_memmove(param, s, endptr - s + 1);
++ s = param;
++ }
++ }
++ while (ao < NUM_REPL_ARGS) {
++ argord[ao] = ao;
++ ao++;
++ }
++
++ } else {
+ const char *s;
+ int ord;
+ size_t i;
+@@ -2203,6 +2293,12 @@
+ && !replace_backwards)
+ edit->search_start++;
+
++ if (replace_scanf || replace_regexp) {
++ repl_str = g_malloc(((MAX_REPL_LEN + 2)+1) * sizeof(mc_wchar_t));
++ } else {
++ repl_str = repl_templ;
++ }
++
+ do {
+ int len = 0;
+ long new_start;
+@@ -2227,8 +2323,47 @@
+
+ replace_yes = 1;
+
++ if (replace_scanf || replace_regexp) {
++ int ret = 0;
++
++ /* we need to fill in sargs just like with scanf */
++ if (replace_regexp) {
++ int k, j;
++ for (k = 1; k < NUM_REPL_ARGS && pmatch[k].rm_eo >= 0;
++ k++) {
++ mc_wchar_t *t;
++
++ if (pmatch[k].rm_eo - pmatch[k].rm_so > 255) {
++ ret = -1;
++ break;
++ }
++ t = (mc_wchar_t *) &sargs[k - 1][0];
++ for (j = 0; j < pmatch[k].rm_eo - pmatch[k].rm_so &&
++ j < 255; j++, t++)
++ *t = edit_get_byte (edit, edit->search_start -
++ pmatch[0].rm_so + pmatch[k].rm_so + j);
++ *t = '\0';
++ }
++ for (; k <= NUM_REPL_ARGS; k++)
++ sargs[k - 1][0] = 0;
++ }
++ if (ret >= 0)
++ ret = snprintf_p (repl_str, MAX_REPL_LEN + 2, repl_templ,
++ PRINTF_ARGS);
++ if (ret < 0) {
++ edit_error_dialog (_(" Replace "),
++ ret == -2
++ ? _(" Error in replacement format string. ")
++ : _(" Replacement too long. "));
++ treplace_prompt = 0;
++ replace_yes = 0;
++ replace_continue = 0;
++ }
++ }
++
+ if (treplace_prompt) {
+ int l;
++ char *displ_repl_str;
+ l = edit->curs_row - edit->num_widget_lines / 3;
+ if (l > 0)
+ edit_scroll_downward (edit, l);
+@@ -2242,7 +2377,15 @@
+ /*so that undo stops at each query */
+ edit_push_key_press (edit);
+
+- switch (edit_replace_prompt (edit, input2, /* and prompt 2/3 down */
++#ifndef UTF8
++ displ_repl_str = g_strdup(repl_str);
++#else /* UTF8 */
++ displ_repl_str = wchar_to_mbstr(repl_str);
++ /* wchar_to_mbstr(str) returns NULL when length of str == 0 */
++ if (!displ_repl_str) displ_repl_str = g_strdup("");
++#endif /* UTF8 */
++ convert_to_display (displ_repl_str);
++ switch (edit_replace_prompt (edit, displ_repl_str, /* and prompt 2/3 down */
+ (edit->num_widget_columns -
+ CONFIRM_DLG_WIDTH) / 2,
+ edit->num_widget_lines * 2 /
+@@ -2264,99 +2407,15 @@
+ replace_continue = 0;
+ break;
+ }
++ g_free(displ_repl_str);
+ }
+ if (replace_yes) { /* delete then insert new */
+-#ifdef UTF8
+- mc_wchar_t *winput2 = mbstr_to_wchar(input2);
+-#endif /* UTF8 */
+- if (replace_scanf) {
+- mc_wchar_t repl_str[MAX_REPL_LEN + 2];
+- int ret = 0;
+-
+- /* we need to fill in sargs just like with scanf */
+- if (replace_regexp) {
+- int k, j;
+- for (k = 1;
+- k < NUM_REPL_ARGS && pmatch[k].rm_eo >= 0;
+- k++) {
+-#ifndef UTF8
+- unsigned char *t;
+-#else /* UTF8 */
+- mc_wchar_t *t;
+-#endif
+-
+- if (pmatch[k].rm_eo - pmatch[k].rm_so > 255) {
+- ret = -1;
+- break;
+- }
+-#ifndef UTF8
+- t = (unsigned char *) &sargs[k - 1][0];
+-#else /* UTF8 */
+- t = (mc_wchar_t *) &sargs[k - 1][0];
+-#endif /* UTF8 */
+- for (j = 0;
+- j < pmatch[k].rm_eo - pmatch[k].rm_so
+- && j < 255; j++, t++)
+- *t = edit_get_byte (edit,
+- edit->
+- search_start
+- -
+- pmatch
+- [0].
+- rm_so +
+- pmatch
+- [k].
+- rm_so +
+- j);
+- *t = '\0';
+- }
+- for (; k <= NUM_REPL_ARGS; k++)
+- sargs[k - 1][0] = 0;
+- }
+- if (!ret)
+- ret =
+-#ifndef UTF8
+- snprintf_p (repl_str, MAX_REPL_LEN + 2, input2,
+-#else /* UTF8 */
+- snprintf_p (repl_str, MAX_REPL_LEN + 2, winput2,
+-#endif /* UTF8 */
+- PRINTF_ARGS);
+- if (ret >= 0) {
+- times_replaced++;
+- while (i--)
+- edit_delete (edit);
+-#ifndef UTF8
+- while (repl_str[++i])
+- edit_insert (edit, repl_str[i]);
+-#else /* UTF8 */
+- while (winput2[++i])
+- edit_insert (edit, winput2[i]);
+-#endif /* UTF8 */
+- } else {
+- edit_error_dialog (_(" Replace "),
+- ret ==
+- -2 ?
+- _
+- (" Error in replacement format string. ")
+- : _(" Replacement too long. "));
+- replace_continue = 0;
+- }
+- } else {
+- times_replaced++;
+- while (i--)
+- edit_delete (edit);
+-#ifndef UTF8
+- while (input2[++i])
+- edit_insert (edit, input2[i]);
+-#else /* UTF8 */
+- while (winput2[++i])
+- edit_insert (edit, winput2[i]);
+-#endif /* UTF8 */
+- }
++ times_replaced++;
++ while (i--)
++ edit_delete (edit);
++ while (repl_str[++i])
++ edit_insert (edit, repl_str[i]);
+ edit->found_len = i;
+-#ifdef UTF8
+- g_free (winput2);
+-#endif /* UTF8 */
+ }
+ /* so that we don't find the same string again */
+ if (replace_backwards) {
+@@ -2385,6 +2444,12 @@
+ }
+ } while (replace_continue);
+
++ /* cleanup */
++ if (replace_scanf || replace_regexp) {
++ g_free(repl_str);
++ }
++ g_free(repl_templ);
++
+ edit->force = REDRAW_COMPLETELY;
+ edit_scroll_screen_over_cursor (edit);
+ cleanup:
diff --git a/recipes/mc/mc-4.6.2/99b_fix-regex-pattern-lengths.patch b/recipes/mc/mc-4.6.2/99b_fix-regex-pattern-lengths.patch
new file mode 100644
index 0000000000..580c8345dd
--- /dev/null
+++ b/recipes/mc/mc-4.6.2/99b_fix-regex-pattern-lengths.patch
@@ -0,0 +1,53 @@
+--- mc-4.6.2/edit/editcmd.c
++++ mc-4.6.2/edit/editcmd.c
+@@ -1511,6 +1511,32 @@
+ sargs[argord[8]], sargs[argord[9]], sargs[argord[10]], sargs[argord[11]], \
+ sargs[argord[12]], sargs[argord[13]], sargs[argord[14]], sargs[argord[15]]
+
++#ifdef UTF8
++size_t
++real_mbstrlen (const char *str)
++{
++ if (SLsmg_Is_Unicode) {
++ size_t width = 0;
++
++ for (; *str; str++) {
++ wchar_t 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) {
++ width ++;
++ str += len-1;
++ }
++ }
++
++ return width;
++ } else
++ return strlen (str);
++}
++#endif
+
+ /* 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 */
+@@ -1582,7 +1608,7 @@
+ continue;
+ tmp = string[pmatch[i].rm_so];
+ string[pmatch[i].rm_so] = 0;
+- new_o = mbstrlen(string);
++ new_o = real_mbstrlen(string);
+ string[pmatch[i].rm_so] = tmp;
+ pmatch[i].rm_so = new_o;
+
+@@ -1590,7 +1616,7 @@
+ continue;
+ tmp = string[pmatch[i].rm_eo];
+ string[pmatch[i].rm_eo] = 0;
+- new_o = mbstrlen(string);
++ new_o = real_mbstrlen(string);
+ string[pmatch[i].rm_eo] = tmp;
+ pmatch[i].rm_eo = new_o;
+ }
diff --git a/recipes/mc/mc-4.6.2/cross-compile.patch b/recipes/mc/mc-4.6.2/cross-compile.patch
new file mode 100644
index 0000000000..53879e9cef
--- /dev/null
+++ b/recipes/mc/mc-4.6.2/cross-compile.patch
@@ -0,0 +1,16 @@
+Index: mc-4.6.2/src/Makefile.am
+===================================================================
+--- mc-4.6.2.orig/src/Makefile.am 2009-02-01 19:30:21.000000000 +0000
++++ mc-4.6.2/src/Makefile.am 2009-02-25 13:24:16.000000000 +0000
+@@ -14,7 +14,10 @@
+ endif
+
+ noinst_PROGRAMS = man2hlp
+-man2hlp_LDADD = $(GLIB_LIBS)
++man2hlp_CFLAGS = $(GLIB_CFLAGS_FOR_BUILD)
++man2hlp_LDADD = $(GLIB_LIBS_FOR_BUILD)
++$(man2hlp_OBJECTS): CC=$(CC_FOR_BUILD)
++man2hlp_LINK = $(LD_FOR_BUILD) -o $@
+
+ mcmfmt_SOURCES = mfmt.c
+
diff --git a/recipes/mc/mc-4.6.2/mc-cursor-appearance.patch b/recipes/mc/mc-4.6.2/mc-cursor-appearance.patch
new file mode 100644
index 0000000000..2fc94ff0e6
--- /dev/null
+++ b/recipes/mc/mc-4.6.2/mc-cursor-appearance.patch
@@ -0,0 +1,52 @@
+--- mc-4.6.2/edit/editdraw.c
++++ mc-4.6.2/edit/editdraw.c
+@@ -356,8 +356,13 @@
+ if (use_colors && visible_tabs) {
+ c = (p->style & ~MOD_CURSOR) | MOD_WHITESPACE;
+ if (i > 2) {
+- p->ch = '<';
+- p->style |= MOD_WHITESPACE;
++ if (p->style & MOD_CURSOR) {
++ p->ch = ' ';
++ }
++ else {
++ p->ch = '<';
++ p->style |= MOD_WHITESPACE;
++ }
+ p++;
+ while (--i > 1) {
+ p->style = c;
+@@ -380,8 +385,13 @@
+ p++;
+ }
+ } else if (use_colors && visible_tws && q >= tws) {
+- p->style |= MOD_WHITESPACE;
+- p->ch = '.';
++ if (p->style & MOD_CURSOR) {
++ p->ch = ' ';
++ }
++ else {
++ p->style |= MOD_WHITESPACE;
++ p->ch = '.';
++ }
+ p++;
+ c = p->style & ~MOD_CURSOR;
+ while (--i) {
+@@ -390,7 +400,7 @@
+ p++;
+ }
+ } else {
+- p->ch |= ' ';
++ p->ch = ' ';
+ c = p->style & ~MOD_CURSOR;
+ p++;
+ while (--i) {
+@@ -401,7 +411,7 @@
+ }
+ break;
+ case ' ':
+- if (use_colors && visible_tws && q >= tws) {
++ if (use_colors && visible_tws && q >= tws && !(p->style & MOD_CURSOR)) {
+ p->ch = '.';
+ p->style |= MOD_WHITESPACE;
+ p++;
diff --git a/recipes/mc/mc-4.6.2/mc-esc-seq.patch b/recipes/mc/mc-4.6.2/mc-esc-seq.patch
new file mode 100644
index 0000000000..b9ec04a75a
--- /dev/null
+++ b/recipes/mc/mc-4.6.2/mc-esc-seq.patch
@@ -0,0 +1,11 @@
+--- mc-4.6.2/src/util.c
++++ mc-4.6.2/src/util.c
+@@ -1205,6 +1205,8 @@
+ /* strchr() matches trailing binary 0 */
+ while (*(++r) && strchr ("0123456789;?", *r));
+ }
++ else if (*r == '(')
++ r++;
+
+ /*
+ * Now we are at the last character of the sequence.
diff --git a/recipes/mc/mc-4.6.2/mc-utf8-look-and-feel.patch b/recipes/mc/mc-4.6.2/mc-utf8-look-and-feel.patch
new file mode 100644
index 0000000000..83ad60135d
--- /dev/null
+++ b/recipes/mc/mc-4.6.2/mc-utf8-look-and-feel.patch
@@ -0,0 +1,206 @@
+Index: mc-4.6.2~git20080311/src/main.c
+================================================================================
+--- mc-4.6.2/src/main.c
++++ mc-4.6.2/src/main.c
+@@ -276,6 +276,9 @@
+ /* 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;
+
+@@ -2126,6 +2129,16 @@
+ 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);
+--- mc-4.6.2/src/main.h
++++ mc-4.6.2/src/main.h
+@@ -69,6 +69,7 @@
+ 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;
+
+--- mc-4.6.2/src/screen.c
++++ mc-4.6.2/src/screen.c
+@@ -892,6 +892,9 @@
+ }
+ #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);
+
+@@ -1493,7 +1496,7 @@
+ 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.2/src/widget.c
++++ mc-4.6.2/src/widget.c
+@@ -1944,52 +1944,86 @@
+ return in;
+ }
+
+-
+-/* 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 ('^');
++ 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;
+@@ -2032,7 +2066,7 @@
+ 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.2/src/widget.h
++++ mc-4.6.2/src/widget.h
+@@ -187,6 +187,10 @@
+ /* 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/recipes/mc/mc-4.6.2/mc-utf8-nlink.patch b/recipes/mc/mc-4.6.2/mc-utf8-nlink.patch
new file mode 100644
index 0000000000..9e361630c4
--- /dev/null
+++ b/