Move command line split to function `sl_make_argv'.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@4396 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
58
lib/sl/sl.c
58
lib/sl/sl.c
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1995, 1996, 1997 Kungliga Tekniska H<>gskolan
|
* Copyright (c) 1995, 1996, 1997, 1998 Kungliga Tekniska H<>gskolan
|
||||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -143,6 +143,41 @@ sl_command(SL_cmd *cmds, int argc, char **argv)
|
|||||||
return (*c->func)(argc, argv);
|
return (*c->func)(argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
sl_make_argv(char *line, int *ret_argc, char ***ret_argv)
|
||||||
|
{
|
||||||
|
char *foo = NULL;
|
||||||
|
char *p;
|
||||||
|
int argc, nargv;
|
||||||
|
char **argv;
|
||||||
|
|
||||||
|
nargv = 10;
|
||||||
|
argv = malloc(nargv * sizeof(*argv));
|
||||||
|
if(argv == NULL)
|
||||||
|
return ENOMEM;
|
||||||
|
argc = 0;
|
||||||
|
|
||||||
|
for(p = strtok_r (line, " \t", &foo);
|
||||||
|
p;
|
||||||
|
p = strtok_r (NULL, " \t", &foo)) {
|
||||||
|
if(argc == nargv - 1) {
|
||||||
|
char **tmp;
|
||||||
|
nargv *= 2;
|
||||||
|
tmp = realloc (argv, nargv * sizeof(*argv));
|
||||||
|
if (tmp == NULL) {
|
||||||
|
free(argv);
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
argv = tmp;
|
||||||
|
}
|
||||||
|
argv[argc++] = p;
|
||||||
|
}
|
||||||
|
argv[argc] = NULL;
|
||||||
|
*ret_argc = argc;
|
||||||
|
*ret_argv = argv;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sl_loop (SL_cmd *cmds, char *prompt)
|
sl_loop (SL_cmd *cmds, char *prompt)
|
||||||
{
|
{
|
||||||
@@ -171,26 +206,11 @@ sl_loop (SL_cmd *cmds, char *prompt)
|
|||||||
if(*buf)
|
if(*buf)
|
||||||
add_history(buf);
|
add_history(buf);
|
||||||
count = 0;
|
count = 0;
|
||||||
{
|
ret = sl_make_argv(buf, &count, &ptr);
|
||||||
char *foo = NULL;
|
if(ret) {
|
||||||
char *p;
|
warnx ("sl_loop: %s", strerror(ret));
|
||||||
|
|
||||||
for(p = strtok_r (buf, " \t", &foo);
|
|
||||||
p;
|
|
||||||
p = strtok_r (NULL, " \t", &foo)) {
|
|
||||||
if(count == max_count) {
|
|
||||||
max_count *= 2;
|
|
||||||
ptr = realloc (ptr, max_count * sizeof(*ptr));
|
|
||||||
if (ptr == NULL) {
|
|
||||||
printf ("sl_loop: failed to allocate %u "
|
|
||||||
"bytes of memory\n",
|
|
||||||
(unsigned) max_count * sizeof(*ptr));
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
ptr[count++] = p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
c = sl_match (cmds, ptr[0], 0);
|
c = sl_match (cmds, ptr[0], 0);
|
||||||
if (c) {
|
if (c) {
|
||||||
|
Reference in New Issue
Block a user