diff options
Diffstat (limited to 'library/opt/optparse.tcl')
-rw-r--r-- | library/opt/optparse.tcl | 474 |
1 files changed, 237 insertions, 237 deletions
diff --git a/library/opt/optparse.tcl b/library/opt/optparse.tcl index fc77fa1..c9438a0 100644 --- a/library/opt/optparse.tcl +++ b/library/opt/optparse.tcl @@ -11,7 +11,7 @@ package require Tcl 8.2 # When this version number changes, update the pkgIndex.tcl file # and the install directory in the Makefiles. -package provide opt 0.4.6 +package provide opt 0.4.5 namespace eval ::tcl { @@ -33,7 +33,7 @@ namespace eval ::tcl { # Every OptProc give usage information on "procname -help". # Try "tcl::OptParseTest -help" and "tcl::OptParseTest -a" and # then other arguments. - # + # # example of 'valid' call: # ::tcl::OptParseTest save -4 -pr 23 -libsok SybTcl\ # -nostatics false ch1 @@ -69,10 +69,10 @@ namespace eval ::tcl { ################### No User serviceable part below ! ############### # Array storing the parsed descriptions - variable OptDesc - array set OptDesc {} + variable OptDesc; + array set OptDesc {}; # Next potentially free key id (numeric) - variable OptDescN 0 + variable OptDescN 0; # Inside algorithm/mechanism description: # (not for the faint hearted ;-) @@ -84,8 +84,8 @@ namespace eval ::tcl { # # The general structure of a "program" is # notation (pseudo bnf like) -# name :== definition defines "name" as being "definition" -# { x y z } means list of x, y, and z +# name :== definition defines "name" as being "definition" +# { x y z } means list of x, y, and z # x* means x repeated 0 or more time # x+ means "x x*" # x? means optionally x @@ -110,7 +110,7 @@ namespace eval ::tcl { # # And for this application: # -# singleStep :== { instruction varname {hasBeenSet currentValue} type +# singleStep :== { instruction varname {hasBeenSet currentValue} type # typeArgs help } # instruction :== "flags" | "value" # type :== knowType | anyword @@ -143,54 +143,54 @@ namespace eval ::tcl { # generate a unused keyid if not given # proc ::tcl::OptKeyRegister {desc {key ""}} { - variable OptDesc - variable OptDescN + variable OptDesc; + variable OptDescN; if {[string equal $key ""]} { # in case a key given to us as a parameter was a number while {[info exists OptDesc($OptDescN)]} {incr OptDescN} - set key $OptDescN - incr OptDescN + set key $OptDescN; + incr OptDescN; } # program counter - set program [list [list "P" 1]] + set program [list [list "P" 1]]; # are we processing flags (which makes a single program step) - set inflags 0 + set inflags 0; - set state {} + set state {}; # flag used to detect that we just have a single (flags set) subprogram. - set empty 1 + set empty 1; foreach item $desc { if {$state == "args"} { # more items after 'args'... - return -code error "'args' special argument must be the last one" + return -code error "'args' special argument must be the last one"; } - set res [OptNormalizeOne $item] - set state [lindex $res 0] + set res [OptNormalizeOne $item]; + set state [lindex $res 0]; if {$inflags} { if {$state == "flags"} { # add to 'subprogram' - lappend flagsprg $res + lappend flagsprg $res; } else { # put in the flags # structure for flag programs items is a list of # {subprgcounter {prg flag 1} {prg flag 2} {...}} - lappend program $flagsprg + lappend program $flagsprg; # put the other regular stuff - lappend program $res - set inflags 0 - set empty 0 + lappend program $res; + set inflags 0; + set empty 0; } } else { if {$state == "flags"} { - set inflags 1 + set inflags 1; # sub program counter + first sub program - set flagsprg [list [list "P" 1] $res] + set flagsprg [list [list "P" 1] $res]; } else { - lappend program $res - set empty 0 + lappend program $res; + set empty 0; } } } @@ -198,32 +198,32 @@ proc ::tcl::OptKeyRegister {desc {key ""}} { if {$empty} { # We just have the subprogram, optimize and remove # unneeded level: - set program $flagsprg + set program $flagsprg; } else { - lappend program $flagsprg + lappend program $flagsprg; } } - set OptDesc($key) $program + set OptDesc($key) $program; - return $key + return $key; } # # Free the storage for that given key # proc ::tcl::OptKeyDelete {key} { - variable OptDesc - unset OptDesc($key) + variable OptDesc; + unset OptDesc($key); } # Get the parsed description stored under the given key. proc OptKeyGetDesc {descKey} { - variable OptDesc + variable OptDesc; if {![info exists OptDesc($descKey)]} { - return -code error "Unknown option description key \"$descKey\"" + return -code error "Unknown option description key \"$descKey\""; } - set OptDesc($descKey) + set OptDesc($descKey); } # Parse entry point for ppl who don't want to register with a key, @@ -232,10 +232,10 @@ proc ::tcl::OptKeyDelete {key} { # as it is way faster or simply OptProc which does it all) # Assign a temporary key, call OptKeyParse and then free the storage proc ::tcl::OptParse {desc arglist} { - set tempkey [OptKeyRegister $desc] - set ret [catch {uplevel 1 [list ::tcl::OptKeyParse $tempkey $arglist]} res] - OptKeyDelete $tempkey - return -code $ret $res + set tempkey [OptKeyRegister $desc]; + set ret [catch {uplevel 1 [list ::tcl::OptKeyParse $tempkey $arglist]} res]; + OptKeyDelete $tempkey; + return -code $ret $res; } # Helper function, replacement for proc that both @@ -246,22 +246,22 @@ proc ::tcl::OptParse {desc arglist} { # (the other will be sets to their default value) # into local variable named "Args". proc ::tcl::OptProc {name desc body} { - set namespace [uplevel 1 [list ::namespace current]] + set namespace [uplevel 1 [list ::namespace current]]; if {[string match "::*" $name] || [string equal $namespace "::"]} { # absolute name or global namespace, name is the key - set key $name + set key $name; } else { # we are relative to some non top level namespace: - set key "${namespace}::${name}" + set key "${namespace}::${name}"; } - OptKeyRegister $desc $key - uplevel 1 [list ::proc $name args "set Args \[::tcl::OptKeyParse $key \$args\]\n$body"] - return $key + OptKeyRegister $desc $key; + uplevel 1 [list ::proc $name args "set Args \[::tcl::OptKeyParse $key \$args\]\n$body"]; + return $key; } # Check that a argument has been given # assumes that "OptProc" has been used as it will check in "Args" list proc ::tcl::OptProcArgGiven {argname} { - upvar Args alist + upvar Args alist; expr {[lsearch $alist $argname] >=0} } @@ -270,7 +270,7 @@ proc ::tcl::OptProcArgGiven {argname} { # Return the instruction word/list of a given step/(sub)program proc OptInstr {lst} { - lindex $lst 0 + lindex $lst 0; } # Is a (sub) program or a plain instruction ? proc OptIsPrg {lst} { @@ -286,56 +286,56 @@ proc ::tcl::OptProcArgGiven {argname} { } # Current program counter (2nd word of first word) proc OptSetPrgCounter {lstName newValue} { - upvar $lstName lst - set lst [lreplace $lst 0 0 [concat "P" $newValue]] + upvar $lstName lst; + set lst [lreplace $lst 0 0 [concat "P" $newValue]]; } # returns a list of currently selected items. proc OptSelection {lst} { - set res {} + set res {}; foreach idx [lrange [lindex $lst 0] 1 end] { - lappend res [Lget $lst $idx] + lappend res [Lget $lst $idx]; } - return $res + return $res; } # Advance to next description proc OptNextDesc {descName} { - uplevel 1 [list Lvarincr $descName {0 1}] + uplevel 1 [list Lvarincr $descName {0 1}]; } # Get the current description, eventually descend proc OptCurDesc {descriptions} { - lindex $descriptions [OptGetPrgCounter $descriptions] + lindex $descriptions [OptGetPrgCounter $descriptions]; } # get the current description, eventually descend # through sub programs as needed. proc OptCurDescFinal {descriptions} { - set item [OptCurDesc $descriptions] + set item [OptCurDesc $descriptions]; # Descend untill we get the actual item and not a sub program while {[OptIsPrg $item]} { - set item [OptCurDesc $item] + set item [OptCurDesc $item]; } - return $item + return $item; } # Current final instruction adress proc OptCurAddr {descriptions {start {}}} { - set adress [OptGetPrgCounter $descriptions] - lappend start $adress - set item [lindex $descriptions $adress] + set adress [OptGetPrgCounter $descriptions]; + lappend start $adress; + set item [lindex $descriptions $adress]; if {[OptIsPrg $item]} { - return [OptCurAddr $item $start] + return [OptCurAddr $item $start]; } else { - return $start + return $start; } } # Set the value field of the current instruction proc OptCurSetValue {descriptionsName value} { upvar $descriptionsName descriptions # get the current item full adress - set adress [OptCurAddr $descriptions] + set adress [OptCurAddr $descriptions]; # use the 3th field of the item (see OptValue / OptNewInst) lappend adress 2 - Lvarset descriptions $adress [list 1 $value] + Lvarset descriptions $adress [list 1 $value]; # ^hasBeenSet flag } @@ -343,10 +343,10 @@ proc ::tcl::OptProcArgGiven {argname} { proc OptState {item} { lindex $item 0 } - + # current state proc OptCurState {descriptions} { - OptState [OptCurDesc $descriptions] + OptState [OptCurDesc $descriptions]; } ####### @@ -354,11 +354,11 @@ proc ::tcl::OptProcArgGiven {argname} { # Returns the argument that has to be processed now proc OptCurrentArg {lst} { - lindex $lst 0 + lindex $lst 0; } # Advance to next argument proc OptNextArg {argsName} { - uplevel 1 [list Lvarpop1 $argsName] + uplevel 1 [list Lvarpop1 $argsName]; } ####### @@ -370,49 +370,49 @@ proc ::tcl::OptProcArgGiven {argname} { # eventually eat all the arguments. proc OptDoAll {descriptionsName argumentsName} { upvar $descriptionsName descriptions - upvar $argumentsName arguments -# puts "entered DoAll" + upvar $argumentsName arguments; +# puts "entered DoAll"; # Nb: the places where "state" can be set are tricky to figure # because DoOne sets the state to flagsValue and return -continue # when needed... - set state [OptCurState $descriptions] + set state [OptCurState $descriptions]; # We'll exit the loop in "OptDoOne" or when state is empty. while 1 { - set curitem [OptCurDesc $descriptions] + set curitem [OptCurDesc $descriptions]; # Do subprograms if needed, call ourselves on the sub branch while {[OptIsPrg $curitem]} { OptDoAll curitem arguments -# puts "done DoAll sub" - # Insert back the results in current tree +# puts "done DoAll sub"; + # Insert back the results in current tree; Lvarset1nc descriptions [OptGetPrgCounter $descriptions]\ - $curitem - OptNextDesc descriptions - set curitem [OptCurDesc $descriptions] - set state [OptCurState $descriptions] + $curitem; + OptNextDesc descriptions; + set curitem [OptCurDesc $descriptions]; + set state [OptCurState $descriptions]; } -# puts "state = \"$state\" - arguments=($arguments)" +# puts "state = \"$state\" - arguments=($arguments)"; if {[Lempty $state]} { # Nothing left to do, we are done in this branch: - break + break; } # The following statement can make us terminate/continue # as it use return -code {break, continue, return and error} # codes - OptDoOne descriptions state arguments + OptDoOne descriptions state arguments; # If we are here, no special return code where issued, # we'll step to next instruction : -# puts "new state = \"$state\"" - OptNextDesc descriptions - set state [OptCurState $descriptions] +# puts "new state = \"$state\""; + OptNextDesc descriptions; + set state [OptCurState $descriptions]; } } # Process one step for the state machine, # eventually consuming the current argument. proc OptDoOne {descriptionsName stateName argumentsName} { - upvar $argumentsName arguments - upvar $descriptionsName descriptions - upvar $stateName state + upvar $argumentsName arguments; + upvar $descriptionsName descriptions; + upvar $stateName state; # the special state/instruction "args" eats all # the remaining args (if any) @@ -420,27 +420,27 @@ proc ::tcl::OptProcArgGiven {argname} { if {![Lempty $arguments]} { # If there is no additional arguments, leave the default value # in. - OptCurSetValue descriptions $arguments - set arguments {} + OptCurSetValue descriptions $arguments; + set arguments {}; } # puts "breaking out ('args' state: consuming every reminding args)" - return -code break + return -code break; } if {[Lempty $arguments]} { if {$state == "flags"} { # no argument and no flags : we're done -# puts "returning to previous (sub)prg (no more args)" - return -code return +# puts "returning to previous (sub)prg (no more args)"; + return -code return; } elseif {$state == "optValue"} { set state next; # not used, for debug only # go to next state - return + return ; } else { - return -code error [OptMissingValue $descriptions] + return -code error [OptMissingValue $descriptions]; } } else { - set arg [OptCurrentArg $arguments] + set arg [OptCurrentArg $arguments]; } switch $state { @@ -450,62 +450,62 @@ proc ::tcl::OptProcArgGiven {argname} { # Still a flag ? if {![OptIsFlag $arg]} { # don't consume the argument, return to previous prg - return -code return + return -code return; } # consume the flag - OptNextArg arguments + OptNextArg arguments; if {[string equal "--" $arg]} { # return from 'flags' state - return -code return + return -code return; } - set hits [OptHits descriptions $arg] + set hits [OptHits descriptions $arg]; if {$hits > 1} { return -code error [OptAmbigous $descriptions $arg] } elseif {$hits == 0} { return -code error [OptFlagUsage $descriptions $arg] } - set item [OptCurDesc $descriptions] + set item [OptCurDesc $descriptions]; if {[OptNeedValue $item]} { # we need a value, next state is - set state flagValue + set state flagValue; } else { - OptCurSetValue descriptions 1 + OptCurSetValue descriptions 1; } # continue - return -code continue + return -code continue; } flagValue - value { - set item [OptCurDesc $descriptions] + set item [OptCurDesc $descriptions]; # Test the values against their required type if {[catch {OptCheckType $arg\ [OptType $item] [OptTypeArgs $item]} val]} { return -code error [OptBadValue $item $arg $val] } # consume the value - OptNextArg arguments + OptNextArg arguments; # set the value - OptCurSetValue descriptions $val + OptCurSetValue descriptions $val; # go to next state if {$state == "flagValue"} { set state flags - return -code continue + return -code continue; } else { set state next; # not used, for debug only return ; # will go on next step } } optValue { - set item [OptCurDesc $descriptions] + set item [OptCurDesc $descriptions]; # Test the values against their required type if {![catch {OptCheckType $arg\ [OptType $item] [OptTypeArgs $item]} val]} { # right type, so : # consume the value - OptNextArg arguments + OptNextArg arguments; # set the value - OptCurSetValue descriptions $val + OptCurSetValue descriptions $val; } # go to next state set state next; # not used, for debug only @@ -516,39 +516,39 @@ proc ::tcl::OptProcArgGiven {argname} { # state as been entered ! return -code error "Bug! unknown state in DoOne \"$state\"\ (prg counter [OptGetPrgCounter $descriptions]:\ - [OptCurDesc $descriptions])" + [OptCurDesc $descriptions])"; } # Parse the options given the key to previously registered description # and arguments list proc ::tcl::OptKeyParse {descKey arglist} { - set desc [OptKeyGetDesc $descKey] + set desc [OptKeyGetDesc $descKey]; # make sure -help always give usage if {[string equal -nocase "-help" $arglist]} { - return -code error [OptError "Usage information:" $desc 1] + return -code error [OptError "Usage information:" $desc 1]; } - OptDoAll desc arglist + OptDoAll desc arglist; if {![Lempty $arglist]} { - return -code error [OptTooManyArgs $desc $arglist] + return -code error [OptTooManyArgs $desc $arglist]; } - + # Analyse the result # Walk through the tree: - OptTreeVars $desc "#[expr {[info level]-1}]" + OptTreeVars $desc "#[expr {[info level]-1}]" ; } # determine string length for nice tabulated output proc OptTreeVars {desc level {vnamesLst {}}} { foreach item $desc { - if {[OptIsCounter $item]} continue + if {[OptIsCounter $item]} continue; if {[OptIsPrg $item]} { - set vnamesLst [OptTreeVars $item $level $vnamesLst] + set vnamesLst [OptTreeVars $item $level $vnamesLst]; } else { - set vname [OptVarName $item] + set vname [OptVarName $item]; upvar $level $vname var if {[OptHasBeenSet $item]} { # puts "adding $vname" @@ -556,10 +556,10 @@ proc ::tcl::OptKeyParse {descKey arglist} { # it is more usefull, for instance you can check that # no flags at all was given with expr # {![string match "*-*" $Args]} - lappend vnamesLst [OptName $item] - set var [OptValue $item] + lappend vnamesLst [OptName $item]; + set var [OptValue $item]; } else { - set var [OptDefaultValue $item] + set var [OptDefaultValue $item]; } } } @@ -571,7 +571,7 @@ proc ::tcl::OptKeyParse {descKey arglist} { # and emit an error if arg is not of the correct type # otherwise returns the canonical value of that arg (ie 0/1 for booleans) proc ::tcl::OptCheckType {arg type {typeArgs ""}} { -# puts "checking '$arg' against '$type' ($typeArgs)" +# puts "checking '$arg' against '$type' ($typeArgs)"; # only types "any", "choice", and numbers can have leading "-" @@ -580,7 +580,7 @@ proc ::tcl::OptCheckType {arg type {typeArgs ""}} { if {![string is integer -strict $arg]} { error "not an integer" } - return $arg + return $arg; } float { return [expr {double($arg)}] @@ -591,7 +591,7 @@ proc ::tcl::OptCheckType {arg type {typeArgs ""}} { if {[llength $arg]==0 && [OptIsFlag $arg]} { error "no values with leading -" } - return $arg + return $arg; } boolean { if {![string is boolean -strict $arg]} { @@ -604,10 +604,10 @@ proc ::tcl::OptCheckType {arg type {typeArgs ""}} { if {[lsearch -exact $typeArgs $arg] < 0} { error "invalid choice" } - return $arg + return $arg; } any { - return $arg + return $arg; } string - default { @@ -617,7 +617,7 @@ proc ::tcl::OptCheckType {arg type {typeArgs ""}} { return $arg } } - return neverReached + return neverReached; } # internal utilities @@ -625,34 +625,34 @@ proc ::tcl::OptCheckType {arg type {typeArgs ""}} { # returns the number of flags matching the given arg # sets the (local) prg counter to the list of matches proc OptHits {descName arg} { - upvar $descName desc + upvar $descName desc; set hits 0 set hitems {} - set i 1 + set i 1; - set larg [string tolower $arg] - set len [string length $larg] - set last [expr {$len-1}] + set larg [string tolower $arg]; + set len [string length $larg]; + set last [expr {$len-1}]; foreach item [lrange $desc 1 end] { set flag [OptName $item] # lets try to match case insensitively # (string length ought to be cheap) - set lflag [string tolower $flag] + set lflag [string tolower $flag]; if {$len == [string length $lflag]} { if {[string equal $larg $lflag]} { # Exact match case - OptSetPrgCounter desc $i - return 1 + OptSetPrgCounter desc $i; + return 1; } } elseif {[string equal $larg [string range $lflag 0 $last]]} { - lappend hitems $i - incr hits + lappend hitems $i; + incr hits; } - incr i + incr i; } if {$hits} { - OptSetPrgCounter desc $hitems + OptSetPrgCounter desc $hitems; } return $hits } @@ -660,29 +660,29 @@ proc ::tcl::OptCheckType {arg type {typeArgs ""}} { # Extract fields from the list structure: proc OptName {item} { - lindex $item 1 + lindex $item 1; } proc OptHasBeenSet {item} { - Lget $item {2 0} + Lget $item {2 0}; } proc OptValue {item} { - Lget $item {2 1} + Lget $item {2 1}; } proc OptIsFlag {name} { - string match "-*" $name + string match "-*" $name; } proc OptIsOpt {name} { - string match {\?*} $name + string match {\?*} $name; } proc OptVarName {item} { - set name [OptName $item] + set name [OptName $item]; if {[OptIsFlag $name]} { - return [string range $name 1 end] + return [string range $name 1 end]; } elseif {[OptIsOpt $name]} { - return [string trim $name "?"] + return [string trim $name "?"]; } else { - return $name + return $name; } } proc OptType {item} { @@ -719,13 +719,13 @@ proc ::tcl::OptCheckType {arg type {typeArgs ""}} { proc OptOptUsage {item {what ""}} { return -code error "invalid description format$what: $item\n\ should be a list of {varname|-flagname ?-type? ?defaultvalue?\ - ?helpstring?}" + ?helpstring?}"; } # Generate a canonical form single instruction proc OptNewInst {state varname type typeArgs help} { - list $state $varname [list 0 {}] $type $typeArgs $help + list $state $varname [list 0 {}] $type $typeArgs $help; # ^ ^ # | | # hasBeenSet=+ +=currentValue @@ -733,18 +733,18 @@ proc ::tcl::OptCheckType {arg type {typeArgs ""}} { # Translate one item to canonical form proc OptNormalizeOne {item} { - set lg [Lassign $item varname arg1 arg2 arg3] -# puts "called optnormalizeone '$item' v=($varname), lg=$lg" - set isflag [OptIsFlag $varname] - set isopt [OptIsOpt $varname] + set lg [Lassign $item varname arg1 arg2 arg3]; +# puts "called optnormalizeone '$item' v=($varname), lg=$lg"; + set isflag [OptIsFlag $varname]; + set isopt [OptIsOpt $varname]; if {$isflag} { - set state "flags" + set state "flags"; } elseif {$isopt} { - set state "optValue" + set state "optValue"; } elseif {![string equal $varname "args"]} { - set state "value" + set state "value"; } else { - set state "args" + set state "args"; } # apply 'smart' 'fuzzy' logic to try to make @@ -754,9 +754,9 @@ proc ::tcl::OptCheckType {arg type {typeArgs ""}} { switch $lg { 1 { if {$isflag} { - return [OptNewInst $state $varname boolflag false ""] + return [OptNewInst $state $varname boolflag false ""]; } else { - return [OptNewInst $state $varname any "" ""] + return [OptNewInst $state $varname any "" ""]; } } 2 { @@ -776,20 +776,20 @@ proc ::tcl::OptCheckType {arg type {typeArgs ""}} { set help "" set def $arg1 } - return [OptNewInst $state $varname $type $def $help] + return [OptNewInst $state $varname $type $def $help]; } 3 { # varname type value # varname value comment - + if {[regexp {^-(.+)$} $arg1 x type]} { # flags/optValue as they are optional, need a "value", # on the contrary, for a variable (non optional), # default value is pointless, 'cept for choices : if {$isflag || $isopt || ($type == "choice")} { - return [OptNewInst $state $varname $type $arg2 ""] + return [OptNewInst $state $varname $type $arg2 ""]; } else { - return [OptNewInst $state $varname $type "" $arg2] + return [OptNewInst $state $varname $type "" $arg2]; } } else { return [OptNewInst $state $varname\ @@ -798,13 +798,13 @@ proc ::tcl::OptCheckType {arg type {typeArgs ""}} { } 4 { if {[regexp {^-(.+)$} $arg1 x type]} { - return [OptNewInst $state $varname $type $arg2 $arg3] + return [OptNewInst $state $varname $type $arg2 $arg3]; } else { - return -code error [OptOptUsage $item] + return -code error [OptOptUsage $item]; } } default { - return -code error [OptOptUsage $item] + return -code error [OptOptUsage $item]; } } } @@ -829,7 +829,7 @@ proc ::tcl::OptCheckType {arg type {typeArgs ""}} { OptError "ambigous option \"$arg\", choose from:" [OptSelection $desc] } proc OptFlagUsage {desc arg} { - OptError "bad flag \"$arg\", must be one of" $desc + OptError "bad flag \"$arg\", must be one of" $desc; } proc OptTooManyArgs {desc arguments} { OptError "too many arguments (unexpected argument(s): $arguments),\ @@ -838,45 +838,45 @@ proc ::tcl::OptCheckType {arg type {typeArgs ""}} { } proc OptParamType {item} { if {[OptIsFlag $item]} { - return "flag" + return "flag"; } else { - return "parameter" + return "parameter"; } } proc OptBadValue {item arg {err {}}} { -# puts "bad val err = \"$err\"" +# puts "bad val err = \"$err\""; OptError "bad value \"$arg\" for [OptParamType $item]"\ [list $item] } proc OptMissingValue {descriptions} { -# set item [OptCurDescFinal $descriptions] - set item [OptCurDesc $descriptions] +# set item [OptCurDescFinal $descriptions]; + set item [OptCurDesc $descriptions]; OptError "no value given for [OptParamType $item] \"[OptName $item]\"\ (use -help for full usage) :"\ [list $item] } proc ::tcl::OptKeyError {prefix descKey {header 0}} { - OptError $prefix [OptKeyGetDesc $descKey] $header + OptError $prefix [OptKeyGetDesc $descKey] $header; } # determine string length for nice tabulated output proc OptLengths {desc nlName tlName dlName} { - upvar $nlName nl - upvar $tlName tl - upvar $dlName dl + upvar $nlName nl; + upvar $tlName tl; + upvar $dlName dl; foreach item $desc { - if {[OptIsCounter $item]} continue + if {[OptIsCounter $item]} continue; if {[OptIsPrg $item]} { OptLengths $item nl tl dl } else { SetMax nl [string length [OptName $item]] SetMax tl [string length [OptType $item]] - set dv [OptTypeArgs $item] + set dv [OptTypeArgs $item]; if {[OptState $item] != "header"} { - set dv "($dv)" + set dv "($dv)"; } - set l [string length $dv] + set l [string length $dv]; # limit the space allocated to potentially big "choices" if {([OptType $item] != "choice") || ($l<=12)} { SetMax dl $l @@ -890,22 +890,22 @@ proc ::tcl::OptKeyError {prefix descKey {header 0}} { } # output the tree proc OptTree {desc nl tl dl} { - set res "" + set res ""; foreach item $desc { - if {[OptIsCounter $item]} continue + if {[OptIsCounter $item]} continue; if {[OptIsPrg $item]} { - append res [OptTree $item $nl $tl $dl] + append res [OptTree $item $nl $tl $dl]; } else { - set dv [OptTypeArgs $item] + set dv [OptTypeArgs $item]; if {[OptState $item] != "header"} { - set dv "($dv)" + set dv "($dv)"; } - append res [string trimright [format "\n %-*s %-*s %-*s %s" \ + append res [format "\n %-*s %-*s %-*s %s" \ $nl [OptName $item] $tl [OptType $item] \ - $dl $dv [OptHelp $item]]] + $dl $dv [OptHelp $item]] } } - return $res + return $res; } # Give nice usage string @@ -913,13 +913,13 @@ proc ::tcl::OptError {prefix desc {header 0}} { # determine length if {$header} { # add faked instruction - set h [list [OptNewInst header Var/FlagName Type Value Help]] - lappend h [OptNewInst header ------------ ---- ----- ----] - lappend h [OptNewInst header {(-help} "" "" {gives this help)}] + set h [list [OptNewInst header Var/FlagName Type Value Help]]; + lappend h [OptNewInst header ------------ ---- ----- ----]; + lappend h [OptNewInst header {( -help} "" "" {gives this help )}] set desc [concat $h $desc] } OptLengths $desc nl tl dl - # actually output + # actually output return "$prefix[OptTree $desc $nl $tl $dl]" } @@ -943,105 +943,105 @@ proc ::tcl::Lempty {list} { # Gets the value of one leaf of a lists tree proc ::tcl::Lget {list indexLst} { if {[llength $indexLst] <= 1} { - return [lindex $list $indexLst] + return [lindex $list $indexLst]; } - Lget [lindex $list [lindex $indexLst 0]] [lrange $indexLst 1 end] + Lget [lindex $list [lindex $indexLst 0]] [lrange $indexLst 1 end]; } # Sets the value of one leaf of a lists tree # (we use the version that does not create the elements because # it would be even slower... needs to be written in C !) # (nb: there is a non trivial recursive problem with indexes 0, # which appear because there is no difference between a list -# of 1 element and 1 element alone : [list "a"] == "a" while +# of 1 element and 1 element alone : [list "a"] == "a" while # it should be {a} and [listp a] should be 0 while [listp {a b}] would be 1 # and [listp "a b"] maybe 0. listp does not exist either...) proc ::tcl::Lvarset {listName indexLst newValue} { - upvar $listName list + upvar $listName list; if {[llength $indexLst] <= 1} { - Lvarset1nc list $indexLst $newValue + Lvarset1nc list $indexLst $newValue; } else { - set idx [lindex $indexLst 0] - set targetList [lindex $list $idx] + set idx [lindex $indexLst 0]; + set targetList [lindex $list $idx]; # reduce refcount on targetList (not really usefull now, # could be with optimizing compiler) -# Lvarset1 list $idx {} +# Lvarset1 list $idx {}; # recursively replace in targetList - Lvarset targetList [lrange $indexLst 1 end] $newValue + Lvarset targetList [lrange $indexLst 1 end] $newValue; # put updated sub list back in the tree - Lvarset1nc list $idx $targetList + Lvarset1nc list $idx $targetList; } } # Set one cell to a value, eventually create all the needed elements # (on level-1 of lists) variable emptyList {} proc ::tcl::Lvarset1 {listName index newValue} { - upvar $listName list + upvar $listName list; if {$index < 0} {return -code error "invalid negative index"} - set lg [llength $list] + set lg [llength $list]; if {$index >= $lg} { - variable emptyList + variable emptyList; for {set i $lg} {$i<$index} {incr i} { - lappend list $emptyList + lappend list $emptyList; } - lappend list $newValue + lappend list $newValue; } else { - set list [lreplace $list $index $index $newValue] + set list [lreplace $list $index $index $newValue]; } } # same as Lvarset1 but no bound checking / creation proc ::tcl::Lvarset1nc {listName index newValue} { - upvar $listName list - set list [lreplace $list $index $index $newValue] + upvar $listName list; + set list [lreplace $list $index $index $newValue]; } # Increments the value of one leaf of a lists tree # (which must exists) proc ::tcl::Lvarincr {listName indexLst {howMuch 1}} { - upvar $listName list + upvar $listName list; if {[llength $indexLst] <= 1} { - Lvarincr1 list $indexLst $howMuch + Lvarincr1 list $indexLst $howMuch; } else { - set idx [lindex $indexLst 0] - set targetList [lindex $list $idx] + set idx [lindex $indexLst 0]; + set targetList [lindex $list $idx]; # reduce refcount on targetList - Lvarset1nc list $idx {} + Lvarset1nc list $idx {}; # recursively replace in targetList - Lvarincr targetList [lrange $indexLst 1 end] $howMuch + Lvarincr targetList [lrange $indexLst 1 end] $howMuch; # put updated sub list back in the tree - Lvarset1nc list $idx $targetList + Lvarset1nc list $idx $targetList; } } # Increments the value of one cell of a list proc ::tcl::Lvarincr1 {listName index {howMuch 1}} { - upvar $listName list - set newValue [expr {[lindex $list $index]+$howMuch}] - set list [lreplace $list $index $index $newValue] - return $newValue + upvar $listName list; + set newValue [expr {[lindex $list $index]+$howMuch}]; + set list [lreplace $list $index $index $newValue]; + return $newValue; } # Removes the first element of a list # and returns the new list value proc ::tcl::Lvarpop1 {listName} { - upvar $listName list - set list [lrange $list 1 end] + upvar $listName list; + set list [lrange $list 1 end]; } # Same but returns the removed element # (Like the tclX version) proc ::tcl::Lvarpop {listName} { - upvar $listName list - set el [lindex $list 0] - set list [lrange $list 1 end] - return $el + upvar $listName list; + set el [lindex $list 0]; + set list [lrange $list 1 end]; + return $el; } # Assign list elements to variables and return the length of the list proc ::tcl::Lassign {list args} { # faster than direct blown foreach (which does not byte compile) - set i 0 - set lg [llength $list] + set i 0; + set lg [llength $list]; foreach vname $args { if {$i>=$lg} break - uplevel 1 [list ::set $vname [lindex $list $i]] - incr i + uplevel 1 [list ::set $vname [lindex $list $i]]; + incr i; } - return $lg + return $lg; } # Misc utilities |