From 58c6c1be60d96df4b7cb8d77625948b0da297144 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sat, 25 Nov 2006 13:34:51 -0500 Subject: More work on option parsing. "df -t tmpfs" actually seems to work now. --- lib/args.c | 20 +++++++++++--------- toys/df.c | 9 +++++---- toys/toylist.h | 2 +- 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)) -- cgit v1.2.3