diff options
| author | Silvan Jegen <s.jegen@gmail.com> | 2015-05-16 22:21:44 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2015-05-16 22:33:26 +0200 |
| commit | 8fdbc78eb5becfc5e22caa9f7bad59a57a0e567c (patch) | |
| tree | cdc583f14e451415a00f0bf9aca7c83631255a07 | |
| parent | 1e3165ef5e684c648a323bf082e1892462b354de (diff) | |
| download | vis-8fdbc78eb5becfc5e22caa9f7bad59a57a0e567c.tar.gz vis-8fdbc78eb5becfc5e22caa9f7bad59a57a0e567c.tar.xz | |
Improve parsing of :-command name and parameters
| -rw-r--r-- | vis.c | 24 |
1 files changed, 16 insertions, 8 deletions
@@ -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) { |
