ash: explain how "command" is handled, and shrink it a bit
function old new delta getoptscmd 641 632 -9 commandcmd 79 69 -10 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-19) Total: -19 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
e627ac95be
commit
cac4d002e7
88
shell/ash.c
88
shell/ash.c
@ -8019,9 +8019,45 @@ typecmd(int argc UNUSED_PARAM, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLE_ASH_CMDCMD
|
#if ENABLE_ASH_CMDCMD
|
||||||
|
/* Is it "command [-p] PROG ARGS" bltin, no other opts? Return ptr to "PROG" if yes */
|
||||||
|
static char **
|
||||||
|
parse_command_args(char **argv, const char **path)
|
||||||
|
{
|
||||||
|
char *cp, c;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
cp = *++argv;
|
||||||
|
if (!cp)
|
||||||
|
return NULL;
|
||||||
|
if (*cp++ != '-')
|
||||||
|
break;
|
||||||
|
c = *cp++;
|
||||||
|
if (!c)
|
||||||
|
break;
|
||||||
|
if (c == '-' && !*cp) {
|
||||||
|
if (!*++argv)
|
||||||
|
return NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
switch (c) {
|
||||||
|
case 'p':
|
||||||
|
*path = bb_default_path;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* run 'typecmd' for other options */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
c = *cp++;
|
||||||
|
} while (c);
|
||||||
|
}
|
||||||
|
return argv;
|
||||||
|
}
|
||||||
|
|
||||||
static int FAST_FUNC
|
static int FAST_FUNC
|
||||||
commandcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
|
commandcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
|
||||||
{
|
{
|
||||||
|
char *cmd;
|
||||||
int c;
|
int c;
|
||||||
enum {
|
enum {
|
||||||
VERIFY_BRIEF = 1,
|
VERIFY_BRIEF = 1,
|
||||||
@ -8029,21 +8065,26 @@ commandcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
|
|||||||
} verify = 0;
|
} verify = 0;
|
||||||
const char *path = NULL;
|
const char *path = NULL;
|
||||||
|
|
||||||
|
/* "command [-p] PROG ARGS" (that is, without -V or -v)
|
||||||
|
* never reaches this function.
|
||||||
|
*/
|
||||||
|
|
||||||
while ((c = nextopt("pvV")) != '\0')
|
while ((c = nextopt("pvV")) != '\0')
|
||||||
if (c == 'V')
|
if (c == 'V')
|
||||||
verify |= VERIFY_VERBOSE;
|
verify |= VERIFY_VERBOSE;
|
||||||
else if (c == 'v')
|
else if (c == 'v')
|
||||||
verify |= VERIFY_BRIEF;
|
/*verify |= VERIFY_BRIEF*/;
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
else if (c != 'p')
|
else if (c != 'p')
|
||||||
abort();
|
abort();
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
path = bb_default_path;
|
path = bb_default_path;
|
||||||
|
|
||||||
/* Mimic bash: just "command -v" doesn't complain, it's a nop */
|
/* Mimic bash: just "command -v" doesn't complain, it's a nop */
|
||||||
if (verify && (*argptr != NULL)) {
|
cmd = *argptr;
|
||||||
return describe_command(*argptr, path, verify - VERIFY_BRIEF);
|
if (/*verify && */ cmd)
|
||||||
}
|
return describe_command(cmd, path, verify /* - VERIFY_BRIEF*/);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -8976,42 +9017,6 @@ evalfun(struct funcnode *func, int argc, char **argv, int flags)
|
|||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLE_ASH_CMDCMD
|
|
||||||
static char **
|
|
||||||
parse_command_args(char **argv, const char **path)
|
|
||||||
{
|
|
||||||
char *cp, c;
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
cp = *++argv;
|
|
||||||
if (!cp)
|
|
||||||
return NULL;
|
|
||||||
if (*cp++ != '-')
|
|
||||||
break;
|
|
||||||
c = *cp++;
|
|
||||||
if (!c)
|
|
||||||
break;
|
|
||||||
if (c == '-' && !*cp) {
|
|
||||||
if (!*++argv)
|
|
||||||
return NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
do {
|
|
||||||
switch (c) {
|
|
||||||
case 'p':
|
|
||||||
*path = bb_default_path;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* run 'typecmd' for other options */
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
c = *cp++;
|
|
||||||
} while (c);
|
|
||||||
}
|
|
||||||
return argv;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make a variable a local variable. When a variable is made local, it's
|
* Make a variable a local variable. When a variable is made local, it's
|
||||||
* value and flags are saved in a localvar structure. The saved values
|
* value and flags are saved in a localvar structure. The saved values
|
||||||
@ -9463,6 +9468,9 @@ evalcommand(union node *cmd, int flags)
|
|||||||
nargv = parse_command_args(argv, &path);
|
nargv = parse_command_args(argv, &path);
|
||||||
if (!nargv)
|
if (!nargv)
|
||||||
break;
|
break;
|
||||||
|
/* It's "command [-p] PROG ARGS" (that is, no -Vv).
|
||||||
|
* nargv => "PROG". path is updated if -p.
|
||||||
|
*/
|
||||||
argc -= nargv - argv;
|
argc -= nargv - argv;
|
||||||
argv = nargv;
|
argv = nargv;
|
||||||
cmd_flag |= DO_NOFUNC;
|
cmd_flag |= DO_NOFUNC;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user