Skip to content

Commit

Permalink
Teach lib/args.c that " " this option must take a _separate_ argument…
Browse files Browse the repository at this point in the history
…, so "kill -stop" and "kill -s top" aren't the same thing. Make kill.c use it, and remove leftover debug printfs.
  • Loading branch information
landley committed Feb 26, 2012
1 parent 2dd50ad commit b081ce9
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 8 deletions.
14 changes: 9 additions & 5 deletions lib/args.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@
// Same <LOW>HIGH=DEFAULT as #
// @ plus an occurrence counter (which is a long)
// (longopt)
// | this is required. If more than one marked, only one required.
// | this is required. If more than one marked, only one required. TODO
// ^ Stop parsing after encountering this argument
// " " (space char) the "plus an argument" must be separate
// I.E. "-j 3" not "-j3". So "kill -stop" != "kill -s top"
//
// These modify other option letters (previously seen in string):
// +X enabling this enables X (switch on)
Expand Down Expand Up @@ -175,7 +177,8 @@ static int gotflag(struct getoptflagstate *gof)

void parse_optflaglist(struct getoptflagstate *gof)
{
char *options = toys.which->options, *plustildenot = "+~!", *limits = "<>=";
char *options = toys.which->options, *plustildenot = "+~!",
*limits = "<>=", *flagbits="|^ ";
long *nextarg = (long *)&this;
struct opts *new = 0;
int i;
Expand Down Expand Up @@ -255,8 +258,8 @@ void parse_optflaglist(struct getoptflagstate *gof)
}
new->edx[idx] |= 1<<i;
} else if (*options == '[') { // TODO
} else if (*options == '|') new->flags |= 1;
else if (*options == '^') new->flags |= 2;
} else if (0 != (temp = strchr(flagbits, *options)))
new->flags |= 1<<(temp-flagbits);
// bounds checking
else if (0 != (temp = strchr(limits, *options))) {
i = temp - limits;
Expand Down Expand Up @@ -382,7 +385,8 @@ void get_optflags(void)

// Identify next option char.
for (gof.this = gof.opts; gof.this; gof.this = gof.this->next)
if (*gof.arg == gof.this->c) break;
if (*gof.arg == gof.this->c)
if (!((gof.this->flags&4) && gof.arg[1])) break;

// Handle option char (advancing past what was used)
if (gotflag(&gof) ) {
Expand Down
4 changes: 1 addition & 3 deletions toys/kill.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*
* See http://opengroup.org/onlinepubs/9699919799/utilities/kill.html
USE_KILL(NEWTOY(kill, "?s:l", TOYFLAG_BIN))
USE_KILL(NEWTOY(kill, "?s: l", TOYFLAG_BIN))
config KILL
bool "kill"
Expand Down Expand Up @@ -45,10 +45,8 @@ void kill_main(void)
}

// signal must come before pids, so "kill -9 -1" isn't confusing.
printf("*args=%s\n", *args);

if (!TT.signame && *args && **args=='-') TT.signame=*(args++)+1;
printf("TT.signame=%s\n", TT.signame);
if (TT.signame) {
char *arg;
int i = strtol(TT.signame, &arg, 10);
Expand Down

0 comments on commit b081ce9

Please sign in to comment.