proc cconcat {args} {
set result ""
foreach arg $args {
append result $arg
}
return $result
}
proc cequal {string1 string2} {
if {[string compare $string1 $string2]} {
return 0
}
return 1
}
proc cindex {string indexExpr} {
return [string index $string \
[indexExpr $indexExpr [string length $string]]]
}
proc clength {string} {
return [string length $string]
}
proc crange {string firstExpr lastExpr} {
set len [string length $string]
return [string range $string [indexExpr $firstExpr $len] \
[indexExpr $lastExpr $len]]
}
proc ctype {args} {
switch -- [llength $args] {
4 {
return [eval string is [list [lindex $args 2]] \
[linsert $args 2 2]]
}
default {
return [eval string is $args]
}
}
}
proc indexExpr {indexExpr len} {
switch -regexp -- $indexExpr {
{^[Ee][Nn][Dd]*$} {
incr len -1
return [expr $len[string range $indexExpr 3 end]]
}
{^[Ll][Ee][Nn]*$} {
return [expr $len[string range $indexExpr 3 end]]
}
default {
return $indexExpr
}
}
}
proc lassign {list args} {
foreach name $args {
upvar $name var
set var [lindex $list 0]
set list [lrange $list 1 end]
}
return $list
}
proc lcontain {list element} {
if {[lsearch -exact $list $element] < 0} {
return 0
}
return 1
}
proc lempty {list} {
if {[llength $list] > 0} {
return 0
}
return 1
}
proc lmatch {args} {
switch -- [llength $args] {
3 {
set mode [lindex $args 0]
set list [lindex $args 1]
set pattern [lindex $args 2]
}
default {
set mode -glob
set list [lindex $args 0]
set pattern [lindex $args 1]
}
}
set result {}
foreach elem $list {
switch -- $mode {
-glob {
if {[string match $pattern $elem]} {
lappend result $elem
}
}
-exact {
if {![string compare $pattern $elem]} {
lappend result $elem
}
}
-regexp {
if {![regexp -- $pattern $elem]} {
lappend result $elem
}
}
}
}
return $result
}
proc lvarpop {name {indexExpr 0} args} {
upvar $name var
set result [lindex $var \
[set indexExpr [indexExpr $indexExpr [llength $var]]]]
switch -- [llength $args] {
0 {
set var [lreplace $var $indexExpr $indexExpr]
}
default {
set var [lreplace $var $indexExpr $indexExpr [lindex $args 0]]
}
}
return $result
}
proc lvarpush {name string {indexExpr 0}} {
upvar $name var
if {![info exists var]} {
set var {}
}
set var [linsert $var [indexExpr $indexExpr [llength $var]] $string]
}
proc lrmdups {list} {
return [lsort -unique $list]
}
proc max {num1 args} {
foreach num $args {
if {$num1 < $num} {
set num1 $num
}
}
return $num1
}
proc min {num1 args} {
foreach num $args {
if {$num1 > $num} {
set num1 $num
}
}
return $num1
}
proc random {args} {
switch -- [llength $args] {
1 {
return [expr round(rand()*[lindex $args 0])]
}
default {
return ""
}
}
}