}
/* Returns 1 if argument consumed, 0 if all done, -1 on error. */
-int parse_one(int *argc, char *argv[], unsigned *offset,
+int parse_one(int *argc, char *argv[], enum opt_type is_early, unsigned *offset,
void (*errlog)(const char *fmt, ...))
{
unsigned i, arg, len;
const char *o, *optarg = NULL;
- char *problem;
+ char *problem = NULL;
if (getenv("POSIXLY_CORRECT")) {
/* Don't find options after non-options. */
len = 2;
}
- if (opt_table[i].type == OPT_NOARG) {
+ if ((opt_table[i].type & ~OPT_EARLY) == OPT_NOARG) {
if (optarg)
return parse_err(errlog, argv[0], o, len,
"doesn't allow an argument");
- problem = opt_table[i].cb(opt_table[i].u.arg);
+ if ((opt_table[i].type & OPT_EARLY) == is_early)
+ problem = opt_table[i].cb(opt_table[i].u.arg);
} else {
if (!optarg) {
/* Swallow any short options as optarg, eg -afile */
if (!optarg)
return parse_err(errlog, argv[0], o, len,
"requires an argument");
- problem = opt_table[i].cb_arg(optarg, opt_table[i].u.arg);
+ if ((opt_table[i].type & OPT_EARLY) == is_early)
+ problem = opt_table[i].cb_arg(optarg,
+ opt_table[i].u.arg);
}
if (problem) {