12 my $height = $LINES-3;
17 my $nopush; # 0=push and reset next; 1=reset next; 2=do nothing
24 @val = (0, 0); # val, frac
28 my ($val, $base) = @_;
29 return $val if $base==10;
36 my $char = $int%$base;
37 $txt = ($char<10 ? $char : chr($char+55)).$txt;
41 $txt .= '.' if $frac>0;
42 for (my $i = 0; length $txt<$width-2 && $frac>0; $i++) {
46 $txt .= $char<10 ? $char : chr($char+55);
54 addstr($height-$_, 1, "$_: ".showval($stack[$_], $base));
57 clrtoeol($height-$#stack-1, 1);
61 my @menus = ([qw(xroot log alog)], [qw(dec bin oct hex)]);
62 @menu = @{$menus[shift]};
64 addstr($height+2, $width/6*$_+1, join " ", $menu[$_]) for grep exists $menu[$_], 0..5;
67 addstr($height+2, $width/6*$_, $_+1) for grep exists $menu[$_], 0..5;
71 chr(27).chr(79).chr(80) => 0, # F1
72 chr(27).chr(79).chr(81) => 1, # F2
73 chr(27).chr(79).chr(82) => 2, # F3
74 chr(27).chr(79).chr(83) => 3, # F4
75 chr(27).chr(91).chr(49).chr(53).chr(126) => 4, # F5
76 chr(27).chr(91).chr(49).chr(55).chr(126) => 5, # F6
77 chr(27).chr(91).chr(49).chr(56).chr(126) => 6, # F7
78 chr(27).chr(91).chr(49).chr(57).chr(126) => 7, # F8
79 chr(27).chr(91).chr(50).chr(48).chr(126) => 8, # F9
80 chr(27).chr(91).chr(50).chr(49).chr(126) => 9, # F10
81 chr(27).chr(91).chr(50).chr(51).chr(126) => 10, # F11
82 chr(27).chr(91).chr(50).chr(52).chr(126) => 10, # F12
92 chr 8 => chr 127, # backspace
97 unshift @stack, $stack[0];
102 $stack[1] += shift @stack;
105 $stack[1] -= shift @stack;
108 $stack[1] *= shift @stack;
111 $stack[1] /= shift @stack;
114 $stack[1] %= shift @stack;
118 $stack[1] **= shift @stack;
121 $stack[1] **= 1/shift @stack;
125 $stack[1] &= shift @stack;
128 $stack[1] |= shift @stack;
131 $stack[1] ^= shift @stack;
134 unshift @stack, ~(shift @stack);
138 unshift @stack, log shift @stack;
141 unshift @stack, 10 ** shift @stack;
145 unshift @stack, sin shift @stack;
148 unshift @stack, cos shift @stack;
151 local $_ = shift @stack;
152 unshift @stack, sin($_) / cos($_);
156 unshift @stack, abs shift @stack;
159 unshift @stack, -shift @stack;
162 local $_ = shift @stack;
163 $stack[1] = $_ if $_<$stack[1];
185 addstr($height+1, 0, "> ");
188 addstr($height+1, 2, showval($val[0], $base));
194 while (defined (my $key = ReadKey -1)) {
196 } # read additional keys
199 exists $alias{$_} and $_ = $alias{$_};
200 exists $falias{$_} and $_ = $menu[$falias{$_}];
205 elsif ($_ eq chr 27) {
210 unshift @stack, $val[0] and showstack() unless $nopush;
211 @val = (0, 0) if $nopush<2; # replace current
216 elsif ($val[1] *= 10) {
217 $val[0] += $_/$val[1];
220 $val[0] = $val[0]*10+$_;
223 elsif ($_ eq chr 127) {
224 if ($val[1] = int $val[1]/10) {
225 $val[0] = int($val[0]*$val[1])/$val[1];
227 $val[0] = int $val[0]/10
231 elsif (exists $action{$_}) {
232 unshift @stack, $val[0];
235 $val[0] = shift @stack;
240 print "\n* error: ", join(' ', map ord, split //, $_), "\n";