diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2016-04-01 22:00:15 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2016-04-03 21:38:04 +0200 |
| commit | b46c5f9c0c83b9aa70cf12c14b8ff36759bbb1eb (patch) | |
| tree | a0e27527d9ebfa2ad53ea13be6a3b6310cb30910 /sam.c | |
| parent | 2c03c9797c06ec03de6f629cc3e73e447249a3bf (diff) | |
| download | vis-b46c5f9c0c83b9aa70cf12c14b8ff36759bbb1eb.tar.gz vis-b46c5f9c0c83b9aa70cf12c14b8ff36759bbb1eb.tar.xz | |
sam: simplify and fix grouping
The following should now work:
:sam x/^static/ .,+/^\}/ { i/<</ a/>>/ }
Diffstat (limited to 'sam.c')
| -rw-r--r-- | sam.c | 63 |
1 files changed, 26 insertions, 37 deletions
@@ -104,6 +104,8 @@ static const CommandDef cmds[] = { { { "|" }, CMD_SHELL, NULL, cmd_filter }, { { "w" }, CMD_ARGV|CMD_FORCE, NULL, cmd_write }, { { "r" }, CMD_FILE, NULL, cmd_read }, + { { "{" }, 0, NULL, NULL }, + { { "}" }, 0, NULL, NULL }, { { NULL }, 0, NULL, NULL }, }; @@ -447,45 +449,11 @@ static Command *command_parse(Vis *vis, const char **s, int level, enum SamError char name[2] = { **s ? **s : 'p', '\0' }; if (**s) (*s)++; - cmd->argv[0] = strdup(name); - } - - const CommandDef *cmddef = NULL; - if (cmd->argv[0]) { - cmddef = command_lookup(vis, cmd->argv[0]); - } else { - switch (**s) { - case '{': - { - /* let it point to an all zero dummy entry */ - cmddef = &cmds[LENGTH(cmds)-1]; - if (!(cmd->argv[0] = strdup("{"))) - goto fail; - (*s)++; - Command *prev = NULL, *next; - do { - skip_spaces(s); - if (**s == '\n') - (*s)++; - next = command_parse(vis, s, level+1, err); - if (prev) - prev->next = next; - else - cmd->cmd = next; - } while ((prev = next)); - break; - } - case '}': - if (level == 0) { - *err = SAM_ERR_UNMATCHED_BRACE; - goto fail; - } - (*s)++; - command_free(cmd); - return NULL; - } + if (!(cmd->argv[0] = strdup(name))) + goto fail; } + const CommandDef *cmddef = command_lookup(vis, cmd->argv[0]); if (!cmddef) { *err = SAM_ERR_COMMAND; goto fail; @@ -493,6 +461,27 @@ static Command *command_parse(Vis *vis, const char **s, int level, enum SamError cmd->cmddef = cmddef; + if (strcmp(cmd->argv[0], "{") == 0) { + Command *prev = NULL, *next; + do { + skip_spaces(s); + if (**s == '\n') + (*s)++; + next = command_parse(vis, s, level+1, err); + if (prev) + prev->next = next; + else + cmd->cmd = next; + } while ((prev = next)); + } else if (strcmp(cmd->argv[0], "}") == 0) { + if (level == 0) { + *err = SAM_ERR_UNMATCHED_BRACE; + goto fail; + } + command_free(cmd); + return NULL; + } + if (cmddef->flags & CMD_ADDRESS_NONE && cmd->address) { *err = SAM_ERR_NO_ADDRESS; goto fail; |
