| 1 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 2 | # FILE : bflist.tcl |
|---|
| 3 | # PURPOSE : This file |
|---|
| 4 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 5 | |
|---|
| 6 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 7 | proc ListReplace {list value newValue} { |
|---|
| 8 | # PURPOSE: |
|---|
| 9 | # |
|---|
| 10 | # PARAMETERS: |
|---|
| 11 | # lst -> |
|---|
| 12 | # value -> |
|---|
| 13 | # newValue -> |
|---|
| 14 | # |
|---|
| 15 | # RETURN: |
|---|
| 16 | # |
|---|
| 17 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 18 | set idx -1; |
|---|
| 19 | if [string equal $value $newValue] { |
|---|
| 20 | return $list |
|---|
| 21 | } |
|---|
| 22 | while { [set idx [lsearch $list $value]] != -1} { |
|---|
| 23 | set list [lreplace $list $idx $idx $newValue] |
|---|
| 24 | } |
|---|
| 25 | return $list |
|---|
| 26 | } |
|---|
| 27 | |
|---|
| 28 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 29 | proc blremove {_L args} { |
|---|
| 30 | # PURPOSE: |
|---|
| 31 | # |
|---|
| 32 | # PARAMETERS: |
|---|
| 33 | # _L -> nombre completo de la lista |
|---|
| 34 | # args -> argumentos a borrar |
|---|
| 35 | # |
|---|
| 36 | # RETURN: |
|---|
| 37 | # |
|---|
| 38 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 39 | upvar $_L L |
|---|
| 40 | foreach i $args { |
|---|
| 41 | set pos [lsearch $L $i] ;# might be -1 if not found... |
|---|
| 42 | set L [lreplace $L $pos $pos] ;# ... but that's fine |
|---|
| 43 | } |
|---|
| 44 | } |
|---|
| 45 | |
|---|
| 46 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 47 | proc lunion {args} { |
|---|
| 48 | # PURPOSE: |
|---|
| 49 | # |
|---|
| 50 | # PARAMETERS: |
|---|
| 51 | # args -> |
|---|
| 52 | # |
|---|
| 53 | # RETURN: |
|---|
| 54 | # |
|---|
| 55 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 56 | switch [llength $args] { |
|---|
| 57 | 0 { |
|---|
| 58 | return {} |
|---|
| 59 | } |
|---|
| 60 | 1 { |
|---|
| 61 | return [lindex $args 0] |
|---|
| 62 | } |
|---|
| 63 | default { |
|---|
| 64 | foreach set $args { |
|---|
| 65 | foreach e $set { |
|---|
| 66 | set tmp($e) . |
|---|
| 67 | } |
|---|
| 68 | } |
|---|
| 69 | return [array names tmp] |
|---|
| 70 | } |
|---|
| 71 | } |
|---|
| 72 | } |
|---|
| 73 | |
|---|
| 74 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 75 | proc lreverse {_L} { |
|---|
| 76 | # PURPOSE: |
|---|
| 77 | # |
|---|
| 78 | # PARAMETERS: |
|---|
| 79 | # _L -> |
|---|
| 80 | # |
|---|
| 81 | # RETURN: |
|---|
| 82 | # |
|---|
| 83 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 84 | set res {} |
|---|
| 85 | set i [llength $_L] |
|---|
| 86 | while {$i} {lappend res [lindex $_L [incr i -1]]} |
|---|
| 87 | set res |
|---|
| 88 | } |
|---|
| 89 | |
|---|
| 90 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 91 | proc ljoin {_L1 _L2 sep {empty 0} {tab 0}} { |
|---|
| 92 | # |
|---|
| 93 | # PURPOSE: Junta las dos variables en un elemento separandolos por los |
|---|
| 94 | # caracteres que se le indique |
|---|
| 95 | # |
|---|
| 96 | # PARAMETERS: |
|---|
| 97 | # _L1 -> Primera lista |
|---|
| 98 | # _L2 -> Segunda lista |
|---|
| 99 | # sep -> Caracteres de separacion |
|---|
| 100 | # empty -> Introducimos un primer elemento vacio. 0:False, 1:True |
|---|
| 101 | # tab -> Tabulamos los elementos. 0:False, 1:True |
|---|
| 102 | # |
|---|
| 103 | # RETURN: |
|---|
| 104 | # |
|---|
| 105 | #/////////////////////////////////////////////////////////////////////////// |
|---|
| 106 | set lista {} |
|---|
| 107 | if {$empty} { |
|---|
| 108 | set lista {""} |
|---|
| 109 | } |
|---|
| 110 | |
|---|
| 111 | foreach i $_L1 j $_L2 { |
|---|
| 112 | if {$tab} { |
|---|
| 113 | set len [expr 10 - [string length $i]] |
|---|
| 114 | set elem [format "%-*s %s %s" $len $i $sep $j] |
|---|
| 115 | } else { |
|---|
| 116 | set elem "$i$sep$j" |
|---|
| 117 | } |
|---|
| 118 | lappend lista $elem |
|---|
| 119 | } |
|---|
| 120 | return $lista |
|---|
| 121 | } |
|---|
| 122 | |
|---|
| 123 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 124 | proc lsub {_L1 _L2} { |
|---|
| 125 | # |
|---|
| 126 | # PURPOSE: Devuelve el resultado de restar a _L1 _L2 |
|---|
| 127 | # |
|---|
| 128 | # PARAMETERS: |
|---|
| 129 | # _L1 -> Primera lista |
|---|
| 130 | # _L2 -> Segunda lista |
|---|
| 131 | # |
|---|
| 132 | # RETURN: La listta resultado de la resta |
|---|
| 133 | # |
|---|
| 134 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 135 | |
|---|
| 136 | foreach i $_L2 { |
|---|
| 137 | set ini [lsearch $_L1 $i] |
|---|
| 138 | if { $ini != -1 } { |
|---|
| 139 | set _L1 [lreplace $_L1 $ini $ini ] |
|---|
| 140 | } |
|---|
| 141 | } |
|---|
| 142 | |
|---|
| 143 | return $_L1 |
|---|
| 144 | } |
|---|
| 145 | |
|---|
| 146 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 147 | proc ltraspose {_L} { |
|---|
| 148 | # |
|---|
| 149 | # PURPOSE: transpone los valores de una lista. |
|---|
| 150 | # NOTA. SOLO FUNCIONA SI LAS LISTAS SON TODAS DE LA MISMA DIMENSION O LA |
|---|
| 151 | # PRIMERA ES MAYOR O IGUAL QUE LAS DEMAS |
|---|
| 152 | # |
|---|
| 153 | # PARAMETERS: |
|---|
| 154 | # _L -> lista original |
|---|
| 155 | # |
|---|
| 156 | # RETURN: la lista transpuesta |
|---|
| 157 | # |
|---|
| 158 | #/////////////////////////////////////////////////////////////////////////// |
|---|
| 159 | # lista a devolver |
|---|
| 160 | set lst "" |
|---|
| 161 | # comprobamos que la lista no esta vacia, numero de columnas resultado |
|---|
| 162 | set r [llength $_L] |
|---|
| 163 | if {$r} { |
|---|
| 164 | #set c [llength [lindex $_L $row]] |
|---|
| 165 | set c [llength [lindex $_L 0]] |
|---|
| 166 | if {$c} { |
|---|
| 167 | for {set col 0} {$col < $c} {incr col} { |
|---|
| 168 | set laux "" |
|---|
| 169 | for {set row 0} {$row < $r} {incr row} { |
|---|
| 170 | set dt [lindex [lindex $_L $row] $col] |
|---|
| 171 | lappend laux $dt |
|---|
| 172 | #append [lindex $lst $row] [lindex [lindex $_L $row] $col] |
|---|
| 173 | } |
|---|
| 174 | lappend lst $laux |
|---|
| 175 | } |
|---|
| 176 | } |
|---|
| 177 | } |
|---|
| 178 | return $lst |
|---|
| 179 | } |
|---|
| 180 | |
|---|
| 181 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 182 | proc lfilter {_L first skip} { |
|---|
| 183 | # |
|---|
| 184 | # PURPOSE: Filtra por indice los valores de una lista: |
|---|
| 185 | # |
|---|
| 186 | # PARAMETERS: |
|---|
| 187 | # _L -> lista original |
|---|
| 188 | # first -> Primer valor que se devuelve, a partir de 1. |
|---|
| 189 | # skip -> Número de valores que no se muestran en cada salto |
|---|
| 190 | # |
|---|
| 191 | # RETURN: la lista transpuesta |
|---|
| 192 | # |
|---|
| 193 | #/////////////////////////////////////////////////////////////////////////// |
|---|
| 194 | # lista a devolver |
|---|
| 195 | set lst "" |
|---|
| 196 | incr skip |
|---|
| 197 | # comprobamos que la lista no esta vacia, numero de columnas resultado |
|---|
| 198 | set r [llength $_L] |
|---|
| 199 | if {$r} { |
|---|
| 200 | for {set i $first} {$i < $r} {incr i $skip} { |
|---|
| 201 | lappend lst [lindex $_L $i] |
|---|
| 202 | } |
|---|
| 203 | } |
|---|
| 204 | return $lst |
|---|
| 205 | } |
|---|
| 206 | |
|---|
| 207 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 208 | proc lmaximo {_L} { |
|---|
| 209 | # |
|---|
| 210 | # PURPOSE: Busca el elemento mayor de la lista |
|---|
| 211 | # |
|---|
| 212 | # PARAMETERS: |
|---|
| 213 | # _L -> lista original |
|---|
| 214 | # |
|---|
| 215 | # RETURN: el elemento mayor |
|---|
| 216 | # |
|---|
| 217 | #/////////////////////////////////////////////////////////////////////////// |
|---|
| 218 | # elemento |
|---|
| 219 | set e [lindex $_L 0] |
|---|
| 220 | # comprobamos que la lista no esta vacia, numero de columnas resultado |
|---|
| 221 | foreach ele $_L { |
|---|
| 222 | if {[expr $ele>$e]} { |
|---|
| 223 | set e $ele |
|---|
| 224 | } |
|---|
| 225 | } |
|---|
| 226 | return $e |
|---|
| 227 | } |
|---|
| 228 | |
|---|
| 229 | #///////////////////////////////////////////////////////////////////////////// |
|---|
| 230 | proc lminimo {_L} { |
|---|
| 231 | # |
|---|
| 232 | # PURPOSE: Busca el elemento menor de la lista |
|---|
| 233 | # |
|---|
| 234 | # PARAMETERS: |
|---|
| 235 | # _L -> lista original |
|---|
| 236 | # |
|---|
| 237 | # RETURN: el elemento menor |
|---|
| 238 | # |
|---|
| 239 | #/////////////////////////////////////////////////////////////////////////// |
|---|
| 240 | # elemento |
|---|
| 241 | set e [lindex $_L 0] |
|---|
| 242 | # comprobamos que la lista no esta vacia, numero de columnas resultado |
|---|
| 243 | foreach ele $_L { |
|---|
| 244 | if {[expr $ele<$e]} { |
|---|
| 245 | set e $ele |
|---|
| 246 | } |
|---|
| 247 | } |
|---|
| 248 | return $e |
|---|
| 249 | } |
|---|