diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-02-04 17:11:25 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-02-04 17:11:25 +0000 |
| commit | cf787cf3a54f21e643d760dc3f893233ecce4ad5 (patch) | |
| tree | 87a9b5ac42b0f76ede0014bed1940abcfd21bb2a /findutils | |
| parent | 10b7996c1bcdeb66675251f5dff3d3ad57ab44f8 (diff) | |
| download | busybox-w32-cf787cf3a54f21e643d760dc3f893233ecce4ad5.tar.gz busybox-w32-cf787cf3a54f21e643d760dc3f893233ecce4ad5.tar.bz2 busybox-w32-cf787cf3a54f21e643d760dc3f893233ecce4ad5.zip | |
find: support for !
Diffstat (limited to 'findutils')
| -rw-r--r-- | findutils/Config.in | 18 | ||||
| -rw-r--r-- | findutils/find.c | 45 |
2 files changed, 55 insertions, 8 deletions
diff --git a/findutils/Config.in b/findutils/Config.in index 73ce36f51..e5f82986d 100644 --- a/findutils/Config.in +++ b/findutils/Config.in | |||
| @@ -90,6 +90,24 @@ config FEATURE_FIND_USER | |||
| 90 | help | 90 | help |
| 91 | Support the 'find -user' option for searching by username or uid. | 91 | Support the 'find -user' option for searching by username or uid. |
| 92 | 92 | ||
| 93 | config FEATURE_FIND_NOT | ||
| 94 | bool "Enable the 'not' (!) operator" | ||
| 95 | default y | ||
| 96 | depends on FIND | ||
| 97 | help | ||
| 98 | Support the '!' operator to invert the test results. If 'Enable | ||
| 99 | full-blown desktop' is enabled, then will also the non-POSIX | ||
| 100 | '-not' be supported. | ||
| 101 | |||
| 102 | config FEATURE_FIND_NOT | ||
| 103 | bool "Enable the 'not' (!) operator" | ||
| 104 | default y | ||
| 105 | depends on FIND | ||
| 106 | help | ||
| 107 | Support the '!' operator to invert the test results. If 'Enable | ||
| 108 | full-blown desktop' is enabled, then will also the non-POSIX | ||
| 109 | '-not' be supported. | ||
| 110 | |||
| 93 | config GREP | 111 | config GREP |
| 94 | bool "grep" | 112 | bool "grep" |
| 95 | default n | 113 | default n |
diff --git a/findutils/find.c b/findutils/find.c index bfdd84497..5645b5a4d 100644 --- a/findutils/find.c +++ b/findutils/find.c | |||
| @@ -55,6 +55,9 @@ typedef int (*action_fp)(const char *fileName, struct stat *statbuf, void *); | |||
| 55 | 55 | ||
| 56 | typedef struct { | 56 | typedef struct { |
| 57 | action_fp f; | 57 | action_fp f; |
| 58 | #if ENABLE_FEATURE_FIND_NOT | ||
| 59 | smallint invert; | ||
| 60 | #endif | ||
| 58 | } action; | 61 | } action; |
| 59 | #define ACTS(name, arg...) typedef struct { action a; arg; } action_##name; | 62 | #define ACTS(name, arg...) typedef struct { action a; arg; } action_##name; |
| 60 | #define ACTF(name) static int func_##name(const char *fileName, struct stat *statbuf, action_##name* ap) | 63 | #define ACTF(name) static int func_##name(const char *fileName, struct stat *statbuf, action_##name* ap) |
| @@ -118,12 +121,20 @@ static int exec_actions(action ***appp, const char *fileName, struct stat *statb | |||
| 118 | cur_group = -1; | 121 | cur_group = -1; |
| 119 | while ((app = appp[++cur_group])) { | 122 | while ((app = appp[++cur_group])) { |
| 120 | cur_action = -1; | 123 | cur_action = -1; |
| 121 | do { | 124 | while (1) { |
| 122 | ap = app[++cur_action]; | 125 | ap = app[++cur_action]; |
| 123 | } while (ap && (rc = ap->f(fileName, statbuf, ap))); | 126 | if (!ap) { |
| 124 | if (!ap) { | 127 | /* all actions in group were successful */ |
| 125 | /* all actions in group were successful */ | 128 | return rc; |
| 126 | break; | 129 | } |
| 130 | rc = ap->f(fileName, statbuf, ap); | ||
| 131 | #if ENABLE_FEATURE_FIND_NOT | ||
| 132 | if (ap->invert) rc = !rc; | ||
| 133 | #endif | ||
| 134 | if (!rc) { | ||
| 135 | /* current group failed, try next */ | ||
| 136 | break; | ||
| 137 | } | ||
| 127 | } | 138 | } |
| 128 | } | 139 | } |
| 129 | return rc; | 140 | return rc; |
| @@ -331,6 +342,7 @@ static action*** parse_params(char **argv) | |||
| 331 | action*** appp; | 342 | action*** appp; |
| 332 | unsigned cur_group = 0; | 343 | unsigned cur_group = 0; |
| 333 | unsigned cur_action = 0; | 344 | unsigned cur_action = 0; |
| 345 | USE_FEATURE_FIND_NOT( smallint invert_flag = 0; ) | ||
| 334 | 346 | ||
| 335 | action* alloc_action(int sizeof_struct, action_fp f) | 347 | action* alloc_action(int sizeof_struct, action_fp f) |
| 336 | { | 348 | { |
| @@ -339,11 +351,12 @@ static action*** parse_params(char **argv) | |||
| 339 | appp[cur_group][cur_action++] = ap = xmalloc(sizeof_struct); | 351 | appp[cur_group][cur_action++] = ap = xmalloc(sizeof_struct); |
| 340 | appp[cur_group][cur_action] = NULL; | 352 | appp[cur_group][cur_action] = NULL; |
| 341 | ap->f = f; | 353 | ap->f = f; |
| 354 | USE_FEATURE_FIND_NOT( ap->invert = invert_flag; ) | ||
| 342 | return ap; | 355 | return ap; |
| 343 | } | 356 | } |
| 344 | #define ALLOC_ACTION(name) (action_##name*)alloc_action(sizeof(action_##name), (action_fp) func_##name) | 357 | #define ALLOC_ACTION(name) (action_##name*)alloc_action(sizeof(action_##name), (action_fp) func_##name) |
| 345 | 358 | ||
| 346 | appp = xzalloc(2 * sizeof(*appp)); /* appp[0],[1] == NULL */ | 359 | appp = xzalloc(2 * sizeof(appp[0])); /* appp[0],[1] == NULL */ |
| 347 | 360 | ||
| 348 | // Actions have side effects and return a true or false value | 361 | // Actions have side effects and return a true or false value |
| 349 | // We implement: -print, -print0, -exec | 362 | // We implement: -print, -print0, -exec |
| @@ -367,27 +380,39 @@ static action*** parse_params(char **argv) | |||
| 367 | if (strcmp(arg, "-a") == 0 | 380 | if (strcmp(arg, "-a") == 0 |
| 368 | USE_DESKTOP(|| strcmp(arg, "-and") == 0) | 381 | USE_DESKTOP(|| strcmp(arg, "-and") == 0) |
| 369 | ) { | 382 | ) { |
| 370 | /* no special handling required */ | 383 | USE_FEATURE_FIND_NOT( invert_flag = 0; ) |
| 384 | /* no further special handling required */ | ||
| 371 | } | 385 | } |
| 372 | else if (strcmp(arg, "-o") == 0 | 386 | else if (strcmp(arg, "-o") == 0 |
| 373 | USE_DESKTOP(|| strcmp(arg, "-or") == 0) | 387 | USE_DESKTOP(|| strcmp(arg, "-or") == 0) |
| 374 | ) { | 388 | ) { |
| 375 | /* start new OR group */ | 389 | /* start new OR group */ |
| 390 | USE_FEATURE_FIND_NOT( invert_flag = 0; ) | ||
| 376 | cur_group++; | 391 | cur_group++; |
| 377 | appp = xrealloc(appp, (cur_group+2) * sizeof(*appp)); | 392 | appp = xrealloc(appp, (cur_group+2) * sizeof(*appp)); |
| 378 | appp[cur_group] = NULL; | 393 | /*appp[cur_group] = NULL; - already NULL */ |
| 379 | appp[cur_group+1] = NULL; | 394 | appp[cur_group+1] = NULL; |
| 380 | cur_action = 0; | 395 | cur_action = 0; |
| 381 | } | 396 | } |
| 397 | #if ENABLE_FEATURE_FIND_NOT | ||
| 398 | else if (LONE_CHAR(arg, '!') | ||
| 399 | USE_DESKTOP(|| strcmp(arg, "-not") == 0) | ||
| 400 | ) { | ||
| 401 | invert_flag = 1; | ||
| 402 | } | ||
| 403 | #endif | ||
| 382 | 404 | ||
| 383 | /* --- Tests and actions --- */ | 405 | /* --- Tests and actions --- */ |
| 384 | else if (strcmp(arg, "-print") == 0) { | 406 | else if (strcmp(arg, "-print") == 0) { |
| 385 | need_print = 0; | 407 | need_print = 0; |
| 408 | /* GNU find ignores '!' here: "find ! -print" */ | ||
| 409 | USE_FEATURE_FIND_NOT( invert_flag = 0; ) | ||
| 386 | (void) ALLOC_ACTION(print); | 410 | (void) ALLOC_ACTION(print); |
| 387 | } | 411 | } |
| 388 | #if ENABLE_FEATURE_FIND_PRINT0 | 412 | #if ENABLE_FEATURE_FIND_PRINT0 |
| 389 | else if (strcmp(arg, "-print0") == 0) { | 413 | else if (strcmp(arg, "-print0") == 0) { |
| 390 | need_print = 0; | 414 | need_print = 0; |
| 415 | USE_FEATURE_FIND_NOT( invert_flag = 0; ) | ||
| 391 | (void) ALLOC_ACTION(print0); | 416 | (void) ALLOC_ACTION(print0); |
| 392 | } | 417 | } |
| 393 | #endif | 418 | #endif |
| @@ -471,6 +496,7 @@ static action*** parse_params(char **argv) | |||
| 471 | int i; | 496 | int i; |
| 472 | action_exec *ap; | 497 | action_exec *ap; |
| 473 | need_print = 0; | 498 | need_print = 0; |
| 499 | USE_FEATURE_FIND_NOT( invert_flag = 0; ) | ||
| 474 | ap = ALLOC_ACTION(exec); | 500 | ap = ALLOC_ACTION(exec); |
| 475 | ap->exec_argv = ++argv; /* first arg after -exec */ | 501 | ap->exec_argv = ++argv; /* first arg after -exec */ |
| 476 | ap->exec_argc = 0; | 502 | ap->exec_argc = 0; |
| @@ -524,6 +550,7 @@ static action*** parse_params(char **argv) | |||
| 524 | argv = endarg; | 550 | argv = endarg; |
| 525 | } | 551 | } |
| 526 | else if (strcmp(arg, "-prune") == 0) { | 552 | else if (strcmp(arg, "-prune") == 0) { |
| 553 | USE_FEATURE_FIND_NOT( invert_flag = 0; ) | ||
| 527 | (void) ALLOC_ACTION(prune); | 554 | (void) ALLOC_ACTION(prune); |
| 528 | } | 555 | } |
| 529 | else if (strcmp(arg, "-size") == 0) { | 556 | else if (strcmp(arg, "-size") == 0) { |
| @@ -555,6 +582,8 @@ int find_main(int argc, char **argv) | |||
| 555 | for (firstopt = 1; firstopt < argc; firstopt++) { | 582 | for (firstopt = 1; firstopt < argc; firstopt++) { |
| 556 | if (argv[firstopt][0] == '-') | 583 | if (argv[firstopt][0] == '-') |
| 557 | break; | 584 | break; |
| 585 | if (ENABLE_FEATURE_FIND_NOT && LONE_CHAR(argv[firstopt], '!')) | ||
| 586 | break; | ||
| 558 | #if ENABLE_DESKTOP | 587 | #if ENABLE_DESKTOP |
| 559 | if (LONE_CHAR(argv[firstopt], '(')) | 588 | if (LONE_CHAR(argv[firstopt], '(')) |
| 560 | break; | 589 | break; |
