*
* Copyright (C) 2003-2005 Vladimir Oleynik <dzo@simtreas.ru>
*
- * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
*/
#include <getopt.h>
This struct allows you to define long options:
static const char applet_longopts[] ALIGN1 =
- //"name\0" has_arg val
- "verbose\0" No_argument "v"
- ;
+ //"name\0" has_arg val
+ "verbose\0" No_argument "v"
+ ;
applet_long_options = applet_longopts;
The last member of struct option (val) typically is set to
found.
"ww" Adjacent double options have a counter associated which indicates
- the number of occurences of the option.
+ the number of occurrences of the option.
For example the ps applet needs:
if w is given once, GNU ps sets the width to 132,
if w is given more than once, it is "unlimited"
Special characters:
- "-" A dash as the first char in a opt_complementary group forces
- all arguments to be treated as options, even if they have
- no leading dashes. Next char in this case can't be a digit (0-9),
- use ':' or end of line. For example:
+ "-" A group consisting of just a dash forces all arguments
+ to be treated as options, even if they have no leading dashes.
+ Next char in this case can't be a digit (0-9), use ':' or end of line.
+ Example:
- opt_complementary = "-:w-x:x-w";
- getopt32(argv, "wx");
+ opt_complementary = "-:w-x:x-w"; // "-w-x:x-w" would also work,
+ getopt32(argv, "wx"); // but is less readable
- Allows any arguments to be given without a dash (./program w x)
+ This makes it possible to use options without a dash (./program w x)
as well as with a dash (./program -x).
NB: getopt32() will leak a small amount of memory if you use
if specified together. In this case you must set
opt_complementary = "b--cf:c--bf:f--bc". If two of the
mutually exclusive options are found, getopt32 will call
- bb_show_usage() and die.
+ bb_show_usage() and die.
"x--x" Variation of the above, it means that -x option should occur
at most once.
"a+" A plus after a char in opt_complementary means that the parameter
for this option is a nonnegative integer. It will be processed
- with xatoi_u() - allowed range is 0..INT_MAX.
+ with xatoi_positive() - allowed range is 0..INT_MAX.
int param; // "unsigned param;" will also work
opt_complementary = "p+";
c++;
next_long: ;
}
+ /* Make it unnecessary to clear applet_long_options
+ * by hand after each call to getopt32
+ */
+ applet_long_options = NULL;
}
#endif /* ENABLE_LONG_OPTS || ENABLE_FEATURE_GETOPT_LONG */
for (s = (const unsigned char *)opt_complementary; s && *s; s++) {
s++;
}
pair = on_off;
- pair_switch = &(pair->switch_on);
+ pair_switch = &pair->switch_on;
for (s++; *s && *s != ':'; s++) {
if (*s == '?') {
- pair_switch = &(pair->requires);
+ pair_switch = &pair->requires;
} else if (*s == '-') {
- if (pair_switch == &(pair->switch_off))
- pair_switch = &(pair->incongruously);
+ if (pair_switch == &pair->switch_off)
+ pair_switch = &pair->incongruously;
else
- pair_switch = &(pair->switch_off);
+ pair_switch = &pair->switch_off;
} else {
for (on_off = complementary; on_off->opt_char; on_off++)
if (on_off->opt_char == *s) {
}
s--;
}
+ opt_complementary = NULL;
va_end(p);
if (spec_flgs & (FIRST_ARGV_IS_OPT | ALL_ARGV_IS_OPTS)) {
/* In case getopt32 was already called:
* reset the libc getopt() function, which keeps internal state.
- * run_nofork_applet_prime() does this, but we might end up here
+ * run_nofork_applet() does this, but we might end up here
* also via gunzip_main() -> gzip_main(). Play safe.
*/
#ifdef __GLIBC__
llist_add_to_end((llist_t **)(on_off->optarg), optarg);
} else if (on_off->param_type == PARAM_INT) {
if (optarg)
-//TODO: xatoi_u indirectly pulls in printf machinery
- *(unsigned*)(on_off->optarg) = xatoi_u(optarg);
+//TODO: xatoi_positive indirectly pulls in printf machinery
+ *(unsigned*)(on_off->optarg) = xatoi_positive(optarg);
} else if (on_off->optarg) {
if (optarg)
*(char **)(on_off->optarg) = optarg;