2007-06-26 13:19:05 +04:00
|
|
|
# data file for the Fltk User Interface Designer (fluid)
|
|
|
|
version 1.0108
|
|
|
|
header_name {.h}
|
|
|
|
code_name {.cpp}
|
|
|
|
decl {\#include <stdio.h>} {}
|
|
|
|
|
|
|
|
decl {\#include <stdlib.h>} {selected global
|
|
|
|
}
|
|
|
|
|
|
|
|
decl {\#include <string.h>} {global
|
|
|
|
}
|
|
|
|
|
|
|
|
decl {\#include "math.h"} {}
|
|
|
|
|
|
|
|
Function {gammaln(double xx)} {open private return_type double
|
|
|
|
} {
|
|
|
|
code {int j;
|
|
|
|
double x,y,tmp,ser;
|
|
|
|
static double cof[6] = {76.18009172947146,
|
|
|
|
-86.50532032941677,
|
|
|
|
24.01409824083091,
|
|
|
|
-1.231739572450155,
|
|
|
|
0.1208650973866179e-2,
|
|
|
|
-0.5395239384953e-5};
|
|
|
|
|
|
|
|
y = x = xx;
|
|
|
|
tmp = x + 5.5;
|
|
|
|
tmp -= (x+0.5)*log(tmp);
|
|
|
|
ser = 1.000000000190015;
|
|
|
|
for (j=0;j<6;j++) ser += cof[j]/++y;
|
|
|
|
return -tmp+log(2.5066282746310005*ser/x);} {}
|
|
|
|
}
|
|
|
|
|
|
|
|
Function {truncf(double x)} {private return_type double
|
|
|
|
} {
|
|
|
|
code {if (x < 0.0)
|
|
|
|
x = -floor(-x);
|
|
|
|
else
|
|
|
|
x = floor(x);
|
|
|
|
return x;} {}
|
|
|
|
}
|
|
|
|
|
|
|
|
class SciCalc {open
|
|
|
|
} {
|
|
|
|
decl {enum {MaxNumBrkts=10};} {}
|
|
|
|
decl {enum Operator {PLUS,MINUS,MULT,DIV,POW,INVPOW,EVAL};} {}
|
|
|
|
decl {enum mode {NONE=0,DOT=-1,NORM=-2,EXP=-3};} {}
|
|
|
|
declblock {/* members */} {after {/********/}
|
|
|
|
} {
|
|
|
|
decl {double value[4*(MaxNumBrkts+1)]; /* The values on the stack */} {}
|
|
|
|
decl {int priority[6]; /* the priorities of each operator */} {}
|
|
|
|
decl {int oper[3*(MaxNumBrkts+1)]; /* the operators between them */} {}
|
|
|
|
decl {int top; /* the top of the stack */} {}
|
|
|
|
decl {int startbrkt[(MaxNumBrkts+1)]; /* the positions of the left brackets */} {}
|
|
|
|
decl {int currentbrkt; /* bracketing we are in */} {}
|
|
|
|
decl {double mem; /* The memory value */} {}
|
|
|
|
decl {int ready; /* Whether last number is ready.
|
|
|
|
if "ready" is set, then typing another number
|
|
|
|
overwrites the current number. */} {}
|
|
|
|
decl {int dot; /* Whether the dot has been typed */} {}
|
|
|
|
decl {double diver; /* The divider when behind the dot */} {}
|
|
|
|
decl {int behind; /* Number of digits behind dot */} {}
|
|
|
|
decl {int inv; /* Whether inverse key is depressed */} {}
|
|
|
|
decl {int emode; /* Whether we are entering the exponent */} {}
|
|
|
|
decl {int exponent; /* the exponent value whilst entering exponent */} {}
|
|
|
|
decl {double mantissa; /* the mantissa value whilst entering exponent */} {}
|
|
|
|
decl {int base; /* the base we are working in (2,8,10 or 16) */} {}
|
|
|
|
decl {int drgmode; /* whether we are in deg, rad or grad mode */} {}
|
|
|
|
}
|
|
|
|
Function {SciCalc()} {open
|
|
|
|
} {
|
|
|
|
Fl_Window win {
|
2008-01-14 15:58:55 +03:00
|
|
|
label ecalc open
|
2007-06-26 13:19:05 +04:00
|
|
|
private xywh {528 286 181 262} type Double visible
|
|
|
|
} {
|
|
|
|
Fl_Box leddisplay {
|
|
|
|
label {0 }
|
|
|
|
private xywh {5 3 172 24} box DOWN_BOX color 207 labelfont 1 labelsize 16 labelcolor 59 align 24
|
|
|
|
}
|
|
|
|
Fl_Box box_DEGRAD {
|
|
|
|
label { }
|
|
|
|
private xywh {24 27 35 15} box ENGRAVED_BOX labelsize 9 align 16
|
|
|
|
}
|
|
|
|
Fl_Box box_bracket {
|
|
|
|
private xywh {59 27 65 15} box ENGRAVED_BOX labelsize 9 align 16
|
|
|
|
}
|
|
|
|
Fl_Box box_M {
|
|
|
|
label M
|
|
|
|
private xywh {124 27 35 15} box ENGRAVED_BOX labelsize 9 align 16
|
|
|
|
}
|
|
|
|
Fl_Group {} {open
|
|
|
|
private xywh {46 44 93 22} color 46
|
|
|
|
} {
|
|
|
|
Fl_Button radio_2 {
|
|
|
|
label 2
|
|
|
|
callback {change_base(2);}
|
|
|
|
private xywh {49 48 20 15} type Radio labelsize 10 labelcolor 1
|
|
|
|
}
|
|
|
|
Fl_Button radio_8 {
|
|
|
|
label 8
|
|
|
|
callback {change_base(8);}
|
|
|
|
private xywh {70 48 21 15} type Radio labelsize 10 labelcolor 1
|
|
|
|
}
|
|
|
|
Fl_Button radio_10 {
|
|
|
|
label 10
|
|
|
|
callback {change_base(10);}
|
|
|
|
private xywh {92 48 21 15} type Radio value 1 labelsize 10 labelcolor 1
|
|
|
|
}
|
|
|
|
Fl_Button radio_16 {
|
|
|
|
label 16
|
|
|
|
callback {change_base(16);}
|
|
|
|
private xywh {114 48 21 15} type Radio labelsize 10 labelcolor 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Fl_Group {} {open
|
|
|
|
private xywh {3 163 107 94} box FLAT_BOX color 43
|
|
|
|
} {
|
|
|
|
Fl_Button but_7 {
|
|
|
|
label 7
|
|
|
|
callback {handle_number(7);}
|
|
|
|
private xywh {6 167 32 20} shortcut 0x37 labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_8 {
|
|
|
|
label 8
|
|
|
|
callback {handle_number(8);}
|
|
|
|
private xywh {41 167 32 20} shortcut 0x38 labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_9 {
|
|
|
|
label 9
|
|
|
|
callback {handle_number(9);}
|
|
|
|
private xywh {75 167 32 20} shortcut 0x39 labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_4 {
|
|
|
|
label 4
|
|
|
|
callback {handle_number(4);}
|
|
|
|
private xywh {6 189 32 20} shortcut 0x34 labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_5 {
|
|
|
|
label 5
|
|
|
|
callback {handle_number(5);}
|
|
|
|
private xywh {41 189 32 20} shortcut 0x35 labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_6 {
|
|
|
|
label 6
|
|
|
|
callback {handle_number(6);}
|
|
|
|
private xywh {75 189 32 20} shortcut 0x36 labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_1 {
|
|
|
|
label 1
|
|
|
|
callback {handle_number(1);}
|
|
|
|
private xywh {6 211 32 20} shortcut 0x31 labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_2 {
|
|
|
|
label 2
|
|
|
|
callback {handle_number(2);}
|
|
|
|
private xywh {41 211 32 20} shortcut 0x32 labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_3 {
|
|
|
|
label 3
|
|
|
|
callback {handle_number(3);}
|
|
|
|
private xywh {75 211 32 20} shortcut 0x33 labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_0 {
|
|
|
|
label 0
|
|
|
|
callback {handle_number(0);}
|
|
|
|
private xywh {6 233 32 20} shortcut 0x30 labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_dot {
|
|
|
|
label {.}
|
|
|
|
callback {handle_number(DOT);}
|
|
|
|
private xywh {41 233 32 20} shortcut 0x2e labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_sign {
|
|
|
|
label {+/-}
|
|
|
|
callback {if (! emode)
|
|
|
|
{
|
|
|
|
value[top] = -value[top];
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
exponent = -exponent;
|
|
|
|
value[top] = mantissa*pow(10.0, (double)exponent);
|
|
|
|
set_display(mantissa,EXP);
|
|
|
|
}}
|
|
|
|
xywh {75 233 32 20} labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Fl_Button but_C {
|
|
|
|
label C
|
|
|
|
callback {init_value(top);
|
|
|
|
set_display(0.0,NORM);}
|
|
|
|
private xywh {112 167 31 20} labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_AC {
|
|
|
|
label AC
|
|
|
|
callback {init_value(0);
|
|
|
|
set_display(0.0,NORM);
|
|
|
|
currentbrkt = 0;
|
|
|
|
box_bracket->label("");
|
|
|
|
box_bracket->redraw();}
|
|
|
|
private xywh {146 167 30 20} labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_X {
|
|
|
|
label x
|
|
|
|
callback {handle_operator(MULT);}
|
|
|
|
private xywh {112 189 31 20} shortcut 0x2a labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_div {
|
|
|
|
label {/}
|
|
|
|
callback {handle_operator(DIV);}
|
|
|
|
private xywh {146 189 30 20} shortcut 0x2f labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_plus {
|
|
|
|
label {+}
|
|
|
|
callback {handle_operator(PLUS);}
|
|
|
|
private xywh {112 211 31 20} shortcut 0x2b labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_minus {
|
|
|
|
label {-}
|
|
|
|
callback {handle_operator(MINUS);}
|
|
|
|
private xywh {146 211 30 20} shortcut 0x2d labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_pi {
|
|
|
|
label {e/p}
|
|
|
|
callback {exponent_pi();}
|
|
|
|
private xywh {112 233 31 20} labelfont 12 labelsize 17
|
|
|
|
}
|
|
|
|
Fl_Button but_eval {
|
|
|
|
label {=}
|
|
|
|
callback {handle_operator(EVAL);}
|
|
|
|
private xywh {146 233 30 20} shortcut 0x3d labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_eval_hidden {
|
|
|
|
callback {handle_operator(EVAL);}
|
|
|
|
private xywh {147 253 6 7} box NO_BOX shortcut 0xff0d labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_eval_hidden2 {
|
|
|
|
callback {handle_operator(EVAL);}
|
|
|
|
private xywh {157 263 6 7} box NO_BOX shortcut 0xff8d labelfont 1 labelsize 16
|
|
|
|
}
|
|
|
|
Fl_Button but_sqrt {
|
|
|
|
label sqrt
|
|
|
|
callback {if (base > 10) handle_number(10.0);
|
|
|
|
else
|
|
|
|
if (! inv)
|
|
|
|
{
|
|
|
|
value[top] = sqrt(value[top]);
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
value[top] = pow(value[top], 2.0);
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}}
|
|
|
|
private xywh {6 70 32 21} labelsize 11 labelcolor 4
|
|
|
|
}
|
|
|
|
Fl_Button but_pow {
|
|
|
|
label {x^y}
|
|
|
|
callback {if (base > 10)
|
|
|
|
handle_number(11.0);
|
|
|
|
else
|
|
|
|
handle_operator(check_inv->value()?INVPOW:POW);}
|
|
|
|
private xywh {41 70 32 21} labelsize 11 labelcolor 4
|
|
|
|
}
|
|
|
|
Fl_Button but_sin {
|
|
|
|
label sin
|
|
|
|
callback {if (base > 10) handle_number(12.0);
|
|
|
|
else
|
|
|
|
if (! inv)
|
|
|
|
{
|
|
|
|
value[top] = sin(to_drg(value[top]));
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
value[top] = from_drg(asin(value[top]));
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}}
|
|
|
|
private xywh {76 70 31 21} labelsize 11 labelcolor 4
|
|
|
|
}
|
|
|
|
Fl_Button but_cos {
|
|
|
|
label cos
|
|
|
|
callback {if (base > 10) handle_number(13.0);
|
|
|
|
else
|
|
|
|
if (! inv)
|
|
|
|
{
|
|
|
|
value[top] = cos(to_drg(value[top]));
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
value[top] = from_drg(acos(value[top]));
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}}
|
|
|
|
private xywh {110 70 31 21} labelsize 11 labelcolor 4
|
|
|
|
}
|
|
|
|
Fl_Button but_tan {
|
|
|
|
label tan
|
|
|
|
callback {if (base > 10) handle_number(14.0);
|
|
|
|
else
|
|
|
|
if (! inv)
|
|
|
|
{
|
|
|
|
value[top] = tan(to_drg(value[top]));
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
value[top] = from_drg(atan(value[top]));
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}}
|
|
|
|
private xywh {144 70 30 21} labelsize 11 labelcolor 4
|
|
|
|
}
|
|
|
|
Fl_Button but_log {
|
|
|
|
label log
|
|
|
|
callback {if (base > 10) handle_number(15.0);
|
|
|
|
else
|
|
|
|
if (! inv)
|
|
|
|
{
|
|
|
|
value[top] = log10(value[top]);
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
value[top] = pow(10.0, value[top]);
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}}
|
|
|
|
private xywh {6 93 32 21} labelsize 11 labelcolor 4
|
|
|
|
}
|
|
|
|
Fl_Button but_ln {
|
|
|
|
label ln
|
|
|
|
callback {if (! inv)
|
|
|
|
{
|
|
|
|
value[top] = log(value[top]);
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
value[top] = exp(value[top]);
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}}
|
|
|
|
private xywh {41 93 32 21} labelsize 11 labelcolor 4
|
|
|
|
}
|
|
|
|
Fl_Button but_int {
|
|
|
|
label int
|
|
|
|
callback {if (! inv)
|
|
|
|
{
|
|
|
|
value[top] = truncf(value[top]);
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
value[top] = value[top] - truncf(value[top]);
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}}
|
|
|
|
private xywh {76 93 31 21} labelsize 11 labelcolor 4
|
|
|
|
}
|
|
|
|
Fl_Button but_dr {
|
|
|
|
label {d->r}
|
|
|
|
callback {if (! inv)
|
|
|
|
{
|
|
|
|
value[top] = M_PI*value[top]/180.0;
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
value[top] = 180.0*value[top]/M_PI;
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}}
|
|
|
|
private xywh {110 93 31 21} labelsize 10 labelcolor 4
|
|
|
|
}
|
|
|
|
Fl_Button but_drg {
|
|
|
|
label {d-r-g}
|
|
|
|
callback {drgmode++;
|
|
|
|
drgmode %= 3;
|
|
|
|
set_drgdisp();}
|
|
|
|
private xywh {144 93 30 21} labelsize 9
|
|
|
|
}
|
|
|
|
Fl_Button but_leftbr {
|
|
|
|
label {[}
|
|
|
|
callback {add_left_bracket();}
|
|
|
|
private xywh {6 116 32 21} shortcut 0x28 labelsize 11
|
|
|
|
}
|
|
|
|
Fl_Button but_rightbr {
|
|
|
|
label {]}
|
|
|
|
callback {add_right_bracket();}
|
|
|
|
private xywh {41 116 32 21} shortcut 0x29 labelsize 11
|
|
|
|
}
|
|
|
|
Fl_Button but_exch {
|
|
|
|
label exch
|
|
|
|
callback {exchange();}
|
|
|
|
private xywh {76 116 31 21} labelsize 11
|
|
|
|
}
|
|
|
|
Fl_Button but_invx {
|
|
|
|
label {1/x}
|
|
|
|
callback {value[top] = 1.0/value[top];
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;}
|
|
|
|
private xywh {110 116 31 21} labelsize 11
|
|
|
|
}
|
|
|
|
Fl_Button but_fact {
|
|
|
|
label {x!}
|
|
|
|
callback {factorial();}
|
|
|
|
private xywh {144 116 30 21} labelsize 11
|
|
|
|
}
|
|
|
|
Fl_Button but_Mplus {
|
|
|
|
label {M+}
|
|
|
|
callback {if (! inv) mem += value[top]; else mem -= value[top];
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
set_memdisp();}
|
|
|
|
private xywh {6 139 32 21} color 93 labelcolor 4
|
|
|
|
}
|
|
|
|
Fl_Button but_Mmult {
|
|
|
|
label {M*}
|
|
|
|
callback {if (! inv) mem *= value[top]; else mem /= value[top];
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
set_memdisp();}
|
|
|
|
private xywh {41 139 32 21} color 93 labelcolor 4
|
|
|
|
}
|
|
|
|
Fl_Button but_Mclear {
|
|
|
|
label MC
|
|
|
|
callback {if (! inv)
|
|
|
|
{
|
|
|
|
mem = 0.0;
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
set_memdisp();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
memexch();}
|
|
|
|
private xywh {76 139 31 21} color 93 labelcolor 4
|
|
|
|
}
|
|
|
|
Fl_Button but_Mst {
|
|
|
|
label Mst
|
|
|
|
callback {mem = value[top];
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
set_memdisp();}
|
|
|
|
private xywh {110 139 31 21} color 93
|
|
|
|
}
|
|
|
|
Fl_Button but_Mrc {
|
|
|
|
label Mrc
|
|
|
|
callback {value[top] = mem;
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;}
|
|
|
|
private xywh {144 139 30 21} color 93
|
|
|
|
}
|
|
|
|
Fl_Button check_inv {
|
|
|
|
label inv
|
|
|
|
callback {if (inv)
|
|
|
|
{
|
|
|
|
inv = 0;
|
|
|
|
setnormlabels();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
inv = 1;
|
|
|
|
setinvlabels();
|
|
|
|
}}
|
|
|
|
private xywh {6 44 32 21} type Toggle labelsize 11 labelcolor 4
|
|
|
|
}
|
|
|
|
Fl_Button but_quit {
|
|
|
|
label Exit
|
|
|
|
callback {win->hide();
|
|
|
|
delete win;}
|
|
|
|
private xywh {145 44 29 21} labelfont 1 labelcolor 33
|
|
|
|
}
|
|
|
|
}
|
|
|
|
code {init_value(0);
|
|
|
|
drgmode = 1;
|
|
|
|
base = 10;
|
|
|
|
currentbrkt = 0;
|
|
|
|
startbrkt[0] = 0;
|
|
|
|
|
|
|
|
set_memdisp();
|
|
|
|
set_brktdisp();
|
|
|
|
radio_10->value(1);
|
|
|
|
set_drgdisp();
|
|
|
|
set_display(0.0,NONE);} {}
|
|
|
|
}
|
|
|
|
Function {~SciCalc()} {} {}
|
|
|
|
Function {run(int px=-1,int py=-1)} {open
|
|
|
|
} {
|
|
|
|
code {win->show();
|
|
|
|
Fl::run();} {}
|
|
|
|
}
|
|
|
|
Function {handle_number(double numb)} {private
|
|
|
|
} {
|
|
|
|
code {int first;
|
|
|
|
double sign;
|
|
|
|
|
|
|
|
if (ready) init_value(top);
|
|
|
|
|
|
|
|
if (numb == -1.0)
|
|
|
|
if (dot) /* check whether we already have a dot */
|
|
|
|
return;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
dot = 1;
|
|
|
|
set_display(value[top],DOT);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (emode)
|
|
|
|
{
|
|
|
|
sign = copysign(1.0, (double)exponent);
|
|
|
|
if (abs(exponent)*10 + numb > 999)
|
|
|
|
{ /* cycle if exponent has > 3 digits */
|
|
|
|
first = (int)floor((double)abs(exponent)/100.0);
|
|
|
|
exponent = abs(exponent) - 100*first;
|
|
|
|
exponent *= (int)sign;
|
|
|
|
}
|
|
|
|
exponent = exponent*10 + (int) (sign*numb);
|
|
|
|
value[top] = mantissa*pow(10.0, (double)exponent);
|
|
|
|
set_display(mantissa, EXP);
|
|
|
|
}
|
|
|
|
else if (numb < base)
|
|
|
|
{ /* both decimal and non decimal number entry */
|
|
|
|
sign = copysign(1.0, value[top]);
|
|
|
|
if (dot && behind < 9)
|
|
|
|
{
|
|
|
|
behind++;
|
|
|
|
diver = diver/(double)base;
|
|
|
|
value[top] += sign*diver*numb;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
if ((! dot) && (value[top] < 1.0e10))
|
|
|
|
value[top] = (double)base*value[top] + sign*numb;
|
|
|
|
|
|
|
|
set_display(value[top],(mode)behind);
|
|
|
|
}} {}
|
|
|
|
}
|
|
|
|
Function {handle_operator(Operator op)} {private
|
|
|
|
} {
|
|
|
|
code {int prevop, i, finished;
|
|
|
|
|
|
|
|
switch (op)
|
|
|
|
{
|
|
|
|
case PLUS:
|
|
|
|
case MINUS:
|
|
|
|
case MULT:
|
|
|
|
case DIV:
|
|
|
|
case POW:
|
|
|
|
case INVPOW:
|
|
|
|
finished = 0;
|
|
|
|
do
|
|
|
|
{
|
|
|
|
if (top == startbrkt[currentbrkt]) finished = 1; /* is 1st operator */
|
|
|
|
if (! finished)
|
|
|
|
{ /* compare priority of previous operators with current op */
|
|
|
|
prevop = oper[top-1];
|
|
|
|
if (priority[prevop] < priority[op])
|
|
|
|
finished = 1;
|
|
|
|
else
|
|
|
|
{ /* last op can be calculated */
|
|
|
|
top--;
|
|
|
|
calc(top);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} while (! finished);
|
|
|
|
|
|
|
|
oper[top] = op;
|
|
|
|
init_value(top+1);
|
|
|
|
|
|
|
|
set_display(value[top-1],NORM);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case EVAL:
|
|
|
|
while (currentbrkt > 0) add_right_bracket();
|
|
|
|
for (i = top; i > 0; i--) calc(i-1);
|
|
|
|
top = 0;
|
|
|
|
ready = 1;
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
break;
|
|
|
|
}} {}
|
|
|
|
}
|
|
|
|
Function {change_base(int newbase)} {open private
|
|
|
|
} {
|
|
|
|
code {int oldbase;
|
|
|
|
|
|
|
|
oldbase = base;
|
|
|
|
base = newbase;
|
|
|
|
|
|
|
|
set_display(value[top], NORM);
|
|
|
|
ready = 1;
|
|
|
|
if ((oldbase == 16) || (base == 16)) setnormlabels();} {}
|
|
|
|
}
|
|
|
|
Function {set_display(double val,mode behind)} {open private
|
|
|
|
} {
|
|
|
|
code {int i;
|
|
|
|
char dispstr[40], expstr[10], str2[10];
|
|
|
|
|
|
|
|
/* number or operator handled to get here so reset inv stuff */
|
|
|
|
/*
|
|
|
|
if (inv)
|
|
|
|
{
|
|
|
|
inv = 0;
|
|
|
|
check_inv->value(0);
|
|
|
|
setnormlabels();
|
|
|
|
}*/
|
|
|
|
if (behind >= 0)
|
|
|
|
{ /* format with appropriate number of decimal places */
|
|
|
|
if (base == 10)
|
|
|
|
{
|
|
|
|
emode = 0;
|
|
|
|
strcpy(str2,"%.1f");
|
|
|
|
str2[2] = behind + '0';
|
|
|
|
sprintf(dispstr,str2,val);
|
|
|
|
}
|
|
|
|
else /* non base 10 display */
|
|
|
|
cvttobase(val, base, behind, dispstr);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
if (behind == DOT)
|
|
|
|
{ /* display the . at the right */
|
|
|
|
if (base == 10)
|
|
|
|
{
|
|
|
|
emode = 0;
|
|
|
|
sprintf(dispstr,"%.1f",val);
|
|
|
|
dispstr[strlen(dispstr)-1] = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
cvttobase(val, base, behind, dispstr);
|
|
|
|
}
|
|
|
|
else if (behind == NORM)
|
|
|
|
{ /* normal display */
|
|
|
|
if (base == 10)
|
|
|
|
{
|
|
|
|
emode = 0;
|
|
|
|
sprintf(dispstr,"%.9g",val);
|
|
|
|
}
|
|
|
|
else /* non base 10 display */
|
|
|
|
cvttobase(val, base, behind, dispstr);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{ /* exponent entering display */
|
|
|
|
sprintf(dispstr,"%.8f",val);
|
|
|
|
for (i = strlen(dispstr); dispstr[i-1] == '0'; i--);
|
|
|
|
dispstr[i] =0;
|
|
|
|
strcat(dispstr, "e");
|
|
|
|
sprintf(expstr,"%d",exponent);
|
|
|
|
strcat(dispstr, expstr);
|
|
|
|
}
|
|
|
|
strcat(dispstr," ");
|
|
|
|
dispstr[17] = 0;
|
|
|
|
leddisplay->copy_label(dispstr);
|
|
|
|
leddisplay->redraw();} {}
|
|
|
|
}
|
|
|
|
Function {set_memdisp()} {open private
|
|
|
|
} {
|
|
|
|
code {if (mem)
|
|
|
|
box_M->label("M");
|
|
|
|
else
|
|
|
|
box_M->label("");
|
|
|
|
box_M->redraw();} {}
|
|
|
|
}
|
|
|
|
Function {set_drgdisp()} {open private
|
|
|
|
} {
|
|
|
|
code {if (drgmode == 0)
|
|
|
|
box_DEGRAD->label("DEG");
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (drgmode == 1)
|
|
|
|
box_DEGRAD->label("RAD");
|
|
|
|
else
|
|
|
|
box_DEGRAD->label("GRAD");
|
|
|
|
}
|
|
|
|
box_DEGRAD->redraw();} {}
|
|
|
|
}
|
|
|
|
Function {set_brktdisp()} {open private
|
|
|
|
} {
|
|
|
|
code {char dispstr[40];
|
|
|
|
|
|
|
|
if (currentbrkt > 0)
|
|
|
|
{
|
|
|
|
sprintf(dispstr, "%d [ max %d", currentbrkt, MaxNumBrkts);
|
|
|
|
box_bracket->copy_label(dispstr);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
box_bracket->label("");
|
|
|
|
box_bracket->redraw();} {}
|
|
|
|
}
|
|
|
|
Function {add_left_bracket()} {private
|
|
|
|
} {
|
|
|
|
code {if (currentbrkt < MaxNumBrkts)
|
|
|
|
{
|
|
|
|
currentbrkt++;
|
|
|
|
startbrkt[currentbrkt] = top;
|
|
|
|
ready = 1;
|
|
|
|
set_brktdisp();
|
|
|
|
}} {}
|
|
|
|
}
|
|
|
|
Function {add_right_bracket()} {private
|
|
|
|
} {
|
|
|
|
code {int i;
|
|
|
|
|
|
|
|
if (currentbrkt > 0)
|
|
|
|
{
|
|
|
|
for (i = top; i > startbrkt[currentbrkt]; i--) calc(i-1);
|
|
|
|
top = startbrkt[currentbrkt];
|
|
|
|
currentbrkt--;
|
|
|
|
ready = 1;
|
|
|
|
}
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
set_brktdisp();} {}
|
|
|
|
}
|
|
|
|
Function {factorial()} {open
|
|
|
|
} {
|
|
|
|
code {double lg, alpha;
|
|
|
|
|
|
|
|
/* uses gamma functions to get result for non-integer values */
|
|
|
|
|
|
|
|
alpha = value[top] + 1.0;
|
|
|
|
if ((floor(alpha) == alpha)&&(alpha <= 0.0))
|
|
|
|
{
|
|
|
|
init_value(0);
|
|
|
|
leddisplay->label("Error: -ve integer ");
|
|
|
|
leddisplay->redraw();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
if (alpha > 32)
|
|
|
|
{
|
|
|
|
lg = exp(gammaln(alpha));
|
|
|
|
value[top] = lg;
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
if (alpha > 1.0)
|
|
|
|
{
|
|
|
|
int n = (int)truncf(alpha);
|
|
|
|
lg = 1.0;
|
|
|
|
for (int i = 1; i <n; i++) lg *= i;
|
|
|
|
value[top] = lg;
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}} {}
|
|
|
|
}
|
|
|
|
Function {exchange()} {} {
|
|
|
|
code {double temp;
|
|
|
|
|
|
|
|
/* check if we have 2 values to exchange */
|
|
|
|
if (top > startbrkt[currentbrkt]) {
|
|
|
|
temp = value[top];
|
|
|
|
value[top] = value[top-1];
|
|
|
|
value[top-1] = temp;
|
|
|
|
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}} {}
|
|
|
|
}
|
|
|
|
Function {exponent_pi()} {} {
|
|
|
|
code {if ((value[top] == 0.0) || (ready)) {
|
|
|
|
value[top] = M_PI;
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}
|
|
|
|
else if ((! emode) && (base == 10)) {
|
|
|
|
emode = 1;
|
|
|
|
exponent = 0;
|
|
|
|
mantissa = value[top];
|
|
|
|
set_display(mantissa,EXP);
|
|
|
|
}} {}
|
|
|
|
}
|
|
|
|
Function {calc(int i)} {} {
|
|
|
|
code {switch (oper[i])
|
|
|
|
{
|
|
|
|
case PLUS: value[i] += value[i+1]; break;
|
|
|
|
case MINUS: value[i] -= value[i+1]; break;
|
|
|
|
case MULT: value[i] *= value[i+1]; break;
|
|
|
|
case DIV: value[i] /= value[i+1]; break;
|
|
|
|
case POW: value[i] = pow(value[i], value[i+1]); break;
|
|
|
|
case INVPOW: value[i] = pow(value[i], 1.0/value[i+1]); break;
|
|
|
|
}} {}
|
|
|
|
}
|
|
|
|
Function {init_value(int lev)} {open private
|
|
|
|
} {
|
|
|
|
code {top = lev;
|
|
|
|
value[top] = 0.0;
|
|
|
|
ready = 0;
|
|
|
|
emode = 0;
|
|
|
|
dot = 0;
|
|
|
|
diver = 1.0;
|
|
|
|
behind = 0;
|
|
|
|
if (inv)
|
|
|
|
{
|
|
|
|
inv = 0;
|
|
|
|
check_inv->value(0);
|
|
|
|
setnormlabels();
|
|
|
|
}} {}
|
|
|
|
}
|
|
|
|
Function {cvttobase(double num,int base,mode behind,char *str)} {private
|
|
|
|
} {
|
|
|
|
code {double sign, div;
|
|
|
|
int place, digit, i;
|
|
|
|
char digstr[2];
|
|
|
|
|
|
|
|
sign = copysign(1.0, num);
|
|
|
|
num *= sign;
|
|
|
|
if (sign == -1.0)
|
|
|
|
sprintf(str, "-");
|
|
|
|
else
|
|
|
|
str[0] = 0;
|
|
|
|
|
|
|
|
if (num == 0.0)
|
|
|
|
{
|
|
|
|
sprintf(str, "0");
|
|
|
|
if (behind > 0)
|
|
|
|
{
|
|
|
|
strcat(str, ".");
|
|
|
|
for(i = 0; i < behind; i++) strcat(str, "0");
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
place = (int)( log(num)/log((double)base) );
|
|
|
|
if (place < 0) place = 0;
|
|
|
|
do
|
|
|
|
{
|
|
|
|
div = pow((double)base, (double)place);
|
|
|
|
digit = (int)(num/div);
|
|
|
|
num -= (double)digit*div;
|
|
|
|
if (place == -1) strcat(str, ".");
|
|
|
|
place--;
|
|
|
|
sprintf(digstr, "%x", digit);
|
|
|
|
strcat(str, digstr);
|
|
|
|
if (strlen(str) > 18)
|
|
|
|
{
|
|
|
|
sprintf(str, "can't display");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
} while ((place >= 0) || ((place >= -9) && (num != 0.0)));
|
|
|
|
|
|
|
|
if ((place == -1) && ((behind == DOT) || (behind > 0)))
|
|
|
|
strcat(str, ".");
|
|
|
|
while ((behind > 0) && (behind >= -place))
|
|
|
|
{
|
|
|
|
strcat(str, "0");
|
|
|
|
place--;
|
|
|
|
}} {}
|
|
|
|
}
|
|
|
|
Function {setnormlabels()} {open private
|
|
|
|
} {
|
|
|
|
code {if (base <= 10)
|
|
|
|
{
|
|
|
|
but_sqrt->label("sqrt"); but_sqrt->shortcut(0);
|
|
|
|
but_pow->label("x^y"); but_pow->shortcut(0);
|
|
|
|
but_sin->label("sin"); but_sin->shortcut(0);
|
|
|
|
but_cos->label("cos"); but_cos->shortcut(0);
|
|
|
|
but_tan->label("tan"); but_tan->shortcut(0);
|
|
|
|
but_log->label("log"); but_log->shortcut(0);
|
|
|
|
but_sqrt->labelcolor(FL_BLUE);
|
|
|
|
but_pow->labelcolor(FL_BLUE);
|
|
|
|
but_sin->labelcolor(FL_BLUE);
|
|
|
|
but_cos->labelcolor(FL_BLUE);
|
|
|
|
but_tan->labelcolor(FL_BLUE);
|
|
|
|
but_log->labelcolor(FL_BLUE);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
but_sqrt->label("a"); but_sqrt->shortcut('a');
|
|
|
|
but_pow->label("b"); but_pow->shortcut('b');
|
|
|
|
but_sin->label("c"); but_sin->shortcut('c');
|
|
|
|
but_cos->label("d"); but_cos->shortcut('d');
|
|
|
|
but_tan->label("e"); but_tan->shortcut('e');
|
|
|
|
but_log->label("f"); but_log->shortcut('f');
|
|
|
|
but_sqrt->labelcolor(FL_BLACK);
|
|
|
|
but_pow->labelcolor(FL_BLACK);
|
|
|
|
but_sin->labelcolor(FL_BLACK);
|
|
|
|
but_cos->labelcolor(FL_BLACK);
|
|
|
|
but_tan->labelcolor(FL_BLACK);
|
|
|
|
but_log->labelcolor(FL_BLACK);
|
|
|
|
}
|
|
|
|
but_ln->label("ln");
|
|
|
|
but_int->label("int");
|
|
|
|
but_dr->label("d->r");
|
|
|
|
but_Mplus->label("M+");
|
|
|
|
but_Mmult->label("M*");
|
|
|
|
but_Mclear->label("MC");
|
|
|
|
but_sqrt->redraw();
|
|
|
|
but_pow->redraw();
|
|
|
|
but_sin->redraw();
|
|
|
|
but_cos->redraw();
|
|
|
|
but_tan->redraw();
|
|
|
|
but_log->redraw();
|
|
|
|
but_ln->redraw();
|
|
|
|
but_int->redraw();
|
|
|
|
but_dr->redraw();
|
|
|
|
but_Mplus->redraw();
|
|
|
|
but_Mmult->redraw();
|
|
|
|
but_Mclear->redraw();} {}
|
|
|
|
}
|
|
|
|
Function {setinvlabels()} {private
|
|
|
|
} {
|
|
|
|
code {if (base <= 10)
|
|
|
|
{
|
|
|
|
but_sqrt->label("x^2");
|
|
|
|
but_pow->label("x^1/y");
|
|
|
|
but_sin->label("asin");
|
|
|
|
but_cos->label("acos");
|
|
|
|
but_tan->label("atan");
|
|
|
|
but_log->label("10^x");
|
|
|
|
but_sqrt->labelcolor(FL_BLUE);
|
|
|
|
but_pow->labelcolor(FL_BLUE);
|
|
|
|
but_sin->labelcolor(FL_BLUE);
|
|
|
|
but_cos->labelcolor(FL_BLUE);
|
|
|
|
but_tan->labelcolor(FL_BLUE);
|
|
|
|
but_log->labelcolor(FL_BLUE);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
but_sqrt->label("a");
|
|
|
|
but_pow->label("b");
|
|
|
|
but_sin->label("c");
|
|
|
|
but_cos->label("d");
|
|
|
|
but_tan->label("e");
|
|
|
|
but_log->label("f");
|
|
|
|
but_sqrt->labelcolor(FL_BLACK);
|
|
|
|
but_pow->labelcolor(FL_BLACK);
|
|
|
|
but_sin->labelcolor(FL_BLACK);
|
|
|
|
but_cos->labelcolor(FL_BLACK);
|
|
|
|
but_tan->labelcolor(FL_BLACK);
|
|
|
|
but_log->labelcolor(FL_BLACK);
|
|
|
|
}
|
|
|
|
but_ln->label("e^x");
|
|
|
|
but_int->label("frac");
|
|
|
|
but_dr->label("r->d");
|
|
|
|
but_Mplus->label("M-");
|
|
|
|
but_Mmult->label("M/");
|
|
|
|
but_Mclear->label("Mex");
|
|
|
|
but_sqrt->redraw();
|
|
|
|
but_pow->redraw();
|
|
|
|
but_sin->redraw();
|
|
|
|
but_cos->redraw();
|
|
|
|
but_tan->redraw();
|
|
|
|
but_log->redraw();
|
|
|
|
but_ln->redraw();
|
|
|
|
but_int->redraw();
|
|
|
|
but_dr->redraw();
|
|
|
|
but_Mplus->redraw();
|
|
|
|
but_Mmult->redraw();
|
|
|
|
but_Mclear->redraw();} {}
|
|
|
|
}
|
|
|
|
Function {mem_exchange()} {private
|
|
|
|
} {
|
|
|
|
code {double temp;
|
|
|
|
|
|
|
|
temp = mem;
|
|
|
|
mem = value[top];
|
|
|
|
value[top] = temp;
|
|
|
|
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
set_memdisp();} {}
|
|
|
|
code {printf("Hello, World!\\n");} {}
|
|
|
|
}
|
|
|
|
Function {to_drg(double angle)} {private return_type double
|
|
|
|
} {
|
|
|
|
code {if (drgmode == 0)
|
|
|
|
return (M_PI*angle/180.0);
|
|
|
|
else
|
|
|
|
if (drgmode == 2)
|
|
|
|
return (M_PI*angle/100.0);
|
|
|
|
else
|
|
|
|
return (angle);} {}
|
|
|
|
}
|
|
|
|
Function {from_drg(double angle)} {private return_type double
|
|
|
|
} {
|
|
|
|
code {if (drgmode == 0)
|
|
|
|
return (180.0*angle/M_PI);
|
|
|
|
else
|
|
|
|
if (drgmode == 2)
|
|
|
|
return (100.0*angle/M_PI);
|
|
|
|
else
|
|
|
|
return (angle);} {}
|
|
|
|
}
|
|
|
|
Function {memexch()} {open
|
|
|
|
} {
|
|
|
|
code {double temp;
|
|
|
|
|
|
|
|
temp = mem;
|
|
|
|
mem = value[top];
|
|
|
|
value[top] = temp;
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
set_memdisp();} {}
|
|
|
|
}
|
|
|
|
}
|