diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/args.c | 22 |
1 files changed, 11 insertions, 11 deletions
@@ -179,11 +179,9 @@ static int gotflag(struct getoptflagstate *gof) void parse_optflaglist(struct getoptflagstate *gof) { - char *options = toys.which->options, *plustildenot = "+~!", - *limits = "<>=", *flagbits="|^ "; + char *options = toys.which->options; long *nextarg = (long *)&this; struct opts *new = 0; - int i; // Parse option format string memset(gof, 0, sizeof(struct getoptflagstate)); @@ -207,6 +205,7 @@ void parse_optflaglist(struct getoptflagstate *gof) if (!*options) gof->stopearly++; while (*options) { char *temp; + int idx; // Allocate a new list entry when necessary if (!new) { @@ -245,9 +244,9 @@ void parse_optflaglist(struct getoptflagstate *gof) if (CFG_TOYBOX_DEBUG && new->type) error_exit("multiple types %c:%c%c", new->c, new->type, *options); new->type = *options; - } else if (0 != (temp = strchr(plustildenot, *options))) { - int idx = temp - plustildenot; + } else if (-1 != (idx = stridx("+~!", *options))) { struct opts *opt; + int i; if (!*++options && CFG_TOYBOX_DEBUG) error_exit("+~! no target"); @@ -260,17 +259,16 @@ void parse_optflaglist(struct getoptflagstate *gof) } new->edx[idx] |= 1<<i; } else if (*options == '[') { // TODO - } else if (0 != (temp = strchr(flagbits, *options))) - new->flags |= 1<<(temp-flagbits); + } else if (-1 != (idx = stridx("|^ ", *options))) + new->flags |= 1<<idx; // bounds checking - else if (0 != (temp = strchr(limits, *options))) { - i = temp - limits; + else if (-1 != (idx = stridx("<>=", *options))) { if (new->type == '#') { long l = strtol(++options, &temp, 10); - if (temp != options) new->val[i].l = l; + if (temp != options) new->val[idx].l = l; } else if (CFG_TOYBOX_FLOAT && new->type == '.') { FLOAT f = strtod(++options, &temp); - if (temp != options) new->val[i].f = f; + if (temp != options) new->val[idx].f = f; } else if (CFG_TOYBOX_DEBUG) error_exit("<>= only after .#"); options = --temp; } @@ -295,6 +293,8 @@ void parse_optflaglist(struct getoptflagstate *gof) // because we reverse direction: last entry created gets first global slot.) int pos = 0; for (new = gof->opts; new; new = new->next) { + int i; + for (i=0;i<3;i++) new->edx[i] <<= pos; pos++; if (new->type) { |