hush: teach getopts to set/unset OPTARG
No binary (build failed)
—
(log yok)
| @@ -0,0 +1,18 @@ | |
| + | *** no OPTIND, optstring:'w:et' args:-q -w e -r -t -y |
| + | Illegal option -q |
| + | var:'?' OPTIND:2 OPTARG:'' |
| + | var:'w' OPTIND:4 OPTARG:'e' |
| + | Illegal option -r |
| + | var:'?' OPTIND:5 OPTARG:'' |
| + | var:'t' OPTIND:6 OPTARG:'' |
| + | Illegal option -y |
| + | var:'?' OPTIND:7 OPTARG:'' |
| + | exited: var:'?' OPTIND:7 OPTARG:'' |
| + | *** OPTIND=0, optstring:'w:et' args:-w 1 -w2 -w -e -e -t -t |
| + | var:'w' OPTIND:3 OPTARG:'1' |
| + | var:'w' OPTIND:4 OPTARG:'2' |
| + | var:'w' OPTIND:6 OPTARG:'-e' |
| + | var:'e' OPTIND:7 OPTARG:'' |
| + | var:'t' OPTIND:8 OPTARG:'' |
| + | var:'t' OPTIND:9 OPTARG:'' |
| + | exited: var:'?' OPTIND:9 OPTARG:'' |
| @@ -0,0 +1,16 @@ | |
| + | set -- -q -w e -r -t -y |
| + | echo "*** no OPTIND, optstring:'w:et' args:$*" |
| + | var=QWERTY |
| + | OPTARG=ASDFGH |
| + | while getopts "w:et" var; do |
| + | echo "var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'" |
| + | done |
| + | echo "exited: var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'" |
| + | |
| + | set -- -w 1 -w2 -w -e -e -t -t |
| + | echo "*** OPTIND=0, optstring:'w:et' args:$*" |
| + | OPTIND=0 |
| + | while getopts "w:et" var; do |
| + | echo "var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'" |
| + | done |
| + | echo "exited: var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'" |
| @@ -9874,11 +9874,6 @@ static int FAST_FUNC builtin_getopts(char **argv) | |
| { | |
| /* | |
| TODO: | |
| - | if a character is followed by a colon, the option is expected to have |
| - | an argument, which should be separated from it by white space. |
| - | When an option requires an argument, getopts places that argument into |
| - | the variable OPTARG. |
| - | |
| If an invalid option is seen, getopts places ? into VAR and, if | |
| not silent, prints an error message and unsets OPTARG. If | |
| getopts is silent, the option character found is placed in | |
| @@ -9906,6 +9901,7 @@ Test that VAR is a valid variable name? | |
| opterr = cp ? atoi(cp) : 1; | |
| cp = get_local_var_value("OPTIND"); | |
| optind = cp ? atoi(cp) : 0; | |
| + | optarg = NULL; |
| /* getopts stops on first non-option. Add "+" to force that */ | |
| /*if (optstring[0] != '+')*/ { | |
| @@ -9924,6 +9920,10 @@ Test that VAR is a valid variable name? | |
| exitcode = EXIT_FAILURE; | |
| c = '?'; | |
| } | |
| + | if (optarg) |
| + | set_local_var_from_halves("OPTARG", optarg); |
| + | else |
| + | unset_local_var("OPTARG"); |
| cbuf[0] = c; | |
| cbuf[1] = '\0'; | |
| set_local_var_from_halves(var, cbuf); | |
| @@ -0,0 +1,18 @@ | |
| + | *** no OPTIND, optstring:'w:et' args:-q -w e -r -t -y |
| + | ./getopt_optarg.tests: invalid option -- q |
| + | var:'?' OPTIND:2 OPTARG:'' |
| + | var:'w' OPTIND:4 OPTARG:'e' |
| + | ./getopt_optarg.tests: invalid option -- r |
| + | var:'?' OPTIND:5 OPTARG:'' |
| + | var:'t' OPTIND:6 OPTARG:'' |
| + | ./getopt_optarg.tests: invalid option -- y |
| + | var:'?' OPTIND:7 OPTARG:'' |
| + | exited: var:'?' OPTIND:7 OPTARG:'' |
| + | *** OPTIND=0, optstring:'w:et' args:-w 1 -w2 -w -e -e -t -t |
| + | var:'w' OPTIND:3 OPTARG:'1' |
| + | var:'w' OPTIND:4 OPTARG:'2' |
| + | var:'w' OPTIND:6 OPTARG:'-e' |
| + | var:'e' OPTIND:7 OPTARG:'' |
| + | var:'t' OPTIND:8 OPTARG:'' |
| + | var:'t' OPTIND:9 OPTARG:'' |
| + | exited: var:'?' OPTIND:9 OPTARG:'' |
| @@ -0,0 +1,16 @@ | |
| + | set -- -q -w e -r -t -y |
| + | echo "*** no OPTIND, optstring:'w:et' args:$*" |
| + | var=QWERTY |
| + | OPTARG=ASDFGH |
| + | while getopts "w:et" var; do |
| + | echo "var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'" |
| + | done |
| + | echo "exited: var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'" |
| + | |
| + | set -- -w 1 -w2 -w -e -e -t -t |
| + | echo "*** OPTIND=0, optstring:'w:et' args:$*" |
| + | OPTIND=0 |
| + | while getopts "w:et" var; do |
| + | echo "var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'" |
| + | done |
| + | echo "exited: var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'" |
| @@ -4,5 +4,4 @@ var=QWERTY | |
| while getopts "we" var; do | |
| echo "var:'$var' OPTIND:$OPTIND" | |
| done | |
| - | # unfortunately, "rc:0" is shown since while's overall exitcode is "success" |
| echo "exited: var:'$var' OPTIND:$OPTIND" | |