Annotation of micropolis/src/tclx/tclsrc/setfuncs.tcl, revision 1.1.1.1

1.1       root        1: #
                      2: # setfuncs --
                      3: #
                      4: # Perform set functions on lists.  Also has a procedure for removing duplicate
                      5: # list entries.
                      6: #------------------------------------------------------------------------------
                      7: # Copyright 1992 Karl Lehenbauer and Mark Diekhans.
                      8: #
                      9: # Permission to use, copy, modify, and distribute this software and its
                     10: # documentation for any purpose and without fee is hereby granted, provided
                     11: # that the above copyright notice appear in all copies.  Karl Lehenbauer and
                     12: # Mark Diekhans make no representations about the suitability of this
                     13: # software for any purpose.  It is provided "as is" without express or
                     14: # implied warranty.
                     15: #------------------------------------------------------------------------------
                     16: # $Id: setfuncs.tcl,v 2.0 1992/10/16 04:52:10 markd Rel $
                     17: #------------------------------------------------------------------------------
                     18: #
                     19: 
                     20: #@package: TclX-set_functions union intersect intersect3 lrmdups
                     21: 
                     22: #
                     23: # return the logical union of two lists, removing any duplicates
                     24: #
                     25: proc union {lista listb} {
                     26:     set full_list [lsort [concat $lista $listb]]
                     27:     set check_element [lindex $full_list 0]
                     28:     set outlist $check_element
                     29:     foreach element [lrange $full_list 1 end] {
                     30:        if {$check_element == $element} continue
                     31:        lappend outlist $element
                     32:        set check_element $element
                     33:     }
                     34:     return $outlist
                     35: }
                     36: 
                     37: #
                     38: # sort a list, returning the sorted version minus any duplicates
                     39: #
                     40: proc lrmdups {list} {
                     41:     set list [lsort $list]
                     42:     set result [lvarpop list]
                     43:     lappend last $result
                     44:     foreach element $list {
                     45:        if {$last != $element} {
                     46:            lappend result $element
                     47:            set last $element
                     48:        }
                     49:     }
                     50:     return $result
                     51: }
                     52: 
                     53: #
                     54: # intersect3 - perform the intersecting of two lists, returning a list
                     55: # containing three lists.  The first list is everything in the first
                     56: # list that wasn't in the second, the second list contains the intersection
                     57: # of the two lists, the third list contains everything in the second list
                     58: # that wasn't in the first.
                     59: #
                     60: 
                     61: proc intersect3 {list1 list2} {
                     62:     set list1Result ""
                     63:     set list2Result ""
                     64:     set intersectList ""
                     65: 
                     66:     set list1 [lrmdups $list1]
                     67:     set list2 [lrmdups $list2]
                     68: 
                     69:     while {1} {
                     70:         if [lempty $list1] {
                     71:             if ![lempty $list2] {
                     72:                 set list2Result [concat $list2Result $list2]
                     73:             }
                     74:             break
                     75:         }
                     76:         if [lempty $list2] {
                     77:            set list1Result [concat $list1Result $list1]
                     78:             break
                     79:         }
                     80:         set compareResult [string compare [lindex $list1 0] [lindex $list2 0]]
                     81: 
                     82:         if {$compareResult < 0} {
                     83:             lappend list1Result [lvarpop list1]
                     84:             continue
                     85:         }
                     86:         if {$compareResult > 0} {
                     87:             lappend list2Result [lvarpop list2]
                     88:             continue
                     89:         }
                     90:         lappend intersectList [lvarpop list1]
                     91:         lvarpop list2
                     92:     }
                     93:     return [list $list1Result $intersectList $list2Result]
                     94: }
                     95: 
                     96: #
                     97: # intersect - perform an intersection of two lists, returning a list
                     98: # containing every element that was present in both lists
                     99: #
                    100: proc intersect {list1 list2} {
                    101:     set intersectList ""
                    102: 
                    103:     set list1 [lsort $list1]
                    104:     set list2 [lsort $list2]
                    105: 
                    106:     while {1} {
                    107:         if {[lempty $list1] || [lempty $list2]} break
                    108: 
                    109:         set compareResult [string compare [lindex $list1 0] [lindex $list2 0]]
                    110: 
                    111:         if {$compareResult < 0} {
                    112:             lvarpop list1
                    113:             continue
                    114:         }
                    115: 
                    116:         if {$compareResult > 0} {
                    117:             lvarpop list2
                    118:             continue
                    119:         }
                    120: 
                    121:         lappend intersectList [lvarpop list1]
                    122:         lvarpop list2
                    123:     }
                    124:     return $intersectList
                    125: }
                    126: 
                    127: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.