commit 5b9fbd58a16f02d98dbc6f0b4be7af12aa186cae from: Sven M. Hallberg date: Sun May 25 08:14:33 2025 UTC more getopt improvements Set arg variable to 1 for boolean flags. commit - 19d28f97177c183d78bbce4642857db2ea27541f commit + 5b9fbd58a16f02d98dbc6f0b4be7af12aa186cae blob - fcbd49da45d37f494b7475ce90749039c3ab4052 blob + 00195068734320ee5a9de3ef41853d0015f9adb1 --- exercise +++ exercise @@ -268,19 +268,19 @@ proc getopt {argvvar optstring optvar argvar} { upvar $argvvar argv $optvar opt $argvar arg set arg [lindex $argv 0] ;# "" if argv empty - set opt [string index $arg 1] ;# "" if arg empty + set opt [string index $arg 1] ;# "" if arg empty or length 1 if {$opt eq "" || [string index $arg 0] ne "-"} { return 0 ;# no option } set argv [lreplace $argv 0 0] ;# tentative consumption if {$arg eq "--"} { - return 0 ;# end of options + return 0 ;# terminate option processing } # consume option character - set arg [string replace $arg 1 1] - if {$arg ne "-"} { ;# not yet exhausted? - set argv [linsert $argv 0 $arg] ;# put it back for now + set arg [string replace $arg 0 1] ;# cut off the dash, too + if {$arg ne ""} { ;# not yet exhausted? + set argv [linsert $argv 0 -$arg] ;# put it back for now } # check if option is valid @@ -288,20 +288,21 @@ proc getopt {argvvar optstring optvar argvar} { if {$idx == -1 || $opt eq ":"} { puts stderr "[file tail $::argv0]: unknown option -$opt" set opt "?" - return 1 ;# could come back for more + return 1 ;# can call again for more } # handle option arguments - if {[string index $optstring [expr $idx + 1]] eq ":"} { - if {$arg ne "-"} { - set arg [string range $arg 1 end] ;# use the rest of arg - } elseif {[llength $argv] > 0} { - set arg [lindex $argv 0] ;# use the next arg - } else { - puts stderr "[file tail $::argv0]: -$opt requires an argument" - set opt [expr {[string index $optstring 0] eq ":" ? ":" : "?"}] + if {[string index $optstring [incr idx]] eq ":"} { + if {$arg eq ""} { + if {[llength $argv] == 0} { + puts stderr "[file tail $::argv0]: -$opt requires an argument" + set opt [expr {[string index $optstring 0] eq ":" ? ":" : "?"}] + } + set arg [lindex $argv 0] ;# use next arg, no-op if empty } - set argv [lreplace $argv 0 0] ;# consume arg + set argv [lreplace $argv 0 0] ;# consume arg, no-op if empty + } else { + set arg 1 ;# boolean flag } return 1