home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CyberMycha 2006 April
/
SGP.iso
/
dema
/
Keepsake-Demo-en-li-v1.0.exe
/
res
/
bin
/
prime
/
cmdinterp.tcl
next >
Wrap
Text File
|
2005-10-29
|
4KB
|
122 lines
class cmdinterp {
proc cmdinterp { this cmdline optline } {
set ($this,opts) ""
set ($this,args) ""
set cmdlength [llength $cmdline]
set optbool ""
foreach o $optline {
if { [llength $o] == 1 } {
set optname $o
set optvalue 0
append optbool "$optname "
} else {
set optname [lindex $o 0]
set optvalue [lindex $o 1]
for {set i 0} {$i < [llength $optvalue]} {incr i} {
set optarray($optname.$i) [lindex $optvalue $i]
}
}
set optarray($optname) $optvalue
set optarray($optname?) "0"
}
set argi 0
set maxi 0
set opti 0
set optname ""
for { set i 0 } { $i < $cmdlength } { incr i } {
set match ""
set cmd [lindex $cmdline $i]
regexp -- {^-(.*)} $cmd -> match
if { $match != "" } {
if { [expr $argi-$opti] <= 0 } {
set argi 0
set opti 0
set maxi 0
}
}
if { $argi > 0 } {
incr argi -1
append optarray($optname) "$cmd "
set optarray($optname.[expr $maxi-$argi-1]) $cmd
continue
}
if { $match != "" } {
if { $optname != "" } {
set optarray($optname) [string trim $optarray($optname)]
}
set optname $match
if { [array names optarray $optname] == "" } {
set optarray($optname) "*"
}
if { [string match "*$match *" $optbool] } {
set optarray($optname) 1
set optarray($optname?) 1
} else {
set argi [llength $optarray($optname)]
if {$optarray($optname) == "*"} {
set argi 999999999
set opti 999999999
}
set optarray($optname) ""
set optarray($optname?) "1"
if { !$argi } { set argi 1 }
set maxi $argi
}
continue
}
append ($this,args) "$cmd "
}
if { [expr $argi-$opti] > 0 } {
error "option -$optname miss [expr $argi] arguments."
return
}
if { $optname != "" } {
set optarray($optname) [string trim $optarray($optname)]
}
set ($this,opts) [array get optarray]
set ($this,args) [string trim $($this,args)]
}
proc ~cmdinterp { this } {}
proc getopts { this } {
return $($this,opts)
}
proc getargs { this } {
return $($this,args)
}
}
namespace eval cmdline {
proc getopt {argvVar optstring} {
set i [new cmdinterp $argvVar $optstring]
set r [cmdinterp::getopts $i]
delete $i
return $r
}
proc getarg {argvVar optstring} {
set i [new cmdinterp $argvVar $optstring]
set r [cmdinterp::getargs $i]
delete $i
return $r
}
}