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]"
}