Posted to tcl by mjanssen at Wed Dec 19 16:59:59 GMT 2007view raw
- # 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]