=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/Attic/cmd-string.c,v retrieving revision 1.27 retrieving revision 1.28 diff -c -r1.27 -r1.28 *** src/usr.bin/tmux/Attic/cmd-string.c 2017/01/16 14:52:25 1.27 --- src/usr.bin/tmux/Attic/cmd-string.c 2017/01/24 19:53:37 1.28 *************** *** 1,4 **** ! /* $OpenBSD: cmd-string.c,v 1.27 2017/01/16 14:52:25 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-string.c,v 1.28 2017/01/24 19:53:37 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott *************** *** 54,70 **** (*p)--; } ! struct cmd_list * ! cmd_string_parse(const char *s, const char *file, u_int line, char **cause) { ! size_t p = 0; ! int ch, i, argc = 0; ! char **argv = NULL, *buf = NULL, *t; ! const char *whitespace, *equals; ! size_t len = 0; ! struct cmd_list *cmdlist = NULL; - *cause = NULL; for (;;) { ch = cmd_string_getc(s, &p); switch (ch) { --- 54,68 ---- (*p)--; } ! int ! cmd_string_split(const char *s, int *rargc, char ***rargv) { ! size_t p = 0; ! int ch, argc = 0, append = 0; ! char **argv = NULL, *buf = NULL, *t; ! const char *whitespace, *equals; ! size_t len = 0; for (;;) { ch = cmd_string_getc(s, &p); switch (ch) { *************** *** 115,157 **** argc--; memmove(argv, argv + 1, argc * (sizeof *argv)); } ! if (argc == 0) ! goto out; ! ! cmdlist = cmd_list_parse(argc, argv, file, line, cause); ! goto out; case '~': ! if (buf == NULL) { ! t = cmd_string_expand_tilde(s, &p); ! if (t == NULL) ! goto error; ! cmd_string_copy(&buf, t, &len); break; } ! /* FALLTHROUGH */ default: if (len >= SIZE_MAX - 2) goto error; - buf = xrealloc(buf, len + 1); buf[len++] = ch; - break; } } ! error: ! xasprintf(cause, "invalid or unknown command: %s", s); - out: free(buf); ! if (argv != NULL) { ! for (i = 0; i < argc; i++) ! free(argv[i]); ! free(argv); ! } return (cmdlist); } static void --- 113,179 ---- argc--; memmove(argv, argv + 1, argc * (sizeof *argv)); } ! goto done; case '~': ! if (buf != NULL) { ! append = 1; break; } ! t = cmd_string_expand_tilde(s, &p); ! if (t == NULL) ! goto error; ! cmd_string_copy(&buf, t, &len); ! break; default: + append = 1; + break; + } + if (append) { if (len >= SIZE_MAX - 2) goto error; buf = xrealloc(buf, len + 1); buf[len++] = ch; } + append = 0; } ! done: ! *rargc = argc; ! *rargv = argv; free(buf); + return (0); ! error: ! if (argv != NULL) ! cmd_free_argv(argc, argv); ! free(buf); ! return (-1); ! } + struct cmd_list * + cmd_string_parse(const char *s, const char *file, u_int line, char **cause) + { + struct cmd_list *cmdlist = NULL; + int argc; + char **argv; + + *cause = NULL; + if (cmd_string_split(s, &argc, &argv) != 0) + goto error; + if (argc != 0) { + cmdlist = cmd_list_parse(argc, argv, file, line, cause); + if (cmdlist == NULL) { + cmd_free_argv(argc, argv); + goto error; + } + } + cmd_free_argv(argc, argv); return (cmdlist); + + error: + xasprintf(cause, "invalid or unknown command: %s", s); + return (NULL); } static void