aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2006-11-25 13:34:51 -0500
committerRob Landley <rob@landley.net>2006-11-25 13:34:51 -0500
commit58c6c1be60d96df4b7cb8d77625948b0da297144 (patch)
treefecf653c1fefbc45e5ad534f4e77866122d8eaa1
parentf06af2bef5fe73c4ff50ed177fab244ed9db9182 (diff)
downloadtoybox-58c6c1be60d96df4b7cb8d77625948b0da297144.tar.gz
More work on option parsing. "df -t tmpfs" actually seems to work now.
-rw-r--r--lib/args.c20
-rw-r--r--toys/df.c9
-rw-r--r--toys/toylist.h2
3 files changed, 17 insertions, 14 deletions
diff --git a/lib/args.c b/lib/args.c
index 6a8162ac..a6a3b229 100644
--- a/lib/args.c
+++ b/lib/args.c
@@ -56,7 +56,7 @@ struct opts {
char c;
int type;
int shift;
- void *arg;
+ long *arg;
};
struct getoptflagstate
@@ -79,21 +79,21 @@ static void gotflag(void)
// 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;
@@ -107,6 +107,8 @@ static void gotflag(void)
gof.arg = "";
}
+
+ gof.this = NULL;
}
// Fill out toys.optflags and toys.optargs. This isn't reentrant because
@@ -180,8 +182,8 @@ void get_optflags(void)
} 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 == '~') {
diff --git a/toys/df.c b/toys/df.c
index 375aa0ab..3e8a9725 100644
--- a/toys/df.c
+++ b/toys/df.c
@@ -21,11 +21,12 @@ static void show_mt(struct mtab_list *mt)
// 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
diff --git a/toys/toylist.h b/toys/toylist.h
index a0eef1c1..ad749cd2 100644
--- a/toys/toylist.h
+++ b/toys/toylist.h
@@ -54,7 +54,7 @@ NEWTOY(toybox, NULL, 0)
// 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))