char c;
int type;
int shift;
- void *arg;
+ long *arg;
};
struct getoptflagstate
// Does this option take an argument?
gof.arg++;
- if (gof.this->type & 255) {
- // Make "tar xCjfv blah1 blah2 thingy" work like
+ type = gof.this->type & 255;
+ if (type) {
+
+ // Handle "-xblah" and "-x blah", but also a third case: "abxc blah"
+ // to make "tar xCjfv blah1 blah2 thingy" work like
// "tar -x -C blah1 -j -f blah2 -v thingy"
if (!gof.nodash_now && !*gof.arg) {
gof.arg = toys.argv[++gof.argc];
if (!gof.arg) error_exit("Missing argument");
}
- } else gof.this = NULL;
- // If the last option had an argument, grab it.
- if (gof.this) {
- type = gof.this->type & 255;
+ // Grab argument.
if (!gof.arg && !(gof.arg = toys.argv[++gof.argc]))
error_exit("Missing argument");
- if (type == ':') gof.this->arg = gof.arg;
+ if (type == ':') *(gof.this->arg) = (long)gof.arg;
else if (type == '*') {
struct arg_list *temp, **list;
list = (struct arg_list **)gof.this->arg;
gof.arg = "";
}
+
+ gof.this = NULL;
}
// Fill out toys.optflags and toys.optargs. This isn't reentrant because
} else if (index(":*?@", *options)) {
gof.this->type |= *options;
// Pointer and long guaranteed to be the same size by LP64.
- *(++nextarg) = 0;
gof.this->arg = (void *)nextarg;
+ *(nextarg++) = 0;
} else if (*options == '|') {
} else if (*options == '+') {
} else if (*options == '~') {
// If we have -t, skip other filesystem types
if (toy.df.fstype) {
- struct string_list *sl;
+ struct arg_list *al;
- for (sl = toy.df.fstype; sl; sl = sl->next)
- if (!strcmp(mt->type, sl->str)) break;
- if (!sl) return;
+ for (al = toy.df.fstype; al; al = al->next) {
+ if (!strcmp(mt->type, al->arg)) break;
+ }
+ if (!al) return;
}
// If we don't have -a, skip synthetic filesystems
// The rest of these are alphabetical, for binary search.
USE_TOYSH(NEWTOY(cd, NULL, TOYFLAG_NOFORK))
-USE_DF(NEWTOY(df, "Pkt:a", TOYFLAG_USR|TOYFLAG_SBIN))
+USE_DF(NEWTOY(df, "Pkt*a", TOYFLAG_USR|TOYFLAG_SBIN))
USE_TOYSH(NEWTOY(exit, NULL, TOYFLAG_NOFORK))
USE_HELLO(NEWTOY(hello, NULL, TOYFLAG_NOFORK|TOYFLAG_USR))
USE_PWD(NEWTOY(pwd, NULL, TOYFLAG_BIN))