Posted to tcl by mjanssen at Wed Dec 19 16:59:59 GMT 2007view pretty
# include procs proc ldap::parseFilter {filterString} { if {![regexp -- {^\((.*)\)$} $filterString -> filterComp]} { error "invalid filter string: syntax is \"( ..... )\"" } return [parseFilterComp $filterComp] } proc ldap::parseFilterComp {filterComp} { set first [string index $filterComp 0] set rest [string range $filterComp 1 end] switch -- $first { & - | - ! { return [linsert [parseFilterList $rest] 0 $first] } default { # we have an item return as a single element list return [string map {"\\(" "(" "\\)" ")"} $filterComp] } } } proc ldap::parseFilterList {filterList} { puts "pfl: $filterList" set filters {} if {[string length $filterList] == 0} { return {} } if {[string index $filterList 0]!="("} { error "invalid filter component, syntax \"( ....\"" } else { set filter [ldap::getFilterListElement filterList] puts $filter return [list [parseFilter ($filter)] {*}[parseFilterList $filterList]] } } proc ldap::getFilterListElement {filterListVar} { upvar 1 $filterListVar filterList set prev {} set depth 0 set idx 0 foreach cur [split $filterList ""] { switch -- $cur { ( { if {$prev ne "\\"} {incr depth} } ) { if {$prev ne "\\"} {incr depth -1} } } incr idx set prev $cur if {$depth == 0} { set item [string range $filterList 1 $idx-2] set filterList [string range $filterList $idx end] return $item } } } # and replace regexps by: set filterString [parseFilter $filterString]