aboutsummaryrefslogtreecommitdiff
path: root/sam.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-04-01 22:00:15 +0200
committerMarc André Tanner <mat@brain-dump.org>2016-04-03 21:38:04 +0200
commitb46c5f9c0c83b9aa70cf12c14b8ff36759bbb1eb (patch)
treea0e27527d9ebfa2ad53ea13be6a3b6310cb30910 /sam.c
parent2c03c9797c06ec03de6f629cc3e73e447249a3bf (diff)
downloadvis-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.c63
1 files changed, 26 insertions, 37 deletions
diff --git a/sam.c b/sam.c
index 8956c47..b6d1a86 100644
--- a/sam.c
+++ b/sam.c
@@ -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;