getopt_ulflags: formatting fixes

This commit is contained in:
Denis Vlasenko 2006-09-29 08:23:42 +00:00
parent 6248a734e2
commit b02ef82c99

View File

@ -13,7 +13,7 @@
/* Documentation
unsigned long
bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...)
bb_getopt_ulflags(int argc, char **argv, const char *applet_opts, ...)
The command line options must be declared in const char
*applet_opts as a string of chars, for example:
@ -74,6 +74,7 @@ const struct option *bb_applet_long_options
(see getopt(3))
static const struct option applet_long_options[] = {
//name,has_arg,flag,val
{ "verbose", 0, 0, 'v' },
{ 0, 0, 0, 0 }
};
@ -120,7 +121,7 @@ const char *bb_opt_complementally
int w_counter = 0;
bb_opt_complementally = "ww";
bb_getopt_ulflags(argc, argv, "w", &w_counter);
if(w_counter)
if (w_counter)
width = (w_counter == 1) ? 132 : INT_MAX;
else
get_terminal_width(...&width...);
@ -136,11 +137,11 @@ const char *bb_opt_complementally
int verbose_level = 0;
bb_opt_complementally = "vv:b::b-c:c-b";
f = bb_getopt_ulflags(argc, argv, "vb:c", &my_b, &verbose_level);
if(f & 2) // -c after -b unsets -b flag
while(my_b) { dosomething_with(my_b->data); my_b = my_b->link; }
if(my_b) // but llist is stored if -b is specified
if (f & 2) // -c after -b unsets -b flag
while (my_b) { dosomething_with(my_b->data); my_b = my_b->link; }
if (my_b) // but llist is stored if -b is specified
free_llist(my_b);
if(verbose_level) bb_printf("verbose level is %d\n", verbose_level);
if (verbose_level) bb_printf("verbose level is %d\n", verbose_level);
Special characters:
@ -207,6 +208,9 @@ Special characters:
if (flags & BB_GETOPT_ERROR)
bb_show_usage();
"x--x" Variation of the above, it means that -x option should occur
at most once.
"?" A "?" as the first char in a bb_opt_complementally group means:
if BB_GETOPT_ERROR is detected, don't return, call bb_show_usage
and exit instead. Next char after '?' can't be a digit.
@ -255,7 +259,7 @@ Special characters:
$ id; id -u; id -g; id -ru; id -nu; id -rg; id -ng; id -rnu; id -rng
"X" A bb_opt_complementally group with just a single letter means
that this this option is required. If more than one such group exists,
that this option is required. If more than one such group exists,
at least one option is required to occur (not all of them).
For example from "start-stop-daemon" applet:
@ -263,9 +267,6 @@ Special characters:
bb_opt_complementally = "K:S:?K--S:S--K";
flags = bb_getopt_ulflags(argc, argv, "KS...);
"x--x" give error if double or more used -x option
Don't forget to use ':'. For example "?322-22-23X-x-a" is interpreted as
"?3:22:-2:2-2:2-3Xa:2--x": max 3 args; count uses of '-2'; min 2 args;
if there is a '-2' option then unset '-3', '-X' and '-a'; if there is
@ -299,7 +300,7 @@ const struct option *bb_applet_long_options = bb_default_long_options;
#endif
unsigned long
bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...)
bb_getopt_ulflags(int argc, char **argv, const char *applet_opts, ...)
{
unsigned long flags = 0;
unsigned long requires = 0;
@ -324,7 +325,7 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...)
#define FREE_FIRST_ARGV_IS_OPT 8
int spec_flgs = 0;
va_start (p, applet_opts);
va_start(p, applet_opts);
c = 0;
on_off = complementally;
@ -332,15 +333,15 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...)
/* skip GNU extension */
s = (const unsigned char *)applet_opts;
if(*s == '+' || *s == '-')
if (*s == '+' || *s == '-')
s++;
for (; *s; s++) {
if(c >= (int)(sizeof(flags)*8))
if (c >= (int)(sizeof(flags)*8))
break;
on_off->opt = *s;
on_off->switch_on = (1 << c);
if (s[1] == ':') {
on_off->optarg = va_arg (p, void **);
on_off->optarg = va_arg(p, void **);
do
s++;
while (s[1] == ':');
@ -350,19 +351,19 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...)
}
#if ENABLE_GETOPT_LONG
for(l_o = bb_applet_long_options; l_o->name; l_o++) {
if(l_o->flag)
for (l_o = bb_applet_long_options; l_o->name; l_o++) {
if (l_o->flag)
continue;
for(on_off = complementally; on_off->opt != 0; on_off++)
if(on_off->opt == l_o->val)
for (on_off = complementally; on_off->opt != 0; on_off++)
if (on_off->opt == l_o->val)
break;
if(on_off->opt == 0) {
if(c >= (int)(sizeof(flags)*8))
if (on_off->opt == 0) {
if (c >= (int)(sizeof(flags)*8))
break;
on_off->opt = l_o->val;
on_off->switch_on = (1 << c);
if(l_o->has_arg != no_argument)
on_off->optarg = va_arg (p, void **);
if (l_o->has_arg != no_argument)
on_off->optarg = va_arg(p, void **);
c++;
}
}
@ -374,8 +375,8 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...)
if (*s == ':')
continue;
c = s[1];
if(*s == '?') {
if(c < '0' || c > '9') {
if (*s == '?') {
if (c < '0' || c > '9') {
spec_flgs |= SHOW_USAGE_IF_ERROR;
} else {
max_arg = c - '0';
@ -383,9 +384,9 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...)
}
continue;
}
if(*s == '-') {
if(c < '0' || c > '9') {
if(c == '-') {
if (*s == '-') {
if (c < '0' || c > '9') {
if (c == '-') {
spec_flgs |= FIRST_ARGV_IS_OPT;
s++;
} else
@ -399,99 +400,99 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...)
for (on_off = complementally; on_off->opt; on_off++)
if (on_off->opt == *s)
break;
if(c == ':' && s[2] == ':') {
if (c == ':' && s[2] == ':') {
on_off->list_flg++;
continue;
}
if(c == ':' || c == '\0') {
if (c == ':' || c == '\0') {
requires |= on_off->switch_on;
continue;
}
if(c == '-' && (s[2] == ':' || s[2] == '\0')) {
if (c == '-' && (s[2] == ':' || s[2] == '\0')) {
flags |= on_off->switch_on;
on_off->incongruously |= on_off->switch_on;
s++;
continue;
}
if(c == *s) {
on_off->counter = va_arg (p, int *);
if (c == *s) {
on_off->counter = va_arg(p, int *);
s++;
}
pair = on_off;
pair_switch = &(pair->switch_on);
for(s++; *s && *s != ':'; s++) {
if(*s == '?') {
for (s++; *s && *s != ':'; s++) {
if (*s == '?') {
pair_switch = &(pair->requires);
} else if (*s == '-') {
if(pair_switch == &(pair->switch_off))
if (pair_switch == &(pair->switch_off))
pair_switch = &(pair->incongruously);
else
pair_switch = &(pair->switch_off);
} else {
for (on_off = complementally; on_off->opt; on_off++)
if (on_off->opt == *s) {
*pair_switch |= on_off->switch_on;
break;
}
for (on_off = complementally; on_off->opt; on_off++)
if (on_off->opt == *s) {
*pair_switch |= on_off->switch_on;
break;
}
}
}
s--;
}
va_end (p);
#if defined(CONFIG_AR) || defined(CONFIG_TAR)
if((spec_flgs & FIRST_ARGV_IS_OPT)) {
if(argv[1] && argv[1][0] != '-' && argv[1][0] != '\0') {
#if ENABLE_AR || ENABLE_TAR
if (spec_flgs & FIRST_ARGV_IS_OPT) {
if (argv[1] && argv[1][0] != '-' && argv[1][0] != '\0') {
argv[1] = xasprintf("-%s", argv[1]);
if(ENABLE_FEATURE_CLEAN_UP)
if (ENABLE_FEATURE_CLEAN_UP)
spec_flgs |= FREE_FIRST_ARGV_IS_OPT;
}
}
#endif
#if ENABLE_GETOPT_LONG
while ((c = getopt_long (argc, argv, applet_opts,
while ((c = getopt_long(argc, argv, applet_opts,
bb_applet_long_options, NULL)) >= 0) {
#else
while ((c = getopt (argc, argv, applet_opts)) >= 0) {
while ((c = getopt(argc, argv, applet_opts)) >= 0) {
#endif /* ENABLE_GETOPT_LONG */
#ifdef CONFIG_PS
#if ENABLE_PS
loop_arg_is_opt:
#endif
for (on_off = complementally; on_off->opt != c; on_off++) {
/* c==0 if long opt have non NULL flag */
if(on_off->opt == 0 && c != 0)
bb_show_usage ();
if (on_off->opt == 0 && c != 0)
bb_show_usage();
}
if(flags & on_off->incongruously) {
if((spec_flgs & SHOW_USAGE_IF_ERROR))
bb_show_usage ();
if (flags & on_off->incongruously) {
if ((spec_flgs & SHOW_USAGE_IF_ERROR))
bb_show_usage();
flags |= BB_GETOPT_ERROR;
}
trigger = on_off->switch_on & on_off->switch_off;
flags &= ~(on_off->switch_off ^ trigger);
flags |= on_off->switch_on ^ trigger;
flags ^= trigger;
if(on_off->counter)
if (on_off->counter)
(*(on_off->counter))++;
if(on_off->list_flg) {
if (on_off->list_flg) {
llist_add_to((llist_t **)(on_off->optarg), optarg);
} else if (on_off->optarg) {
*(char **)(on_off->optarg) = optarg;
}
#ifdef CONFIG_PS
if(pargv != NULL)
#if ENABLE_PS
if (pargv != NULL)
break;
#endif
}
#ifdef CONFIG_PS
if((spec_flgs & ALL_ARGV_IS_OPTS)) {
#if ENABLE_PS
if (spec_flgs & ALL_ARGV_IS_OPTS) {
/* process argv is option, for example "ps" applet */
if(pargv == NULL)
if (pargv == NULL)
pargv = argv + optind;
while(*pargv) {
while (*pargv) {
c = **pargv;
if(c == '\0') {
if (c == '\0') {
pargv++;
} else {
(*pargv)++;
@ -501,21 +502,20 @@ loop_arg_is_opt:
}
#endif
#if (defined(CONFIG_AR) || defined(CONFIG_TAR)) && \
defined(CONFIG_FEATURE_CLEAN_UP)
if((spec_flgs & FREE_FIRST_ARGV_IS_OPT))
#if (ENABLE_AR || ENABLE_TAR) && ENABLE_FEATURE_CLEAN_UP
if (spec_flgs & FREE_FIRST_ARGV_IS_OPT)
free(argv[1]);
#endif
/* check depending requires for given options */
for (on_off = complementally; on_off->opt; on_off++) {
if(on_off->requires && (flags & on_off->switch_on) &&
if (on_off->requires && (flags & on_off->switch_on) &&
(flags & on_off->requires) == 0)
bb_show_usage ();
bb_show_usage();
}
if(requires && (flags & requires) == 0)
bb_show_usage ();
if (requires && (flags & requires) == 0)
bb_show_usage();
argc -= optind;
if(argc < min_arg || (max_arg >= 0 && argc > max_arg))
bb_show_usage ();
if (argc < min_arg || (max_arg >= 0 && argc > max_arg))
bb_show_usage();
return flags;
}