[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
- [PATCH] Properly handle readline completion of filenames which contain spaces.,
John Darrington <=