diff options
author | Denis Vlasenko | 2007-11-18 22:56:25 +0000 |
---|---|---|
committer | Denis Vlasenko | 2007-11-18 22:56:25 +0000 |
commit | ed6a49c657ae204f6ba8ad84315fa04c09297a7c (patch) | |
tree | 5f47e19e16582dfcdefb99bc1edea693e86c258d /networking/libiproute/ip_parse_common_args.c | |
parent | 2a587df80a148e497d10344c79f2b94d3bce6aaf (diff) | |
download | busybox-ed6a49c657ae204f6ba8ad84315fa04c09297a7c.zip busybox-ed6a49c657ae204f6ba8ad84315fa04c09297a7c.tar.gz |
ip: stop propagating argc; optimize ip_parse_common_args
function old new delta
find_pair 167 187 +20
static.families - 17 +17
die_must_be_on_off - 11 +11
...
on_off 33 22 -11
do_ipaddr 103 90 -13
do_iptunnel 1001 986 -15
iproute_list_or_flush 1237 1217 -20
static.ip_common_commands 43 22 -21
do_iproute 2217 2193 -24
parse_args 1444 1414 -30
ip_do 47 16 -31
do_iprule 994 963 -31
ip_main 153 113 -40
ipaddr_modify 1357 1305 -52
ipaddr_list_or_flush 2543 2490 -53
ip_parse_common_args 294 159 -135
------------------------------------------------------------------------------
(add/remove: 4/1 grow/shrink: 4/24 up/down: 85/-563) Total: -478 bytes
text data bss dec hex filename
775561 966 9236 785763 bfd63 busybox_old
775073 962 9236 785271 bfb77 busybox_unstripped
Diffstat (limited to 'networking/libiproute/ip_parse_common_args.c')
-rw-r--r-- | networking/libiproute/ip_parse_common_args.c | 84 |
1 files changed, 40 insertions, 44 deletions
diff --git a/networking/libiproute/ip_parse_common_args.c b/networking/libiproute/ip_parse_common_args.c index ff33399..294bde5 100644 --- a/networking/libiproute/ip_parse_common_args.c +++ b/networking/libiproute/ip_parse_common_args.c @@ -18,71 +18,67 @@ #include "ip_common.h" /* #include "libbb.h" is inside */ #include "utils.h" -int preferred_family = AF_UNSPEC; +family_t preferred_family = AF_UNSPEC; smallint oneline; char _SL_; -void ip_parse_common_args(int *argcp, char ***argvp) +char **ip_parse_common_args(char **argv) { - int argc = *argcp; - char **argv = *argvp; static const char ip_common_commands[] ALIGN1 = - "-family\0""inet\0""inet6\0""link\0" - "-4\0""-6\0""-0\0""-oneline\0"; + "oneline" "\0" + "family" "\0" + "4" "\0" + "6" "\0" + "0" "\0" + ; enum { - ARG_family = 1, - ARG_inet, - ARG_inet6, - ARG_link, + ARG_oneline, + ARG_family, ARG_IPv4, ARG_IPv6, ARG_packet, - ARG_oneline }; - smalluint arg; + static const family_t af_numbers[] = { AF_INET, AF_INET6, AF_PACKET }; + int arg; - while (argc > 1) { - char *opt = argv[1]; + while (*argv) { + char *opt = *argv; - if (strcmp(opt,"--") == 0) { - argc--; - argv++; - break; - } if (opt[0] != '-') break; - if (opt[1] == '-') + opt++; + if (opt[0] == '-') { opt++; - arg = index_in_strings(ip_common_commands, opt) + 1; + if (!opt[0]) { /* "--" */ + argv++; + break; + } + } + arg = index_in_strings(ip_common_commands, opt); + if (arg < 0) + bb_show_usage(); + if (arg == ARG_oneline) { + oneline = 1; + argv++; + continue; + } if (arg == ARG_family) { - argc--; + static const char families[] ALIGN1 = + "inet" "\0" "inet6" "\0" "link" "\0"; argv++; - if (!argv[1]) + if (!*argv) bb_show_usage(); - arg = index_in_strings(ip_common_commands, argv[1]) + 1; - if (arg == ARG_inet) - preferred_family = AF_INET; - else if (arg == ARG_inet6) - preferred_family = AF_INET6; - else if (arg == ARG_link) - preferred_family = AF_PACKET; - else - invarg(argv[1], "protocol family"); - } else if (arg == ARG_IPv4) { - preferred_family = AF_INET; - } else if (arg == ARG_IPv6) { - preferred_family = AF_INET6; - } else if (arg == ARG_packet) { - preferred_family = AF_PACKET; - } else if (arg == ARG_oneline) { - ++oneline; + arg = index_in_strings(families, *argv); + if (arg < 0) + invarg(*argv, "protocol family"); + /* now arg == 0, 1 or 2 */ } else { - bb_show_usage(); + arg -= ARG_IPv4; + /* now arg == 0, 1 or 2 */ } - argc--; + preferred_family = af_numbers[arg]; argv++; } _SL_ = oneline ? '\\' : '\n'; - *argcp = argc; - *argvp = argv; + return argv; } |