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 } }