diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2011-02-12 20:27:13 +0100 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2011-02-12 20:27:13 +0100 |
| commit | 053c12e0de30afbc19019ffa9b0cb01edc44539f (patch) | |
| tree | a573a561be65b767e05a7a0e7912aa9f4c7d8d36 | |
| parent | 805f2453d02e9d5cbbbd5c37c6659691e1697630 (diff) | |
| download | busybox-w32-053c12e0de30afbc19019ffa9b0cb01edc44539f.tar.gz busybox-w32-053c12e0de30afbc19019ffa9b0cb01edc44539f.tar.bz2 busybox-w32-053c12e0de30afbc19019ffa9b0cb01edc44539f.zip | |
find: remove the hack we use to parse options first, replace with simpler code
text data bss dec hex filename
867764 438 7552 875754 d5cea busybox_old
867629 438 7552 875619 d5c63 busybox_unstripped
function old new delta
parse_params 1377 1440 +63
static.params 151 192 +41
static.options 42 57 +15
fileAction 151 153 +2
find_main 466 267 -199
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 4/1 up/down: 121/-199) Total: -78 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | findutils/find.c | 212 |
1 files changed, 91 insertions, 121 deletions
diff --git a/findutils/find.c b/findutils/find.c index 65467ae9c..52ac7b0b3 100644 --- a/findutils/find.c +++ b/findutils/find.c | |||
| @@ -374,8 +374,12 @@ IF_FEATURE_FIND_LINKS( ACTS(links, char links_char; int links_count;)) | |||
| 374 | struct globals { | 374 | struct globals { |
| 375 | IF_FEATURE_FIND_XDEV(dev_t *xdev_dev;) | 375 | IF_FEATURE_FIND_XDEV(dev_t *xdev_dev;) |
| 376 | IF_FEATURE_FIND_XDEV(int xdev_count;) | 376 | IF_FEATURE_FIND_XDEV(int xdev_count;) |
| 377 | #if ENABLE_FEATURE_FIND_MAXDEPTH | ||
| 378 | int minmaxdepth[2]; | ||
| 379 | #endif | ||
| 377 | action ***actions; | 380 | action ***actions; |
| 378 | bool need_print; | 381 | smallint need_print; |
| 382 | smallint xdev_on; | ||
| 379 | recurse_flags_t recurse_flags; | 383 | recurse_flags_t recurse_flags; |
| 380 | } FIX_ALIASING; | 384 | } FIX_ALIASING; |
| 381 | #define G (*(struct globals*)&bb_common_bufsiz1) | 385 | #define G (*(struct globals*)&bb_common_bufsiz1) |
| @@ -384,7 +388,8 @@ struct globals { | |||
| 384 | char G_sizecheck[sizeof(G) > COMMON_BUFSIZE ? -1 : 1]; \ | 388 | char G_sizecheck[sizeof(G) > COMMON_BUFSIZE ? -1 : 1]; \ |
| 385 | }; \ | 389 | }; \ |
| 386 | /* we have to zero it out because of NOEXEC */ \ | 390 | /* we have to zero it out because of NOEXEC */ \ |
| 387 | memset(&G, 0, offsetof(struct globals, need_print)); \ | 391 | memset(&G, 0, sizeof(G)); \ |
| 392 | IF_FEATURE_FIND_MAXDEPTH(G.minmaxdepth[1] = INT_MAX;) \ | ||
| 388 | G.need_print = 1; \ | 393 | G.need_print = 1; \ |
| 389 | G.recurse_flags = ACTION_RECURSE; \ | 394 | G.recurse_flags = ACTION_RECURSE; \ |
| 390 | } while (0) | 395 | } while (0) |
| @@ -682,16 +687,15 @@ ACTF(links) | |||
| 682 | 687 | ||
| 683 | static int FAST_FUNC fileAction(const char *fileName, | 688 | static int FAST_FUNC fileAction(const char *fileName, |
| 684 | struct stat *statbuf, | 689 | struct stat *statbuf, |
| 685 | void *userData IF_NOT_FEATURE_FIND_MAXDEPTH(UNUSED_PARAM), | 690 | void *userData UNUSED_PARAM, |
| 686 | int depth IF_NOT_FEATURE_FIND_MAXDEPTH(UNUSED_PARAM)) | 691 | int depth IF_NOT_FEATURE_FIND_MAXDEPTH(UNUSED_PARAM)) |
| 687 | { | 692 | { |
| 688 | int r; | 693 | int r; |
| 689 | #if ENABLE_FEATURE_FIND_MAXDEPTH | ||
| 690 | #define minmaxdepth ((int*)userData) | ||
| 691 | 694 | ||
| 692 | if (depth < minmaxdepth[0]) | 695 | #if ENABLE_FEATURE_FIND_MAXDEPTH |
| 696 | if (depth < G.minmaxdepth[0]) | ||
| 693 | return TRUE; /* skip this, continue recursing */ | 697 | return TRUE; /* skip this, continue recursing */ |
| 694 | if (depth > minmaxdepth[1]) | 698 | if (depth > G.minmaxdepth[1]) |
| 695 | return SKIP; /* stop recursing */ | 699 | return SKIP; /* stop recursing */ |
| 696 | #endif | 700 | #endif |
| 697 | 701 | ||
| @@ -702,7 +706,7 @@ static int FAST_FUNC fileAction(const char *fileName, | |||
| 702 | 706 | ||
| 703 | #if ENABLE_FEATURE_FIND_MAXDEPTH | 707 | #if ENABLE_FEATURE_FIND_MAXDEPTH |
| 704 | if (S_ISDIR(statbuf->st_mode)) { | 708 | if (S_ISDIR(statbuf->st_mode)) { |
| 705 | if (depth == minmaxdepth[1]) | 709 | if (depth == G.minmaxdepth[1]) |
| 706 | return SKIP; | 710 | return SKIP; |
| 707 | } | 711 | } |
| 708 | #endif | 712 | #endif |
| @@ -725,7 +729,6 @@ static int FAST_FUNC fileAction(const char *fileName, | |||
| 725 | /* Cannot return 0: our caller, recursive_action(), | 729 | /* Cannot return 0: our caller, recursive_action(), |
| 726 | * will perror() and skip dirs (if called on dir) */ | 730 | * will perror() and skip dirs (if called on dir) */ |
| 727 | return (r & SKIP) ? SKIP : TRUE; | 731 | return (r & SKIP) ? SKIP : TRUE; |
| 728 | #undef minmaxdepth | ||
| 729 | } | 732 | } |
| 730 | 733 | ||
| 731 | 734 | ||
| @@ -770,6 +773,9 @@ static const char* plus_minus_num(const char* str) | |||
| 770 | static action*** parse_params(char **argv) | 773 | static action*** parse_params(char **argv) |
| 771 | { | 774 | { |
| 772 | enum { | 775 | enum { |
| 776 | OPT_FOLLOW , | ||
| 777 | IF_FEATURE_FIND_XDEV( OPT_XDEV ,) | ||
| 778 | IF_FEATURE_FIND_DEPTH( OPT_DEPTH ,) | ||
| 773 | PARM_a , | 779 | PARM_a , |
| 774 | PARM_o , | 780 | PARM_o , |
| 775 | IF_FEATURE_FIND_NOT( PARM_char_not ,) | 781 | IF_FEATURE_FIND_NOT( PARM_char_not ,) |
| @@ -784,7 +790,7 @@ static action*** parse_params(char **argv) | |||
| 784 | IF_FEATURE_FIND_DELETE( PARM_delete ,) | 790 | IF_FEATURE_FIND_DELETE( PARM_delete ,) |
| 785 | IF_FEATURE_FIND_EXEC( PARM_exec ,) | 791 | IF_FEATURE_FIND_EXEC( PARM_exec ,) |
| 786 | IF_FEATURE_FIND_PAREN( PARM_char_brace,) | 792 | IF_FEATURE_FIND_PAREN( PARM_char_brace,) |
| 787 | /* All options starting from here require argument */ | 793 | /* All options/actions starting from here require argument */ |
| 788 | PARM_name , | 794 | PARM_name , |
| 789 | PARM_iname , | 795 | PARM_iname , |
| 790 | IF_FEATURE_FIND_PATH( PARM_path ,) | 796 | IF_FEATURE_FIND_PATH( PARM_path ,) |
| @@ -800,24 +806,28 @@ static action*** parse_params(char **argv) | |||
| 800 | IF_FEATURE_FIND_SIZE( PARM_size ,) | 806 | IF_FEATURE_FIND_SIZE( PARM_size ,) |
| 801 | IF_FEATURE_FIND_CONTEXT(PARM_context ,) | 807 | IF_FEATURE_FIND_CONTEXT(PARM_context ,) |
| 802 | IF_FEATURE_FIND_LINKS( PARM_links ,) | 808 | IF_FEATURE_FIND_LINKS( PARM_links ,) |
| 809 | IF_FEATURE_FIND_MAXDEPTH(OPT_MINDEPTH,OPT_MAXDEPTH,) | ||
| 803 | }; | 810 | }; |
| 804 | 811 | ||
| 805 | static const char params[] ALIGN1 = | 812 | static const char params[] ALIGN1 = |
| 806 | "-a\0" | 813 | "-follow\0" |
| 807 | "-o\0" | 814 | IF_FEATURE_FIND_XDEV( "-xdev\0" ) |
| 815 | IF_FEATURE_FIND_DEPTH( "-depth\0" ) | ||
| 816 | "-a\0" | ||
| 817 | "-o\0" | ||
| 808 | IF_FEATURE_FIND_NOT( "!\0" ) | 818 | IF_FEATURE_FIND_NOT( "!\0" ) |
| 809 | #if ENABLE_DESKTOP | 819 | #if ENABLE_DESKTOP |
| 810 | "-and\0" | 820 | "-and\0" |
| 811 | "-or\0" | 821 | "-or\0" |
| 812 | IF_FEATURE_FIND_NOT( "-not\0" ) | 822 | IF_FEATURE_FIND_NOT( "-not\0" ) |
| 813 | #endif | 823 | #endif |
| 814 | "-print\0" | 824 | "-print\0" |
| 815 | IF_FEATURE_FIND_PRINT0( "-print0\0" ) | 825 | IF_FEATURE_FIND_PRINT0( "-print0\0" ) |
| 816 | IF_FEATURE_FIND_PRUNE( "-prune\0" ) | 826 | IF_FEATURE_FIND_PRUNE( "-prune\0" ) |
| 817 | IF_FEATURE_FIND_DELETE( "-delete\0" ) | 827 | IF_FEATURE_FIND_DELETE( "-delete\0" ) |
| 818 | IF_FEATURE_FIND_EXEC( "-exec\0" ) | 828 | IF_FEATURE_FIND_EXEC( "-exec\0" ) |
| 819 | IF_FEATURE_FIND_PAREN( "(\0" ) | 829 | IF_FEATURE_FIND_PAREN( "(\0" ) |
| 820 | /* All options starting from here require argument */ | 830 | /* All options/actions starting from here require argument */ |
| 821 | "-name\0" | 831 | "-name\0" |
| 822 | "-iname\0" | 832 | "-iname\0" |
| 823 | IF_FEATURE_FIND_PATH( "-path\0" ) | 833 | IF_FEATURE_FIND_PATH( "-path\0" ) |
| @@ -833,6 +843,7 @@ static action*** parse_params(char **argv) | |||
| 833 | IF_FEATURE_FIND_SIZE( "-size\0" ) | 843 | IF_FEATURE_FIND_SIZE( "-size\0" ) |
| 834 | IF_FEATURE_FIND_CONTEXT("-context\0") | 844 | IF_FEATURE_FIND_CONTEXT("-context\0") |
| 835 | IF_FEATURE_FIND_LINKS( "-links\0" ) | 845 | IF_FEATURE_FIND_LINKS( "-links\0" ) |
| 846 | IF_FEATURE_FIND_MAXDEPTH("-mindepth\0""-maxdepth\0") | ||
| 836 | ; | 847 | ; |
| 837 | 848 | ||
| 838 | action*** appp; | 849 | action*** appp; |
| @@ -860,27 +871,13 @@ static action*** parse_params(char **argv) | |||
| 860 | 871 | ||
| 861 | appp = xzalloc(2 * sizeof(appp[0])); /* appp[0],[1] == NULL */ | 872 | appp = xzalloc(2 * sizeof(appp[0])); /* appp[0],[1] == NULL */ |
| 862 | 873 | ||
| 863 | /* Actions have side effects and return a true or false value | ||
| 864 | * We implement: -print, -print0, -exec | ||
| 865 | * | ||
| 866 | * The rest are tests. | ||
| 867 | * | ||
| 868 | * Tests and actions are grouped by operators | ||
| 869 | * ( expr ) Force precedence | ||
| 870 | * ! expr True if expr is false | ||
| 871 | * -not expr Same as ! expr | ||
| 872 | * expr1 [-a[nd]] expr2 And; expr2 is not evaluated if expr1 is false | ||
| 873 | * expr1 -o[r] expr2 Or; expr2 is not evaluated if expr1 is true | ||
| 874 | * expr1 , expr2 List; both expr1 and expr2 are always evaluated | ||
| 875 | * We implement: (), -a, -o | ||
| 876 | */ | ||
| 877 | while (*argv) { | 874 | while (*argv) { |
| 878 | const char *arg = argv[0]; | 875 | const char *arg = argv[0]; |
| 879 | int parm = index_in_strings(params, arg); | 876 | int parm = index_in_strings(params, arg); |
| 880 | const char *arg1 = argv[1]; | 877 | const char *arg1 = argv[1]; |
| 881 | 878 | ||
| 882 | if (parm >= PARM_name) { | 879 | if (parm >= PARM_name) { |
| 883 | /* All options starting from -name require argument */ | 880 | /* All options/actions starting from -name require argument */ |
| 884 | if (!arg1) | 881 | if (!arg1) |
| 885 | bb_error_msg_and_die(bb_msg_requires_arg, arg); | 882 | bb_error_msg_and_die(bb_msg_requires_arg, arg); |
| 886 | argv++; | 883 | argv++; |
| @@ -889,8 +886,37 @@ static action*** parse_params(char **argv) | |||
| 889 | /* We can use big switch() here, but on i386 | 886 | /* We can use big switch() here, but on i386 |
| 890 | * it doesn't give smaller code. Other arches? */ | 887 | * it doesn't give smaller code. Other arches? */ |
| 891 | 888 | ||
| 892 | /* --- Operators --- */ | 889 | /* Options always return true. They always take effect |
| 893 | if (parm == PARM_a IF_DESKTOP(|| parm == PARM_and)) { | 890 | * rather than being processed only when their place in the |
| 891 | * expression is reached. | ||
| 892 | */ | ||
| 893 | /* Options */ | ||
| 894 | #if ENABLE_FEATURE_FIND_XDEV | ||
| 895 | if (parm == OPT_XDEV) { | ||
| 896 | G.xdev_on = 1; | ||
| 897 | } | ||
| 898 | #endif | ||
| 899 | #if ENABLE_FEATURE_FIND_MAXDEPTH | ||
| 900 | else if (parm == OPT_MINDEPTH || parm == OPT_MINDEPTH + 1) { | ||
| 901 | G.minmaxdepth[parm - OPT_MINDEPTH] = xatoi_positive(arg1); | ||
| 902 | } | ||
| 903 | #endif | ||
| 904 | #if ENABLE_FEATURE_FIND_DEPTH | ||
| 905 | else if (parm == OPT_DEPTH) { | ||
| 906 | G.recurse_flags |= ACTION_DEPTHFIRST; | ||
| 907 | } | ||
| 908 | #endif | ||
| 909 | /* Actions are grouped by operators | ||
| 910 | * ( expr ) Force precedence | ||
| 911 | * ! expr True if expr is false | ||
| 912 | * -not expr Same as ! expr | ||
| 913 | * expr1 [-a[nd]] expr2 And; expr2 is not evaluated if expr1 is false | ||
| 914 | * expr1 -o[r] expr2 Or; expr2 is not evaluated if expr1 is true | ||
| 915 | * expr1 , expr2 List; both expr1 and expr2 are always evaluated | ||
| 916 | * We implement: (), -a, -o | ||
| 917 | */ | ||
| 918 | /* Operators */ | ||
| 919 | else if (parm == PARM_a IF_DESKTOP(|| parm == PARM_and)) { | ||
| 894 | /* no further special handling required */ | 920 | /* no further special handling required */ |
| 895 | } | 921 | } |
| 896 | else if (parm == PARM_o IF_DESKTOP(|| parm == PARM_or)) { | 922 | else if (parm == PARM_o IF_DESKTOP(|| parm == PARM_or)) { |
| @@ -907,8 +933,7 @@ static action*** parse_params(char **argv) | |||
| 907 | invert_flag ^= 1; | 933 | invert_flag ^= 1; |
| 908 | } | 934 | } |
| 909 | #endif | 935 | #endif |
| 910 | 936 | /* Actions */ | |
| 911 | /* --- Tests and actions --- */ | ||
| 912 | else if (parm == PARM_print) { | 937 | else if (parm == PARM_print) { |
| 913 | G.need_print = 0; | 938 | G.need_print = 0; |
| 914 | (void) ALLOC_ACTION(print); | 939 | (void) ALLOC_ACTION(print); |
| @@ -1014,10 +1039,10 @@ static action*** parse_params(char **argv) | |||
| 1014 | } | 1039 | } |
| 1015 | #endif | 1040 | #endif |
| 1016 | #if ENABLE_FEATURE_FIND_PERM | 1041 | #if ENABLE_FEATURE_FIND_PERM |
| 1017 | /* -perm mode File's permission bits are exactly mode (octal or symbolic). | 1042 | /* -perm BITS File's mode bits are exactly BITS (octal or symbolic). |
| 1018 | * Symbolic modes use mode 0 as a point of departure. | 1043 | * Symbolic modes use mode 0 as a point of departure. |
| 1019 | * -perm -mode All of the permission bits mode are set for the file. | 1044 | * -perm -BITS All of the BITS are set in file's mode. |
| 1020 | * -perm +mode Any of the permission bits mode are set for the file. | 1045 | * -perm +BITS At least one of the BITS is set in file's mode. |
| 1021 | */ | 1046 | */ |
| 1022 | else if (parm == PARM_perm) { | 1047 | else if (parm == PARM_perm) { |
| 1023 | action_perm *ap; | 1048 | action_perm *ap; |
| @@ -1137,111 +1162,56 @@ static action*** parse_params(char **argv) | |||
| 1137 | int find_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 1162 | int find_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 1138 | int find_main(int argc UNUSED_PARAM, char **argv) | 1163 | int find_main(int argc UNUSED_PARAM, char **argv) |
| 1139 | { | 1164 | { |
| 1140 | static const char options[] ALIGN1 = | ||
| 1141 | "-follow\0" | ||
| 1142 | IF_FEATURE_FIND_XDEV( "-xdev\0" ) | ||
| 1143 | IF_FEATURE_FIND_MAXDEPTH("-mindepth\0""-maxdepth\0") | ||
| 1144 | IF_FEATURE_FIND_DEPTH( "-depth\0" ) | ||
| 1145 | ; | ||
| 1146 | enum { | ||
| 1147 | OPT_FOLLOW, | ||
| 1148 | IF_FEATURE_FIND_XDEV( OPT_XDEV ,) | ||
| 1149 | IF_FEATURE_FIND_MAXDEPTH(OPT_MINDEPTH,) | ||
| 1150 | IF_FEATURE_FIND_DEPTH( OPT_DEPTH ,) | ||
| 1151 | }; | ||
| 1152 | |||
| 1153 | char *arg; | ||
| 1154 | char **argp; | ||
| 1155 | int i, firstopt, status = EXIT_SUCCESS; | 1165 | int i, firstopt, status = EXIT_SUCCESS; |
| 1156 | #if ENABLE_FEATURE_FIND_MAXDEPTH | ||
| 1157 | int minmaxdepth[2] = { 0, INT_MAX }; | ||
| 1158 | #else | ||
| 1159 | #define minmaxdepth NULL | ||
| 1160 | #endif | ||
| 1161 | 1166 | ||
| 1162 | INIT_G(); | 1167 | INIT_G(); |
| 1163 | 1168 | ||
| 1164 | for (firstopt = 1; argv[firstopt]; firstopt++) { | 1169 | argv++; |
| 1170 | for (firstopt = 0; argv[firstopt]; firstopt++) { | ||
| 1165 | if (argv[firstopt][0] == '-') | 1171 | if (argv[firstopt][0] == '-') |
| 1166 | break; | 1172 | break; |
| 1167 | if (ENABLE_FEATURE_FIND_NOT && LONE_CHAR(argv[firstopt], '!')) | 1173 | if (ENABLE_FEATURE_FIND_NOT && LONE_CHAR(argv[firstopt], '!')) |
| 1168 | break; | 1174 | break; |
| 1169 | #if ENABLE_FEATURE_FIND_PAREN | 1175 | if (ENABLE_FEATURE_FIND_PAREN && LONE_CHAR(argv[firstopt], '(')) |
| 1170 | if (LONE_CHAR(argv[firstopt], '(')) | ||
| 1171 | break; | 1176 | break; |
| 1172 | #endif | ||
| 1173 | } | 1177 | } |
| 1174 | if (firstopt == 1) { | 1178 | if (firstopt == 0) { |
| 1175 | argv[0] = (char*)"."; | 1179 | *--argv = (char*)"."; |
| 1176 | argv--; | ||
| 1177 | firstopt++; | 1180 | firstopt++; |
| 1178 | } | 1181 | } |
| 1179 | 1182 | ||
| 1180 | /* All options always return true. They always take effect | 1183 | G.actions = parse_params(&argv[firstopt]); |
| 1181 | * rather than being processed only when their place in the | 1184 | argv[firstopt] = NULL; |
| 1182 | * expression is reached. | 1185 | |
| 1183 | * We implement: -follow, -xdev, -mindepth, -maxdepth, -depth | ||
| 1184 | */ | ||
| 1185 | /* Process options, and replace them with -a */ | ||
| 1186 | /* (-a will be ignored by recursive parser later) */ | ||
| 1187 | argp = &argv[firstopt]; | ||
| 1188 | while ((arg = argp[0]) != NULL) { | ||
| 1189 | int opt = index_in_strings(options, arg); | ||
| 1190 | if (opt == OPT_FOLLOW) { | ||
| 1191 | G.recurse_flags |= ACTION_FOLLOWLINKS | ACTION_DANGLING_OK; | ||
| 1192 | argp[0] = (char*)"-a"; | ||
| 1193 | } | ||
| 1194 | #if ENABLE_FEATURE_FIND_XDEV | 1186 | #if ENABLE_FEATURE_FIND_XDEV |
| 1195 | if (opt == OPT_XDEV) { | 1187 | if (G.xdev_on) { |
| 1196 | struct stat stbuf; | 1188 | struct stat stbuf; |
| 1197 | if (!G.xdev_count) { | 1189 | |
| 1198 | G.xdev_count = firstopt - 1; | 1190 | G.xdev_count = firstopt; |
| 1199 | G.xdev_dev = xzalloc(G.xdev_count * sizeof(G.xdev_dev[0])); | 1191 | G.xdev_dev = xzalloc(G.xdev_count * sizeof(G.xdev_dev[0])); |
| 1200 | for (i = 1; i < firstopt; i++) { | 1192 | for (i = 0; argv[i]; i++) { |
| 1201 | /* not xstat(): shouldn't bomb out on | 1193 | /* not xstat(): shouldn't bomb out on |
| 1202 | * "find not_exist exist -xdev" */ | 1194 | * "find not_exist exist -xdev" */ |
| 1203 | if (stat(argv[i], &stbuf) == 0) | 1195 | if (stat(argv[i], &stbuf) == 0) |
| 1204 | G.xdev_dev[i-1] = stbuf.st_dev; | 1196 | G.xdev_dev[i] = stbuf.st_dev; |
| 1205 | /* else G.xdev_dev[i-1] stays 0 and | 1197 | /* else G.xdev_dev[i] stays 0 and |
| 1206 | * won't match any real device dev_t */ | 1198 | * won't match any real device dev_t |
| 1207 | } | 1199 | */ |
| 1208 | } | ||
| 1209 | argp[0] = (char*)"-a"; | ||
| 1210 | } | ||
| 1211 | #endif | ||
| 1212 | #if ENABLE_FEATURE_FIND_MAXDEPTH | ||
| 1213 | if (opt == OPT_MINDEPTH || opt == OPT_MINDEPTH + 1) { | ||
| 1214 | if (!argp[1]) | ||
| 1215 | bb_show_usage(); | ||
| 1216 | minmaxdepth[opt - OPT_MINDEPTH] = xatoi_positive(argp[1]); | ||
| 1217 | argp[0] = (char*)"-a"; | ||
| 1218 | argp++; | ||
| 1219 | argp[0] = (char*)"-a"; | ||
| 1220 | } | ||
| 1221 | #endif | ||
| 1222 | #if ENABLE_FEATURE_FIND_DEPTH | ||
| 1223 | if (opt == OPT_DEPTH) { | ||
| 1224 | G.recurse_flags |= ACTION_DEPTHFIRST; | ||
| 1225 | argp[0] = (char*)"-a"; | ||
| 1226 | } | 1200 | } |
| 1227 | #endif | ||
| 1228 | argp++; | ||
| 1229 | } | 1201 | } |
| 1202 | #endif | ||
| 1230 | 1203 | ||
| 1231 | G.actions = parse_params(&argv[firstopt]); | 1204 | for (i = 0; argv[i]; i++) { |
| 1232 | |||
| 1233 | for (i = 1; i < firstopt; i++) { | ||
| 1234 | if (!recursive_action(argv[i], | 1205 | if (!recursive_action(argv[i], |
| 1235 | G.recurse_flags,/* flags */ | 1206 | G.recurse_flags,/* flags */ |
| 1236 | fileAction, /* file action */ | 1207 | fileAction, /* file action */ |
| 1237 | fileAction, /* dir action */ | 1208 | fileAction, /* dir action */ |
| 1238 | #if ENABLE_FEATURE_FIND_MAXDEPTH | ||
| 1239 | minmaxdepth, /* user data */ | ||
| 1240 | #else | ||
| 1241 | NULL, /* user data */ | 1209 | NULL, /* user data */ |
| 1242 | #endif | 1210 | 0) /* depth */ |
| 1243 | 0)) /* depth */ | 1211 | ) { |
| 1244 | status = EXIT_FAILURE; | 1212 | status = EXIT_FAILURE; |
| 1213 | } | ||
| 1245 | } | 1214 | } |
| 1215 | |||
| 1246 | return status; | 1216 | return status; |
| 1247 | } | 1217 | } |
