+
+namespace eval args {
+
+proc badusage {msg} {
+ puts stderr "bad usage: $msg"
+ exit 12
+}
+
+proc badoption {msg} {
+ variable lastarg
+ badusage "unknown option $msg"
+}
+
+proc next {} {
+ global argv
+ variable lastarg
+ if {![llength $argv]} { badusage "$lastarg needs a value" }
+ set arg [lindex $argv 0]
+ set argv [lrange $argv 1 end]
+ set lastarg $arg
+}
+
+proc next_num {} {
+ set arg [next]
+ variable lastarg
+ if {[catch { eval {$arg + 0} } emsg]} {
+ badusage "$lastargv value must be a number ($emsg)"
+ }
+}
+
+set w 50
+set h 50
+set orientation horizontal
+set bc darkblue
+set bw 1
+
+proc generalarg {} {
+ switch -exact $arg {
+ -width { set w [next_num] }
+ -height { set h [next_num] }
+ -horizontal - -vertical { set orientation $arg }
+ -borderColour - -borderColor { set bc [next] }
+ -borderWidth { set bw [next_num] }
+ default { return 0 }
+ }
+ return 1
+}
+
+proc more {} {
+ global argv
+ if {![llength $argv]} { return 0 }
+ if {![regexp {^-} [lindex $argv 0]]} { return 0 }
+ return 1
+}
+
+proc next_special {va} {
+ upvar 1 $va arg
+ global argv
+ while {[more]} {
+ set arg [next]
+ if {[generalarg $arg]} continue
+ return 1
+ }
+ return 0
+}
+
+}