---
This is a lot longer than I would like but it seems to be working for now.
As long as we don't have any commands containing non-alphanumeric chars,
we can rely on 'isalnum' to detect the separation of command names
and parameters as done in this patch. Using separators other than '/'
(as long as they are non-alphanumeric...) now works as well.
Without overwriting the '!' with ' ', forceable commands that take
space-separated arguments would not work anymore. The ' ' is ignored when
parsing the command parameters and that lets us work around the problem
(badly).
vis.c | 23 +++++++++++++----------
1 file changed, 13 insertions(+), 10 deletions(-)
diff --git a/vis.c b/vis.c
index 628f511..77489f1 100644
--- a/vis.c
+++ b/vis.c
_AT_@ -1740,10 +1740,11 @@ static Command *lookup_cmd(const char *name) {
static bool exec_cmdline_command(const char *cmdline) {
enum CmdOpt opt = CMD_OPT_NONE;
- char *line = strdup(cmdline);
- char *name = line;
+ char *line = malloc(strlen(cmdline)+2);
if (!line)
return false;
+ line = strncpy(line, cmdline, strlen(cmdline)+1);
+ char *name = line;
Filerange range = parse_range(&name);
if (!text_range_valid(&range)) {
/* if only one position was given, jump to it */
_AT_@ -1764,15 +1765,17 @@ static bool exec_cmdline_command(const char *cmdline) {
while (*name == ' ')
name++;
char *param = name;
- while (*param && *param != ' ') {
- if (*param == '!') {
- opt |= CMD_OPT_FORCE;
- break;
- }
- param++;
+ while (*param && *param != ' ' && isalnum(*param)) param++;
+
+ if (*param == '!') {
+ opt |= CMD_OPT_FORCE;
+ *param = ' ';
}
- if (*param)
- *param++ = '\0'; /* truncate by overwriting ' ' or '!' */
+
+ memmove(param+1, param, strlen(param)+1);
+ /* separate command name from parameter by overwriting the first non-
+ * alphanumeric character (other than '!' which we overwrote already) */
+ *param++ = '\0';
Command *cmd = lookup_cmd(name);
if (!cmd) {
--
2.4.0
Received on Sat May 09 2015 - 18:12:53 CEST
This archive was generated by hypermail 2.3.0 : Sat May 09 2015 - 18:24:08 CEST