aboutsummaryrefslogtreecommitdiff
path: root/cmd-string.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmd-string.c')
-rw-r--r--cmd-string.c82
1 files changed, 30 insertions, 52 deletions
diff --git a/cmd-string.c b/cmd-string.c
index 822d35b5..1b96b280 100644
--- a/cmd-string.c
+++ b/cmd-string.c
@@ -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