diff options
author | 2017-01-16 14:52:25 +0000 | |
---|---|---|
committer | 2017-01-16 14:52:25 +0000 | |
commit | c978f9902f76c3cbffb222a488e46a2bb19a2b02 (patch) | |
tree | 7fb0c82070b2c39b80299ae9950af414f0a6dcf3 /usr.bin/tmux/cmd-string.c | |
parent | getopt() has a struct option so just return to using options_entry. (diff) | |
download | wireguard-openbsd-c978f9902f76c3cbffb222a488e46a2bb19a2b02.tar.xz wireguard-openbsd-c978f9902f76c3cbffb222a488e46a2bb19a2b02.zip |
Revert WIP parts of previous I didn't mean to commit yet.
Diffstat (limited to 'usr.bin/tmux/cmd-string.c')
-rw-r--r-- | usr.bin/tmux/cmd-string.c | 84 |
1 files changed, 31 insertions, 53 deletions
diff --git a/usr.bin/tmux/cmd-string.c b/usr.bin/tmux/cmd-string.c index 363a8bfe597..b0565e62235 100644 --- a/usr.bin/tmux/cmd-string.c +++ b/usr.bin/tmux/cmd-string.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-string.c,v 1.26 2017/01/16 14:49:14 nicm Exp $ */ +/* $OpenBSD: cmd-string.c,v 1.27 2017/01/16 14:52:25 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott <nicholas.marriott@gmail.com> @@ -54,15 +54,17 @@ cmd_string_ungetc(size_t *p) (*p)--; } -int -cmd_string_split(const char *s, int *rargc, char ***rargv) +struct cmd_list * +cmd_string_parse(const char *s, const char *file, u_int line, char **cause) { - size_t p = 0; - int ch, argc = 0, append = 0; - char **argv = NULL, *buf = NULL, *t; - const char *whitespace, *equals; - size_t len = 0; + 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) { @@ -113,67 +115,43 @@ cmd_string_split(const char *s, int *rargc, char ***rargv) argc--; memmove(argv, argv + 1, argc * (sizeof *argv)); } - goto done; + if (argc == 0) + goto out; + + cmdlist = cmd_list_parse(argc, argv, file, line, cause); + goto out; case '~': - if (buf != NULL) { - append = 1; + if (buf == NULL) { + t = cmd_string_expand_tilde(s, &p); + if (t == NULL) + goto error; + cmd_string_copy(&buf, t, &len); break; } - t = cmd_string_expand_tilde(s, &p); - if (t == NULL) - goto error; - cmd_string_copy(&buf, t, &len); - break; + /* FALLTHROUGH */ default: - append = 1; - break; - } - if (append) { if (len >= SIZE_MAX - 2) goto error; + buf = xrealloc(buf, len + 1); buf[len++] = ch; + break; } - append = 0; } -done: - *rargc = argc; - *rargv = argv; - - free(buf); - return (0); - error: - if (argv != NULL) - cmd_free_argv(argc, argv); - free(buf); - return (-1); -} + xasprintf(cause, "invalid or unknown command: %s", s); -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; +out: + free(buf); - *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; - } + if (argv != NULL) { + for (i = 0; i < argc; i++) + free(argv[i]); + free(argv); } - cmd_free_argv(argc, argv); - return (cmdlist); -error: - xasprintf(cause, "invalid or unknown command: %s", s); - return (NULL); + return (cmdlist); } static void |