- implement a TODO: Use index_in_str_array in parse_params
text data bss dec hex filename 2771 1 12 2784 ae0 find.o.r18272 2749 1 12 2762 aca find.o.-try-switch 2706 1 12 2719 a9f find.o.r18273
This commit is contained in:
parent
32773aca55
commit
557b458767
158
findutils/find.c
158
findutils/find.c
@ -336,13 +336,81 @@ static const char* plus_minus_num(const char* str)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define PARM_a 0
|
||||||
|
#define PARM_o 1
|
||||||
|
#define PARM_char_not (PARM_o + ENABLE_FEATURE_FIND_NOT)
|
||||||
|
#define PARM_print (PARM_char_not + 1)
|
||||||
|
#define PARM_print0 (PARM_print + ENABLE_FEATURE_FIND_PRINT0)
|
||||||
|
#define PARM_name (PARM_print0 + 1)
|
||||||
|
#define PARM_type (PARM_name + ENABLE_FEATURE_FIND_TYPE)
|
||||||
|
#define PARM_perm (PARM_type + ENABLE_FEATURE_FIND_PERM)
|
||||||
|
#define PARM_mtime (PARM_perm + ENABLE_FEATURE_FIND_MTIME)
|
||||||
|
#define PARM_mmin (PARM_mtime + ENABLE_FEATURE_FIND_MMIN)
|
||||||
|
#define PARM_newer (PARM_mmin + ENABLE_FEATURE_FIND_NEWER)
|
||||||
|
#define PARM_inum (PARM_newer + ENABLE_FEATURE_FIND_INUM)
|
||||||
|
#define PARM_exec (PARM_inum + ENABLE_FEATURE_FIND_EXEC)
|
||||||
|
#define PARM_user (PARM_exec + ENABLE_FEATURE_FIND_USER)
|
||||||
|
#if ENABLE_DESKTOP
|
||||||
|
#define PARM_and (PARM_user + 1)
|
||||||
|
#define PARM_or (PARM_and + 1)
|
||||||
|
#define PARM_not (PARM_or + ENABLE_FEATURE_FIND_NOT)
|
||||||
|
#define PARM_char_brace (PARM_not + 1)
|
||||||
|
#define PARM_prune (PARM_char_brace + 1)
|
||||||
|
#define PARM_size (PARM_prune + 1)
|
||||||
|
#endif
|
||||||
static action*** parse_params(char **argv)
|
static action*** parse_params(char **argv)
|
||||||
{
|
{
|
||||||
action*** appp;
|
action*** appp;
|
||||||
unsigned cur_group = 0;
|
unsigned cur_group = 0;
|
||||||
unsigned cur_action = 0;
|
unsigned cur_action = 0;
|
||||||
USE_FEATURE_FIND_NOT( bool invert_flag = 0; )
|
USE_FEATURE_FIND_NOT( bool invert_flag = 0; )
|
||||||
|
const char * const params[] = {
|
||||||
|
"-a",
|
||||||
|
"-o",
|
||||||
|
#if ENABLE_FEATURE_FIND_NOT
|
||||||
|
"!",
|
||||||
|
#endif
|
||||||
|
"-print",
|
||||||
|
#if ENABLE_FEATURE_FIND_PRINT0
|
||||||
|
"-print0",
|
||||||
|
#endif
|
||||||
|
"-name",
|
||||||
|
#if ENABLE_FEATURE_FIND_TYPE
|
||||||
|
"-type",
|
||||||
|
#endif
|
||||||
|
#if ENABLE_FEATURE_FIND_PERM
|
||||||
|
"-perm",
|
||||||
|
#endif
|
||||||
|
#if ENABLE_FEATURE_FIND_MTIME
|
||||||
|
"-mtime",
|
||||||
|
#endif
|
||||||
|
#if ENABLE_FEATURE_FIND_MMIN
|
||||||
|
"-mmin",
|
||||||
|
#endif
|
||||||
|
#if ENABLE_FEATURE_FIND_NEWER
|
||||||
|
"-newer",
|
||||||
|
#endif
|
||||||
|
#if ENABLE_FEATURE_FIND_INUM
|
||||||
|
"-inum",
|
||||||
|
#endif
|
||||||
|
#if ENABLE_FEATURE_FIND_EXEC
|
||||||
|
"-exec",
|
||||||
|
#endif
|
||||||
|
#if ENABLE_FEATURE_FIND_USER
|
||||||
|
"-user",
|
||||||
|
#endif
|
||||||
|
#if ENABLE_DESKTOP
|
||||||
|
"-and",
|
||||||
|
"-or",
|
||||||
|
# if ENABLE_FEATURE_FIND_NOT
|
||||||
|
"-not",
|
||||||
|
# endif
|
||||||
|
"(",
|
||||||
|
"-prune",
|
||||||
|
"-size",
|
||||||
|
#endif
|
||||||
|
NULL
|
||||||
|
};
|
||||||
action* alloc_action(int sizeof_struct, action_fp f)
|
action* alloc_action(int sizeof_struct, action_fp f)
|
||||||
{
|
{
|
||||||
action *ap;
|
action *ap;
|
||||||
@ -358,33 +426,31 @@ static action*** parse_params(char **argv)
|
|||||||
|
|
||||||
appp = xzalloc(2 * sizeof(appp[0])); /* appp[0],[1] == NULL */
|
appp = xzalloc(2 * sizeof(appp[0])); /* appp[0],[1] == NULL */
|
||||||
|
|
||||||
// Actions have side effects and return a true or false value
|
/* Actions have side effects and return a true or false value
|
||||||
// We implement: -print, -print0, -exec
|
* We implement: -print, -print0, -exec
|
||||||
|
*
|
||||||
// The rest are tests.
|
* The rest are tests.
|
||||||
|
*
|
||||||
// Tests and actions are grouped by operators
|
* Tests and actions are grouped by operators
|
||||||
// ( expr ) Force precedence
|
* ( expr ) Force precedence
|
||||||
// ! expr True if expr is false
|
* ! expr True if expr is false
|
||||||
// -not expr Same as ! expr
|
* -not expr Same as ! expr
|
||||||
// expr1 [-a[nd]] expr2 And; expr2 is not evaluated if expr1 is false
|
* expr1 [-a[nd]] expr2 And; expr2 is not evaluated if expr1 is false
|
||||||
// expr1 -o[r] expr2 Or; expr2 is not evaluated if expr1 is true
|
* expr1 -o[r] expr2 Or; expr2 is not evaluated if expr1 is true
|
||||||
// expr1 , expr2 List; both expr1 and expr2 are always evaluated
|
* expr1 , expr2 List; both expr1 and expr2 are always evaluated
|
||||||
// We implement: (), -a, -o
|
* We implement: (), -a, -o
|
||||||
|
*/
|
||||||
//XXX: TODO: Use index_in_str_array here
|
|
||||||
while (*argv) {
|
while (*argv) {
|
||||||
const char *arg = argv[0];
|
const char *arg = argv[0];
|
||||||
const char *arg1 = argv[1];
|
const char *arg1 = argv[1];
|
||||||
|
int parm = index_in_str_array(params, arg);
|
||||||
/* --- Operators --- */
|
/* --- Operators --- */
|
||||||
if (strcmp(arg, "-a") == 0
|
if (parm == PARM_a USE_DESKTOP(|| parm == PARM_and))
|
||||||
USE_DESKTOP(|| strcmp(arg, "-and") == 0)
|
{
|
||||||
) {
|
|
||||||
/* no further special handling required */
|
/* no further special handling required */
|
||||||
}
|
}
|
||||||
else if (strcmp(arg, "-o") == 0
|
else if (parm == PARM_o USE_DESKTOP(|| parm == PARM_or))
|
||||||
USE_DESKTOP(|| strcmp(arg, "-or") == 0)
|
{
|
||||||
) {
|
|
||||||
/* start new OR group */
|
/* start new OR group */
|
||||||
cur_group++;
|
cur_group++;
|
||||||
appp = xrealloc(appp, (cur_group+2) * sizeof(*appp));
|
appp = xrealloc(appp, (cur_group+2) * sizeof(*appp));
|
||||||
@ -393,29 +459,31 @@ static action*** parse_params(char **argv)
|
|||||||
cur_action = 0;
|
cur_action = 0;
|
||||||
}
|
}
|
||||||
#if ENABLE_FEATURE_FIND_NOT
|
#if ENABLE_FEATURE_FIND_NOT
|
||||||
else if (LONE_CHAR(arg, '!')
|
else if (parm == PARM_char_not USE_DESKTOP(|| parm == PARM_not))
|
||||||
USE_DESKTOP(|| strcmp(arg, "-not") == 0)
|
{
|
||||||
) {
|
|
||||||
/* also handles "find ! ! -name 'foo*'" */
|
/* also handles "find ! ! -name 'foo*'" */
|
||||||
invert_flag ^= 1;
|
invert_flag ^= 1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* --- Tests and actions --- */
|
/* --- Tests and actions --- */
|
||||||
else if (strcmp(arg, "-print") == 0) {
|
else if (parm == PARM_print)
|
||||||
|
{
|
||||||
need_print = 0;
|
need_print = 0;
|
||||||
/* GNU find ignores '!' here: "find ! -print" */
|
/* GNU find ignores '!' here: "find ! -print" */
|
||||||
USE_FEATURE_FIND_NOT( invert_flag = 0; )
|
USE_FEATURE_FIND_NOT( invert_flag = 0; )
|
||||||
(void) ALLOC_ACTION(print);
|
(void) ALLOC_ACTION(print);
|
||||||
}
|
}
|
||||||
#if ENABLE_FEATURE_FIND_PRINT0
|
#if ENABLE_FEATURE_FIND_PRINT0
|
||||||
else if (strcmp(arg, "-print0") == 0) {
|
else if (parm == PARM_print0)
|
||||||
|
{
|
||||||
need_print = 0;
|
need_print = 0;
|
||||||
USE_FEATURE_FIND_NOT( invert_flag = 0; )
|
USE_FEATURE_FIND_NOT( invert_flag = 0; )
|
||||||
(void) ALLOC_ACTION(print0);
|
(void) ALLOC_ACTION(print0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else if (strcmp(arg, "-name") == 0) {
|
else if (parm == PARM_name)
|
||||||
|
{
|
||||||
action_name *ap;
|
action_name *ap;
|
||||||
if (!*++argv)
|
if (!*++argv)
|
||||||
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
||||||
@ -423,7 +491,8 @@ static action*** parse_params(char **argv)
|
|||||||
ap->pattern = arg1;
|
ap->pattern = arg1;
|
||||||
}
|
}
|
||||||
#if ENABLE_FEATURE_FIND_TYPE
|
#if ENABLE_FEATURE_FIND_TYPE
|
||||||
else if (strcmp(arg, "-type") == 0) {
|
else if (parm == PARM_type)
|
||||||
|
{
|
||||||
action_type *ap;
|
action_type *ap;
|
||||||
if (!*++argv)
|
if (!*++argv)
|
||||||
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
||||||
@ -438,7 +507,8 @@ static action*** parse_params(char **argv)
|
|||||||
* -perm -mode All of the permission bits mode are set for the file.
|
* -perm -mode All of the permission bits mode are set for the file.
|
||||||
* -perm +mode Any of the permission bits mode are set for the file.
|
* -perm +mode Any of the permission bits mode are set for the file.
|
||||||
*/
|
*/
|
||||||
else if (strcmp(arg, "-perm") == 0) {
|
else if (parm == PARM_perm)
|
||||||
|
{
|
||||||
action_perm *ap;
|
action_perm *ap;
|
||||||
if (!*++argv)
|
if (!*++argv)
|
||||||
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
||||||
@ -451,7 +521,8 @@ static action*** parse_params(char **argv)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_FEATURE_FIND_MTIME
|
#if ENABLE_FEATURE_FIND_MTIME
|
||||||
else if (strcmp(arg, "-mtime") == 0) {
|
else if (parm == PARM_mtime)
|
||||||
|
{
|
||||||
action_mtime *ap;
|
action_mtime *ap;
|
||||||
if (!*++argv)
|
if (!*++argv)
|
||||||
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
||||||
@ -461,7 +532,8 @@ static action*** parse_params(char **argv)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_FEATURE_FIND_MMIN
|
#if ENABLE_FEATURE_FIND_MMIN
|
||||||
else if (strcmp(arg, "-mmin") == 0) {
|
else if (parm == PARM_mmin)
|
||||||
|
{
|
||||||
action_mmin *ap;
|
action_mmin *ap;
|
||||||
if (!*++argv)
|
if (!*++argv)
|
||||||
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
||||||
@ -471,7 +543,8 @@ static action*** parse_params(char **argv)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_FEATURE_FIND_NEWER
|
#if ENABLE_FEATURE_FIND_NEWER
|
||||||
else if (strcmp(arg, "-newer") == 0) {
|
else if (parm == PARM_newer)
|
||||||
|
{
|
||||||
action_newer *ap;
|
action_newer *ap;
|
||||||
struct stat stat_newer;
|
struct stat stat_newer;
|
||||||
if (!*++argv)
|
if (!*++argv)
|
||||||
@ -482,7 +555,8 @@ static action*** parse_params(char **argv)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_FEATURE_FIND_INUM
|
#if ENABLE_FEATURE_FIND_INUM
|
||||||
else if (strcmp(arg, "-inum") == 0) {
|
else if (parm == PARM_inum)
|
||||||
|
{
|
||||||
action_inum *ap;
|
action_inum *ap;
|
||||||
if (!*++argv)
|
if (!*++argv)
|
||||||
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
||||||
@ -491,7 +565,8 @@ static action*** parse_params(char **argv)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_FEATURE_FIND_EXEC
|
#if ENABLE_FEATURE_FIND_EXEC
|
||||||
else if (strcmp(arg, "-exec") == 0) {
|
else if (parm == PARM_exec)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
action_exec *ap;
|
action_exec *ap;
|
||||||
need_print = 0;
|
need_print = 0;
|
||||||
@ -516,7 +591,8 @@ static action*** parse_params(char **argv)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_FEATURE_FIND_USER
|
#if ENABLE_FEATURE_FIND_USER
|
||||||
else if (strcmp(arg, "-user") == 0) {
|
else if (parm == PARM_user)
|
||||||
|
{
|
||||||
action_user *ap;
|
action_user *ap;
|
||||||
if (!*++argv)
|
if (!*++argv)
|
||||||
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
||||||
@ -527,7 +603,8 @@ static action*** parse_params(char **argv)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_DESKTOP
|
#if ENABLE_DESKTOP
|
||||||
else if (LONE_CHAR(arg, '(')) {
|
else if (parm == PARM_char_brace)
|
||||||
|
{
|
||||||
action_paren *ap;
|
action_paren *ap;
|
||||||
char **endarg;
|
char **endarg;
|
||||||
unsigned nested = 1;
|
unsigned nested = 1;
|
||||||
@ -548,11 +625,13 @@ static action*** parse_params(char **argv)
|
|||||||
*endarg = (char*) ")"; /* restore NULLed parameter */
|
*endarg = (char*) ")"; /* restore NULLed parameter */
|
||||||
argv = endarg;
|
argv = endarg;
|
||||||
}
|
}
|
||||||
else if (strcmp(arg, "-prune") == 0) {
|
else if (parm == PARM_prune)
|
||||||
|
{
|
||||||
USE_FEATURE_FIND_NOT( invert_flag = 0; )
|
USE_FEATURE_FIND_NOT( invert_flag = 0; )
|
||||||
(void) ALLOC_ACTION(prune);
|
(void) ALLOC_ACTION(prune);
|
||||||
}
|
}
|
||||||
else if (strcmp(arg, "-size") == 0) {
|
else if (parm == PARM_size)
|
||||||
|
{
|
||||||
action_size *ap;
|
action_size *ap;
|
||||||
if (!*++argv)
|
if (!*++argv)
|
||||||
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
bb_error_msg_and_die(bb_msg_requires_arg, arg);
|
||||||
@ -564,7 +643,6 @@ static action*** parse_params(char **argv)
|
|||||||
bb_show_usage();
|
bb_show_usage();
|
||||||
argv++;
|
argv++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return appp;
|
return appp;
|
||||||
#undef ALLOC_ACTION
|
#undef ALLOC_ACTION
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user