package provide xtcl 0.1

## lsum - retourne la somme des éléments de la liste passée en parametre
# 
# exemple : set total [lsum {1 2 3.55}]
# on ignore les éléments mal formés
proc lsum list {
   set sum 0

   if [string match "" $list] return ""
   
   foreach i $list {
       if [catch {set newsum [expr $sum+$i]}] continue
       set sum $newsum
   }
   return $sum
}

## stringSum - 
# creer une liste de nombre contenu dans une chaine et en calcule
# la somme ou "" si rien a additionner.
# 
proc stringSum str {
    set nbList ""  ;# 
        
    set nbPat "\[\\+\]?(\[\\-\]?\[0-9\.\]+)"

    set idx 0
    
    while {[regexp -indices --  ($nbPat) $str popo nbIdx]} {
        set firstCar [lindex $nbIdx 0]
        set lastCar  [lindex $nbIdx 1]
        set nbVal [string range $str $firstCar $lastCar ]
        lappend nbList   $nbVal
        set str [string range $str [incr lastCar] end]
    }
    
    return [lsum $nbList]
}
# ./
