rivet/rivet-tcl/lmatch.tcl (48 lines of code) (raw):
###
##
## lmatch ?-exact|-glob|-regexp? <list> <pattern>
##
## Look for elements in <list> that match <pattern>. This command emulates
## the TclX lmatch command, but if TclX isn't available, it's a decent
## substitute.
##
## Note: Native Tcl's "lsearch" has been greatly enhanced since lmatch was
## written -- programmers should consider using lmatch instead.
##
## $Id$
##
###
namespace eval ::rivet {
proc lmatch {args} {
set modes(-exact) 0
set modes(-glob) 1
set modes(-regexp) 2
if {[llength $args] == 3} {
lassign $args mode list pattern
} elseif {[llength $args] == 2} {
set mode -glob
lassign $args list pattern
} else {
return -code error \
{wrong # args: should be "lmatch ?mode? list pattern"}
}
if {![info exists modes($mode)]} {
return -code error \
"bad search mode \"$mode\": must be -exact, -glob, or -regexp"
}
set mode $modes($mode)
set return {}
foreach elem $list {
if {$mode == 0} {
if {[string compare $elem $pattern] == 0} { lappend return $elem }
}
if {$mode == 1} {
if {[string match $pattern $elem]} { lappend return $elem }
}
if {$mode == 2} {
if {[regexp $pattern $elem]} { lappend return $elem }
}
}
return $return
}
}