poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Properly handle readline completion of filenames which contain s


From: John Darrington
Subject: [PATCH] Properly handle readline completion of filenames which contain spaces.
Date: Fri, 28 Feb 2020 18:16:16 +0100

---
 ChangeLog     |  8 ++++++++
 src/pk-cmd.c  | 45 ++++++++++++---------------------------------
 src/pk-repl.c | 22 ++++++++++++++++++++++
 3 files changed, 42 insertions(+), 33 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c894606e..ad0e4d0f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2020-02-23  John Darrington <address@hidden>
+
+       * src/pk-cmd.c (pk_cmd_exec_1)[case 'f']: Remove a lot
+       of code which seems to serve no useful purpose.
+       * src/pk-repl.c (escape_metacharacters): New function.
+       * src/pk-repl.c (pk_repl): Initialize various readling
+       parameters.
+
 2020-02-27  Jose E. Marchesi  <address@hidden>
 
        * src/pkl-lex.l: Set errno to 0 before calling strtoull.
diff --git a/src/pk-cmd.c b/src/pk-cmd.c
index 21227535..3c07f9e1 100644
--- a/src/pk-cmd.c
+++ b/src/pk-cmd.c
@@ -464,56 +464,35 @@ pk_cmd_exec_1 (char *str, struct pk_trie *cmds_trie, char 
*prefix)
                   }
                 case 'f':
                   {
-                    /* Parse a filename, doing tilde expansion.  */
-                    size_t i;
-                    wordexp_t exp_result;
-                    char *end;
-                    char *filename = xmalloc (strlen (p) + 1);
-
-                    p = skip_blanks (p);
-                    i = 0;
-                    while (*p != '\0' && *p != ',')
-                      filename[i++] = *(p++);
-                    filename[i] = '\0';
-
-                    /* Trim trailing space.  */
-                    end = filename + strlen (filename) - 1;
-                    while (end > filename && isspace ((unsigned char) *end))
-                      end--;
-                    end++;
-                    *end = '\0';
-
-                    if (filename[0] == '\0')
+                   wordexp_t exp_result;
+                   exp_result.we_wordv = 0;
+                    if (p[0] == '\0')
                       GOTO_USAGE();
 
-                    switch (wordexp (filename, &exp_result, 0))
+                    switch (wordexp (p, &exp_result, 0))
                       {
                       case 0: /* Successful.  */
                         break;
-                      case WRDE_NOSPACE:
-                        wordfree (&exp_result);
                       default:
+                       if (exp_result.we_wordv)
+                         wordfree (&exp_result);
                         GOTO_USAGE();
+                       break;
                       }
-
                     if (exp_result.we_wordc != 1)
                       {
                         wordfree (&exp_result);
                         GOTO_USAGE();
                       }
 
-                    filename = xrealloc (filename,
-                                         strlen (exp_result.we_wordv[0]) + 1);
-                    strcpy (filename, exp_result.we_wordv[0]);
+                    char *filename = strdup (exp_result.we_wordv[0]);
                     wordfree (&exp_result);
 
-                    if (*p == ',' || *p == '\0')
-                      {
-                        argv[argc].type = PK_CMD_ARG_STR;
-                        argv[argc].val.str = filename;
-                        match = 1;
-                      }
+                   argv[argc].type = PK_CMD_ARG_STR;
+                   argv[argc].val.str = filename;
+                   match = 1;
 
+                   p += strlen (p);
                     break;
                   }
                 default:
diff --git a/src/pk-repl.c b/src/pk-repl.c
index 36f614d8..3af357be 100644
--- a/src/pk-repl.c
+++ b/src/pk-repl.c
@@ -228,6 +228,25 @@ poke_sigint_handler (int status)
   siglongjmp(ctrlc_buf, 1);
 }
 
+static char *
+escape_metacharacters (char *text, int match_type, char *qp)
+{
+  char *p = text;
+  char *r = xmalloc (strlen (text) * 2 + 1);
+  char *s = r;
+
+  while (*p)
+    {
+      char c = *p++;
+      if (c == ' ')
+       *r++ = '\\';
+      *r++ = c;
+    }
+  *r = '\0';
+
+  return s;
+}
+
 void
 pk_repl (void)
 {
@@ -258,6 +277,9 @@ pk_repl (void)
     }
 #endif
   rl_getc_function = poke_getc;
+  rl_completer_quote_characters = "\"";
+  rl_filename_quote_characters = " ";
+  rl_filename_quoting_function = escape_metacharacters;
 
   while (!poke_exit_p)
     {
-- 
2.20.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]