# conversion base 10 <--> base n

# Valeurs par défaut:
set num1 0
set base1 10
set base2 2

label .ln1 -text "nombre 1"
label .lb1 -text "base"
entry .num1 -textvariable num1 -width 20 -state normal -bg white -justify center
entry .base1 -textvariable base1 -width 4 -state normal -bg white -justify center


button .convert -text "conversion" -command convbase

grid .lb1 .ln1 -padx 2
grid .base1 .num1 -padx 2

label .lb2 -text "base "
label .lres -text "resultat "

grid .lb2 .lres  -pady 2

entry .lbres -textvariable resultat
entry .baze2 -textvariable base2 -width 4 -state normal -bg white -justify center
grid .baze2 .lbres

frame .f1
grid .f1 .convert

bind . <Escape> exit
bind . <Return> convbase
focus -force .

proc conv10toN {num} {
global base2 resultat
  if {($base2=="") || ($base2<=1)} {
    set resultat "ERREUR"
    return;
  }
  set resultat ""
  set t $num
  while { $t>=$base2 } {
    set s [expr $t % $base2]
    set t [expr $t / $base2]
    set resultat "$s $resultat"
  }
  set resultat "$t $resultat"
  
}

proc convNto10 {} {
global num1 base1 resultat
set resultat "" ;#"non inmplemente: base 10->N seulement"
  set result 0
  for  {set i 0} {$i<[string length $num1]} {incr i} {
    set t [string index $num1 $i]
    set result [expr ($result * $base1) + $t]
    
  }
 return $result
  
}

proc convbase {} {
global num1 base1 base2 resultat
  set resultat ""
  
  if {$base1!=10} {
    set bdix [convNto10 ]
    if {$base2!=10} {
      conv10toN $bdix
    } else  {
      set resultat $bdix
    }
    
  } else  {
    conv10toN $num1
  }

}