The tmux TODO list has this item regarding command sequences:
* don't require space after ;
I've attached a patch that does this.
diff --git a/cmd-list.c b/cmd-list.c
index 08e2067..22327cd 100644
--- a/cmd-list.c
+++ b/cmd-list.c
@@ -29,55 +29,85 @@ cmd_list_parse(int argc, char **argv, const char* file,
u_int line,
{
struct cmd_list *cmdlist;
struct cmd *cmd;
- int i, lastsplit;
- size_t arglen, new_argc;
- char **copy_argv, **new_argv;
+ int i;
+ size_t c, x, y, arglen, new_argc;
+ char **new_argv, *argdup;
- copy_argv = cmd_copy_argv(argc, argv);
+ new_argv = xcalloc(argc, sizeof *new_argv);
cmdlist = xcalloc(1, sizeof *cmdlist);
cmdlist->references = 1;
TAILQ_INIT(&cmdlist->list);
- lastsplit = 0;
+ new_argc = 0;
for (i = 0; i < argc; i++) {
- arglen = strlen(copy_argv[i]);
- if (arglen == 0 || copy_argv[i][arglen - 1] != ';')
+ arglen = strlen(argv[i]);
+ if (arglen == 0) {
+ new_argv[new_argc++] = xstrdup(argv[i]);
continue;
- copy_argv[i][arglen - 1] = '\0';
+ }
- if (arglen > 1 && copy_argv[i][arglen - 2] == '\\') {
- copy_argv[i][arglen - 2] = ';';
- continue;
+ argdup = xcalloc(1, arglen + 1);
+ x = y = 0;
+ while (x < arglen) {
+ switch (argv[i][x]) {
+ case ';':
+ argdup[y] = '\0';
+ y = 0;
+ if (strlen(argdup) > 0)
+ new_argv[new_argc++] = xstrdup(argdup);
+
+ cmd = cmd_parse(new_argc, new_argv, file,
+ line, cause);
+ if (cmd == NULL) {
+ free(argdup);
+ goto bad;
+ }
+ TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry);
+
+ for(c = 0; c < new_argc; c++)
+ free(new_argv[c]);
+
+ new_argc = 0;
+ break;
+ case '\\':
+ if (argv[i][x+1] == ';') {
+ argdup[y++] = ';';
+ x++;
+ } else {
+ argdup[y++] = '\\';
+ }
+ break;
+ default:
+ argdup[y++] = argv[i][x];
+ break;
+ }
+ x++;
}
+ argdup[y] = '\0';
+ if (strlen(argdup) > 0)
+ new_argv[new_argc++] = xstrdup(argdup);
- new_argc = i - lastsplit;
- new_argv = copy_argv + lastsplit;
- if (arglen != 1)
- new_argc++;
+ free(argdup);
+ }
+ if (new_argc > 0) {
cmd = cmd_parse(new_argc, new_argv, file, line, cause);
if (cmd == NULL)
goto bad;
- TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry);
- lastsplit = i + 1;
- }
-
- if (lastsplit != argc) {
- cmd = cmd_parse(argc - lastsplit, copy_argv + lastsplit,
- file, line, cause);
- if (cmd == NULL)
- goto bad;
TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry);
+
+ for(c = 0; c < new_argc; c++)
+ free(new_argv[c]);
}
- cmd_free_argv(argc, copy_argv);
+ free(new_argv);
return (cmdlist);
bad:
cmd_list_free(cmdlist);
- cmd_free_argv(argc, copy_argv);
+ free(new_argv);
return (NULL);
}
------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today.
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users