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

Reply via email to