From 8fdbc78eb5becfc5e22caa9f7bad59a57a0e567c Mon Sep 17 00:00:00 2001 From: Silvan Jegen Date: Sat, 16 May 2015 22:21:44 +0200 Subject: Improve parsing of :-command name and parameters --- vis.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'vis.c') diff --git a/vis.c b/vis.c index 7a090ae..4468b62 100644 --- a/vis.c +++ b/vis.c @@ -1742,10 +1742,13 @@ 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; + size_t len = strlen(cmdline); + char *line = malloc(len+2); if (!line) return false; + line = strncpy(line, cmdline, len+1); + char *name = line; + Filerange range = parse_range(&name); if (!text_range_valid(&range)) { /* if only one position was given, jump to it */ @@ -1766,15 +1769,20 @@ static bool exec_cmdline_command(const char *cmdline) { while (*name == ' ') name++; char *param = name; - while (*param && *param != ' ') { - if (*param == '!') { + while (*param && isalpha(*param)) + param++; + + if (*param == '!') { + if (param != name) { opt |= CMD_OPT_FORCE; - break; + *param = ' '; + } else { + param++; } - param++; } - if (*param) - *param++ = '\0'; /* truncate by overwriting ' ' or '!' */ + + memmove(param+1, param, strlen(param)+1); + *param++ = '\0'; /* separate command name from parameters */ Command *cmd = lookup_cmd(name); if (!cmd) { -- cgit v1.2.3