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]