find:: get rid of nested function (it's a gcc-ism)
No binary (build failed)
—
(log yok)
| @@ -815,6 +815,31 @@ static const char* plus_minus_num(const char* str) | |
| } | |
| #endif | |
| + | /* Say no to GCCism */ |
| + | #define USE_NESTED_FUNCTION 0 |
| + | |
| + | #if !USE_NESTED_FUNCTION |
| + | struct pp_locals { |
| + | action*** appp; |
| + | unsigned cur_group; |
| + | unsigned cur_action; |
| + | IF_FEATURE_FIND_NOT( bool invert_flag; ) |
| + | }; |
| + | static action* alloc_action(struct pp_locals *ppl, int sizeof_struct, action_fp f) |
| + | { |
| + | action *ap = xzalloc(sizeof_struct); |
| + | action **app; |
| + | action ***group = &ppl->appp[ppl->cur_group]; |
| + | *group = app = xrealloc(*group, (ppl->cur_action+2) * sizeof(ppl->appp[0][0])); |
| + | app[ppl->cur_action++] = ap; |
| + | app[ppl->cur_action] = NULL; |
| + | ap->f = f; |
| + | IF_FEATURE_FIND_NOT( ap->invert = ppl->invert_flag; ) |
| + | IF_FEATURE_FIND_NOT( ppl->invert_flag = 0; ) |
| + | return ap; |
| + | } |
| + | #endif |
| + | |
| static action*** parse_params(char **argv) | |
| { | |
| enum { | |
| @@ -901,10 +926,18 @@ static action*** parse_params(char **argv) | |
| IF_FEATURE_FIND_MAXDEPTH("-mindepth\0""-maxdepth\0") | |
| ; | |
| + | #if !USE_NESTED_FUNCTION |
| + | struct pp_locals ppl; |
| + | #define appp (ppl.appp ) |
| + | #define cur_group (ppl.cur_group ) |
| + | #define cur_action (ppl.cur_action ) |
| + | #define invert_flag (ppl.invert_flag) |
| + | #define ALLOC_ACTION(name) (action_##name*)alloc_action(&ppl, sizeof(action_##name), (action_fp) func_##name) |
| + | #else |
| action*** appp; | |
| - | unsigned cur_group = 0; |
| - | unsigned cur_action = 0; |
| - | IF_FEATURE_FIND_NOT( bool invert_flag = 0; ) |
| + | unsigned cur_group; |
| + | unsigned cur_action; |
| + | IF_FEATURE_FIND_NOT( bool invert_flag; ) |
| /* This is the only place in busybox where we use nested function. | |
| * So far more standard alternatives were bigger. */ | |
| @@ -913,7 +946,7 @@ static action*** parse_params(char **argv) | |
| action* alloc_action(int sizeof_struct, action_fp f) | |
| { | |
| action *ap; | |
| - | appp[cur_group] = xrealloc(appp[cur_group], (cur_action+2) * sizeof(*appp)); |
| + | appp[cur_group] = xrealloc(appp[cur_group], (cur_action+2) * sizeof(appp[0][0])); |
| appp[cur_group][cur_action++] = ap = xzalloc(sizeof_struct); | |
| appp[cur_group][cur_action] = NULL; | |
| ap->f = f; | |
| @@ -921,9 +954,12 @@ static action*** parse_params(char **argv) | |
| IF_FEATURE_FIND_NOT( invert_flag = 0; ) | |
| return ap; | |
| } | |
| - | |
| #define ALLOC_ACTION(name) (action_##name*)alloc_action(sizeof(action_##name), (action_fp) func_##name) | |
| + | #endif |
| + | cur_group = 0; |
| + | cur_action = 0; |
| + | IF_FEATURE_FIND_NOT( invert_flag = 0; ) |
| appp = xzalloc(2 * sizeof(appp[0])); /* appp[0],[1] == NULL */ | |
| while (*argv) { | |
| @@ -988,7 +1024,7 @@ static action*** parse_params(char **argv) | |
| dbg("%d", __LINE__); | |
| /* start new OR group */ | |
| cur_group++; | |
| - | appp = xrealloc(appp, (cur_group+2) * sizeof(*appp)); |
| + | appp = xrealloc(appp, (cur_group+2) * sizeof(appp[0])); |
| /*appp[cur_group] = NULL; - already NULL */ | |
| appp[cur_group+1] = NULL; | |
| cur_action = 0; | |
| @@ -1246,6 +1282,9 @@ static action*** parse_params(char **argv) | |
| dbg("exiting %s", __func__); | |
| return appp; | |
| #undef ALLOC_ACTION | |
| + | #undef appp |
| + | #undef cur_action |
| + | #undef invert_flag |
| } | |
| int find_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |