#!/usr/bin/wish

global 10

frame .frame -height 2c
text .enter  -relief raised -height 10
button .calc -text "calc" -command {parse} \
 -underline 0
button .clear -text "clear" -command {clear} \
 -underline 4
label .results   


pack .frame .enter -side top -fill x
place .calc -relx .40  -rely 0
place .clear -relx .50 -rely 0
place .results -relx .70 -rely 0


bind .enter <Control-v> {.enter insert end [ paste ] }
bind all <Control-q> {exit}
bind all <Control-c> {parse}
bind all <Control-r> {clear}
focus .enter
proc paste {} {
 set data [clipboard get]
 return $data
 } 
proc clear {} {
  .enter delete 1.0 end
}
proc parse {} {
 catch {
 set flag 0
######## parse data 
##get first ( )

set data [.enter get 1.0 end-1c]
regexp {[^#a-zA-Z]+} $data match
set data $match
set flag 1
  
while {$flag == 1} {
switch -regexp $data {
    {\([-0-9. \+\-\*\/\^]*\)} {regexp {\([-0-9. \+\-\*\/\^]*\)} $data match; set flag 1; set func $match }
    default {puts "no more brackets"; set flag 0}
 }

### parse match 
if {$flag == 1} {regexp {\(([0-9.]*) *([\+\-\*\/\^])? *([-0-9.]*)?} $func match x f y 
  if {$f == "-"} {set f "m"}
 switch $f { 
        + { regexp {\(([-0-9.\+\-\*\/\^]*)} $func match1 factor; set fac [expr "$factor"]; puts "line 52 factor: $factor" }  
        m { regexp {\(([-0-9.\+\-\*\/\^]*)} $func match1 factor; set fac [expr "$factor"] }  
        * { set fac [expr "$x $f $y"] }  
        / { set fac [expr "double($x)/double($y)"] }
        ^ { set fac [expr "pow($x,$y)"] } 
        default { set fac $x }
           }

#### substitute factor for function

regsub  {\([-0-9. \+\-\*\/\^]*\)}  $data $fac data
 if {$flag == 1} { puts "new data: $data"}
 .results configure  -text $data
} 
}
### solve remaining equation (no brackets)

switch -regexp $data {
   {[-0-9. ]\^} { regexp {([-0-9. ]*)\^([-0-9. ]*)} $data match x y; \
               set result [expr "pow($x,$y)"]; .results configure -text $result}
    default {set result [expr "$data"]; .results configure -text $result}
 }
}

}
