Posted to tcl by steveb at Fri Nov 25 12:55:41 GMT 2022view pretty
proc qualifies {point target} { #return true if point is : # a toplevel # a child, but not a grandchild or further descendant of target # a sibling, ancestor or sibling of an ancestor of target set pointlength [llength $point] set targetlength [llength $target] if {$pointlength == 1} { # toplevel return true } if {$pointlength == $targetlength} { #are they siblings or self? set tmp1 [lreplace $point end end] set tmp2 [lreplace $target end end] if {$tmp1 == $tmp2} { return true } else { if {$pointlength < $targetlength} { #is $point an ancestor of $target or sibling of an ancestor set tmp1 $target while {[llength $tmp1] > $pointlength} { set tmp1 [lreplace $tmp1 end end] } if {$point == $tmp1} { #it's an ancestor return true } #is it the sibling of an ancestor? set tmp2 [lreplace $point end end] set tmp1 [lreplace $tmp1 end end] if {$tmp1 == $tmp2} { return true } else { return false } if {$pointlength > $targetlength} { #is $point a child of $target? set tmp1 [lreplace $point end end] if {$tmp1 == $target} { return true } else { return false } } return false } set data [list . ./whenwhere ./trips ./faq ./diary ./courses ./contact\ ./anotus ./trips/lavender ./trips/canaltrip1 ./trips/canaltrip1/junk\ ./trips/lavender/morephotos ./courses/aroma] foreach point $data { lappend newlist [split [string trimleft $point "./"] "/"] } #puts $newlist foreach target $newlist { set tmp {} foreach point $newlist { #puts "trying $point and $target answer: [qualifies $point $target]" if {[qualifies $point $target]} { lappend tmp $point } } puts "\n$target\:\n\t [lsort $tmp]" }