Posted to tcl by mjanssen at Wed Dec 19 16:33:18 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} {
    set filters {}
    while {[string length $filterList] > 0} {
       if {[string index $filterList 0]!="("} {
	  error "invalid filter component, syntax \"( ....\""
       } else {
           set filterList [string range $filterList 1 end]
           regexp -- {^(.*?[^\\])\)(.*)$} $filterList -> filter filterList
           lappend filters [parseFilter ($filter)] 
       }
   }
   return $filters
}

# and replace regexps by: set filterString [parseFilter $filterString]