]> Sergey Matveev's repositories - nnn.git/commitdiff
Support multi-byte string in rename
authorArun Prakash Jana <engineerarun@gmail.com>
Thu, 24 Aug 2017 04:45:32 +0000 (10:15 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Thu, 24 Aug 2017 04:45:32 +0000 (10:15 +0530)
nnn.c

diff --git a/nnn.c b/nnn.c
index c13e657ed13862cf8b38a87fb17a9e9338ca269d..c759847f278aea9aea44574fd715de685f66f067 100644 (file)
--- a/nnn.c
+++ b/nnn.c
@@ -115,6 +115,7 @@ disabledbg()
 #define EMPTY "   "
 #define CURSYM(flag) (flag ? CURSR : EMPTY)
 #define FILTER '/'
+#define REGEX_MAX 128
 #define MAX_BM 10
 
 /* Macros to define process spawn behaviour as flags */
@@ -908,20 +909,19 @@ matches(char *fltr)
 }
 
 static int
-readln(char *path)
+filterentries(char *path)
 {
-       static char ln[LINE_MAX << 2];
-       static wchar_t wln[LINE_MAX];
+       static char ln[REGEX_MAX];
+       static wchar_t wln[REGEX_MAX];
        static wint_t ch[2] = {0};
+       static int maxlen = REGEX_MAX - 1;
        int r, total = ndents;
        int oldcur = cur;
        int len = 1;
        char *pln = ln + 1;
 
-       memset(wln, 0, LINE_MAX << 2);
-       wln[0] = FILTER;
-       ln[0] = FILTER;
-       ln[1] = '\0';
+       ln[0] = wln[0] = FILTER;
+       ln[1] = wln[1] = '\0';
        cur = 0;
 
        cleartimeout();
@@ -954,7 +954,7 @@ readln(char *path)
                                if (len == 1)
                                        cur = oldcur;
 
-                               wcstombs(ln, wln, LINE_MAX << 2);
+                               wcstombs(ln, wln, REGEX_MAX);
                                ndents = total;
                                if (matches(pln) == -1) {
                                        printprompt(ln);
@@ -973,9 +973,12 @@ readln(char *path)
                                if (len == 1)
                                        cur = 0;
 
+                               if (len == maxlen || !isprint(*ch))
+                                       break;
+
                                wln[len] = (wchar_t)*ch;
                                wln[++len] = '\0';
-                               wcstombs(ln, wln, LINE_MAX << 2);
+                               wcstombs(ln, wln, REGEX_MAX);
                                ndents = total;
                                if (matches(pln) == -1)
                                        continue;
@@ -996,7 +999,7 @@ readln(char *path)
                                if (len == 1)
                                        cur = oldcur;
 
-                               wcstombs(ln, wln, LINE_MAX << 2);
+                               wcstombs(ln, wln, REGEX_MAX);
                                ndents = total;
                                if (matches(pln) == -1)
                                        continue;
@@ -1022,14 +1025,16 @@ static char *
 xreadline(char *fname)
 {
        int old_curs = curs_set(1);
-       int len, pos;
+       size_t len, pos;
        int c, x, y;
-       char *buf = g_buf;
-       int buflen = NAME_MAX;
+       wchar_t *buf = (wchar_t *)g_buf;
+       size_t buflen = NAME_MAX - 1;
 
        DPRINTF_S(fname)
-       len = pos = xstrlcpy(buf, fname, NAME_MAX) - 1;
-       if (len < 0) {
+       mbstowcs(buf, fname, NAME_MAX);
+       len = pos = wcslen(buf);
+       /* For future: handle NULL, say for a new name */
+       if (len <= 0) {
                buf[0] = '\0';
                len = pos = 0;
        }
@@ -1039,7 +1044,7 @@ xreadline(char *fname)
 
        while (1) {
                buf[len] = ' ';
-               mvaddnstr(y, x, buf, len + 1);
+               mvaddnwstr(y, x, buf, len + 1);
                move(y, x + pos);
 
                c = getch();
@@ -1047,8 +1052,8 @@ xreadline(char *fname)
                if (c == KEY_ENTER || c == '\n' || c == '\r')
                        break;
 
-               if (isprint(c) && pos < buflen - 1) {
-                       memmove(buf + pos + 1, buf + pos, len - pos);
+               if (isprint(c) && pos < buflen) {
+                       memmove(buf + pos + 1, buf + pos, (len - pos) << 2);
                        buf[pos] = c;
                        ++len, ++pos;
                        continue;
@@ -1065,13 +1070,13 @@ xreadline(char *fname)
                        break;
                case KEY_BACKSPACE:
                        if (pos > 0) {
-                               memmove(buf + pos - 1, buf + pos, len - pos);
+                               memmove(buf + pos - 1, buf + pos, (len - pos) << 2);
                                --len, --pos;
                        }
                        break;
                case KEY_DC:
                        if (pos < len) {
-                               memmove(buf + pos, buf + pos + 1, len - pos - 1);
+                               memmove(buf + pos, buf + pos + 1, (len - pos - 1) << 2);
                                --len;
                        }
                        break;
@@ -1085,7 +1090,8 @@ xreadline(char *fname)
 
        settimeout();
        DPRINTF_S(buf)
-       return buf;
+       wcstombs(g_buf, buf, NAME_MAX);
+       return g_buf;
 }
 
 /*
@@ -2176,7 +2182,7 @@ nochange:
                                goto nochange;
                        }
                case SEL_FLTR:
-                       presel = readln(path);
+                       presel = filterentries(path);
                        xstrlcpy(fltr, ifilter, LINE_MAX);
                        DPRINTF_S(fltr);
                        /* Save current */