aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSilvan Jegen <s.jegen@gmail.com>2015-05-16 22:21:44 +0200
committerMarc André Tanner <mat@brain-dump.org>2015-05-16 22:33:26 +0200
commit8fdbc78eb5becfc5e22caa9f7bad59a57a0e567c (patch)
treecdc583f14e451415a00f0bf9aca7c83631255a07
parent1e3165ef5e684c648a323bf082e1892462b354de (diff)
downloadvis-8fdbc78eb5becfc5e22caa9f7bad59a57a0e567c.tar.gz
vis-8fdbc78eb5becfc5e22caa9f7bad59a57a0e567c.tar.xz
Improve parsing of :-command name and parameters
-rw-r--r--vis.c24
1 files changed, 16 insertions, 8 deletions
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) {