2007-06-26 13:19:05 +04:00
|
|
|
// generated by Fast Light User Interface Designer (fluid) version 1.0108
|
|
|
|
|
|
|
|
#include "SciCalc.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include "math.h"
|
|
|
|
|
|
|
|
static double gammaln(double xx) {
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
static double truncf(double x) {
|
|
|
|
if (x < 0.0)
|
|
|
|
x = -floor(-x);
|
|
|
|
else
|
|
|
|
x = floor(x);
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_radio_2_i(Fl_Button*, void*) {
|
|
|
|
change_base(2);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_radio_2(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_radio_2_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_radio_8_i(Fl_Button*, void*) {
|
|
|
|
change_base(8);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_radio_8(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_radio_8_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_radio_10_i(Fl_Button*, void*) {
|
|
|
|
change_base(10);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_radio_10(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_radio_10_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_radio_16_i(Fl_Button*, void*) {
|
|
|
|
change_base(16);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_radio_16(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_radio_16_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_7_i(Fl_Button*, void*) {
|
|
|
|
handle_number(7);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_7(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_but_7_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_8_i(Fl_Button*, void*) {
|
|
|
|
handle_number(8);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_8(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_but_8_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_9_i(Fl_Button*, void*) {
|
|
|
|
handle_number(9);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_9(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_but_9_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_4_i(Fl_Button*, void*) {
|
|
|
|
handle_number(4);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_4(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_but_4_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_5_i(Fl_Button*, void*) {
|
|
|
|
handle_number(5);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_5(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_but_5_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_6_i(Fl_Button*, void*) {
|
|
|
|
handle_number(6);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_6(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_but_6_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_1_i(Fl_Button*, void*) {
|
|
|
|
handle_number(1);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_1(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_but_1_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_2_i(Fl_Button*, void*) {
|
|
|
|
handle_number(2);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_2(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_but_2_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_3_i(Fl_Button*, void*) {
|
|
|
|
handle_number(3);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_3(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_but_3_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_0_i(Fl_Button*, void*) {
|
|
|
|
handle_number(0);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_0(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_but_0_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_dot_i(Fl_Button*, void*) {
|
|
|
|
handle_number(DOT);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_dot(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_but_dot_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_sign_i(Fl_Button*, void*) {
|
|
|
|
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);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_sign(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->parent()->user_data()))->cb_but_sign_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_C_i(Fl_Button*, void*) {
|
|
|
|
init_value(top);
|
|
|
|
set_display(0.0,NORM);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_C(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_C_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_AC_i(Fl_Button*, void*) {
|
|
|
|
init_value(0);
|
|
|
|
set_display(0.0,NORM);
|
|
|
|
currentbrkt = 0;
|
|
|
|
box_bracket->label("");
|
|
|
|
box_bracket->redraw();
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_AC(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_AC_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_X_i(Fl_Button*, void*) {
|
|
|
|
handle_operator(MULT);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_X(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_X_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_div_i(Fl_Button*, void*) {
|
|
|
|
handle_operator(DIV);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_div(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_div_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_plus_i(Fl_Button*, void*) {
|
|
|
|
handle_operator(PLUS);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_plus(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_plus_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_minus_i(Fl_Button*, void*) {
|
|
|
|
handle_operator(MINUS);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_minus(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_minus_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_pi_i(Fl_Button*, void*) {
|
|
|
|
exponent_pi();
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_pi(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_pi_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_eval_i(Fl_Button*, void*) {
|
|
|
|
handle_operator(EVAL);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_eval(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_eval_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_eval_hidden_i(Fl_Button*, void*) {
|
|
|
|
handle_operator(EVAL);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_eval_hidden(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_eval_hidden_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_eval_hidden2_i(Fl_Button*, void*) {
|
|
|
|
handle_operator(EVAL);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_eval_hidden2(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_eval_hidden2_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_sqrt_i(Fl_Button*, void*) {
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_sqrt(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_sqrt_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_pow_i(Fl_Button*, void*) {
|
|
|
|
if (base > 10)
|
|
|
|
handle_number(11.0);
|
|
|
|
else
|
|
|
|
handle_operator(check_inv->value()?INVPOW:POW);
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_pow(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_pow_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_sin_i(Fl_Button*, void*) {
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_sin(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_sin_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_cos_i(Fl_Button*, void*) {
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_cos(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_cos_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_tan_i(Fl_Button*, void*) {
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_tan(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_tan_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_log_i(Fl_Button*, void*) {
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_log(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_log_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_ln_i(Fl_Button*, void*) {
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_ln(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_ln_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_int_i(Fl_Button*, void*) {
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_int(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_int_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_dr_i(Fl_Button*, void*) {
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_dr(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_dr_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_drg_i(Fl_Button*, void*) {
|
|
|
|
drgmode++;
|
|
|
|
drgmode %= 3;
|
|
|
|
set_drgdisp();
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_drg(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_drg_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_leftbr_i(Fl_Button*, void*) {
|
|
|
|
add_left_bracket();
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_leftbr(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_leftbr_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_rightbr_i(Fl_Button*, void*) {
|
|
|
|
add_right_bracket();
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_rightbr(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_rightbr_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_exch_i(Fl_Button*, void*) {
|
|
|
|
exchange();
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_exch(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_exch_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_invx_i(Fl_Button*, void*) {
|
|
|
|
value[top] = 1.0/value[top];
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_invx(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_invx_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_fact_i(Fl_Button*, void*) {
|
|
|
|
factorial();
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_fact(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_fact_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_Mplus_i(Fl_Button*, void*) {
|
|
|
|
if (! inv) mem += value[top]; else mem -= value[top];
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
set_memdisp();
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_Mplus(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_Mplus_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_Mmult_i(Fl_Button*, void*) {
|
|
|
|
if (! inv) mem *= value[top]; else mem /= value[top];
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
set_memdisp();
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_Mmult(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_Mmult_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_Mclear_i(Fl_Button*, void*) {
|
|
|
|
if (! inv)
|
|
|
|
{
|
|
|
|
mem = 0.0;
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
set_memdisp();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
memexch();
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_Mclear(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_Mclear_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_Mst_i(Fl_Button*, void*) {
|
|
|
|
mem = value[top];
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
set_memdisp();
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_Mst(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_Mst_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_Mrc_i(Fl_Button*, void*) {
|
|
|
|
value[top] = mem;
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_Mrc(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_Mrc_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_check_inv_i(Fl_Button*, void*) {
|
|
|
|
if (inv)
|
|
|
|
{
|
|
|
|
inv = 0;
|
|
|
|
setnormlabels();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
inv = 1;
|
|
|
|
setinvlabels();
|
|
|
|
};
|
|
|
|
}
|
|
|
|
void SciCalc::cb_check_inv(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_check_inv_i(o,v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cb_but_quit_i(Fl_Button*, void*) {
|
|
|
|
win->hide();
|
|
|
|
delete win;
|
|
|
|
}
|
|
|
|
void SciCalc::cb_but_quit(Fl_Button* o, void* v) {
|
|
|
|
((SciCalc*)(o->parent()->user_data()))->cb_but_quit_i(o,v);
|
|
|
|
}
|
|
|
|
/* members */
|
|
|
|
/********/
|
|
|
|
|
|
|
|
SciCalc::SciCalc() {
|
2008-01-14 15:58:55 +03:00
|
|
|
{ win = new Fl_Double_Window(181, 262, "ecalc");
|
2007-06-26 13:19:05 +04:00
|
|
|
win->user_data((void*)(this));
|
|
|
|
{ leddisplay = new Fl_Box(5, 3, 172, 24, "0 ");
|
|
|
|
leddisplay->box(FL_DOWN_BOX);
|
|
|
|
leddisplay->color((Fl_Color)207);
|
|
|
|
leddisplay->labelfont(1);
|
|
|
|
leddisplay->labelsize(16);
|
|
|
|
leddisplay->labelcolor((Fl_Color)59);
|
|
|
|
leddisplay->align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE);
|
|
|
|
} // Fl_Box* leddisplay
|
|
|
|
{ box_DEGRAD = new Fl_Box(24, 27, 35, 15, " ");
|
|
|
|
box_DEGRAD->box(FL_ENGRAVED_BOX);
|
|
|
|
box_DEGRAD->labelsize(9);
|
|
|
|
box_DEGRAD->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE);
|
|
|
|
} // Fl_Box* box_DEGRAD
|
|
|
|
{ box_bracket = new Fl_Box(59, 27, 65, 15);
|
|
|
|
box_bracket->box(FL_ENGRAVED_BOX);
|
|
|
|
box_bracket->labelsize(9);
|
|
|
|
box_bracket->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE);
|
|
|
|
} // Fl_Box* box_bracket
|
|
|
|
{ box_M = new Fl_Box(124, 27, 35, 15, "M");
|
|
|
|
box_M->box(FL_ENGRAVED_BOX);
|
|
|
|
box_M->labelsize(9);
|
|
|
|
box_M->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE);
|
|
|
|
} // Fl_Box* box_M
|
|
|
|
{ Fl_Group* o = new Fl_Group(46, 44, 93, 22);
|
|
|
|
o->color((Fl_Color)46);
|
|
|
|
{ radio_2 = new Fl_Button(49, 48, 20, 15, "2");
|
|
|
|
radio_2->type(102);
|
|
|
|
radio_2->labelsize(10);
|
|
|
|
radio_2->labelcolor((Fl_Color)1);
|
|
|
|
radio_2->callback((Fl_Callback*)cb_radio_2);
|
|
|
|
} // Fl_Button* radio_2
|
|
|
|
{ radio_8 = new Fl_Button(70, 48, 21, 15, "8");
|
|
|
|
radio_8->type(102);
|
|
|
|
radio_8->labelsize(10);
|
|
|
|
radio_8->labelcolor((Fl_Color)1);
|
|
|
|
radio_8->callback((Fl_Callback*)cb_radio_8);
|
|
|
|
} // Fl_Button* radio_8
|
|
|
|
{ radio_10 = new Fl_Button(92, 48, 21, 15, "10");
|
|
|
|
radio_10->type(102);
|
|
|
|
radio_10->value(1);
|
|
|
|
radio_10->labelsize(10);
|
|
|
|
radio_10->labelcolor((Fl_Color)1);
|
|
|
|
radio_10->callback((Fl_Callback*)cb_radio_10);
|
|
|
|
} // Fl_Button* radio_10
|
|
|
|
{ radio_16 = new Fl_Button(114, 48, 21, 15, "16");
|
|
|
|
radio_16->type(102);
|
|
|
|
radio_16->labelsize(10);
|
|
|
|
radio_16->labelcolor((Fl_Color)1);
|
|
|
|
radio_16->callback((Fl_Callback*)cb_radio_16);
|
|
|
|
} // Fl_Button* radio_16
|
|
|
|
o->end();
|
|
|
|
} // Fl_Group* o
|
|
|
|
{ Fl_Group* o = new Fl_Group(3, 163, 107, 94);
|
|
|
|
o->box(FL_FLAT_BOX);
|
|
|
|
o->color((Fl_Color)43);
|
|
|
|
{ but_7 = new Fl_Button(6, 167, 32, 20, "7");
|
|
|
|
but_7->shortcut(0x37);
|
|
|
|
but_7->labelfont(1);
|
|
|
|
but_7->labelsize(16);
|
|
|
|
but_7->callback((Fl_Callback*)cb_but_7);
|
|
|
|
} // Fl_Button* but_7
|
|
|
|
{ but_8 = new Fl_Button(41, 167, 32, 20, "8");
|
|
|
|
but_8->shortcut(0x38);
|
|
|
|
but_8->labelfont(1);
|
|
|
|
but_8->labelsize(16);
|
|
|
|
but_8->callback((Fl_Callback*)cb_but_8);
|
|
|
|
} // Fl_Button* but_8
|
|
|
|
{ but_9 = new Fl_Button(75, 167, 32, 20, "9");
|
|
|
|
but_9->shortcut(0x39);
|
|
|
|
but_9->labelfont(1);
|
|
|
|
but_9->labelsize(16);
|
|
|
|
but_9->callback((Fl_Callback*)cb_but_9);
|
|
|
|
} // Fl_Button* but_9
|
|
|
|
{ but_4 = new Fl_Button(6, 189, 32, 20, "4");
|
|
|
|
but_4->shortcut(0x34);
|
|
|
|
but_4->labelfont(1);
|
|
|
|
but_4->labelsize(16);
|
|
|
|
but_4->callback((Fl_Callback*)cb_but_4);
|
|
|
|
} // Fl_Button* but_4
|
|
|
|
{ but_5 = new Fl_Button(41, 189, 32, 20, "5");
|
|
|
|
but_5->shortcut(0x35);
|
|
|
|
but_5->labelfont(1);
|
|
|
|
but_5->labelsize(16);
|
|
|
|
but_5->callback((Fl_Callback*)cb_but_5);
|
|
|
|
} // Fl_Button* but_5
|
|
|
|
{ but_6 = new Fl_Button(75, 189, 32, 20, "6");
|
|
|
|
but_6->shortcut(0x36);
|
|
|
|
but_6->labelfont(1);
|
|
|
|
but_6->labelsize(16);
|
|
|
|
but_6->callback((Fl_Callback*)cb_but_6);
|
|
|
|
} // Fl_Button* but_6
|
|
|
|
{ but_1 = new Fl_Button(6, 211, 32, 20, "1");
|
|
|
|
but_1->shortcut(0x31);
|
|
|
|
but_1->labelfont(1);
|
|
|
|
but_1->labelsize(16);
|
|
|
|
but_1->callback((Fl_Callback*)cb_but_1);
|
|
|
|
} // Fl_Button* but_1
|
|
|
|
{ but_2 = new Fl_Button(41, 211, 32, 20, "2");
|
|
|
|
but_2->shortcut(0x32);
|
|
|
|
but_2->labelfont(1);
|
|
|
|
but_2->labelsize(16);
|
|
|
|
but_2->callback((Fl_Callback*)cb_but_2);
|
|
|
|
} // Fl_Button* but_2
|
|
|
|
{ but_3 = new Fl_Button(75, 211, 32, 20, "3");
|
|
|
|
but_3->shortcut(0x33);
|
|
|
|
but_3->labelfont(1);
|
|
|
|
but_3->labelsize(16);
|
|
|
|
but_3->callback((Fl_Callback*)cb_but_3);
|
|
|
|
} // Fl_Button* but_3
|
|
|
|
{ but_0 = new Fl_Button(6, 233, 32, 20, "0");
|
|
|
|
but_0->shortcut(0x30);
|
|
|
|
but_0->labelfont(1);
|
|
|
|
but_0->labelsize(16);
|
|
|
|
but_0->callback((Fl_Callback*)cb_but_0);
|
|
|
|
} // Fl_Button* but_0
|
|
|
|
{ but_dot = new Fl_Button(41, 233, 32, 20, ".");
|
|
|
|
but_dot->shortcut(0x2e);
|
|
|
|
but_dot->labelfont(1);
|
|
|
|
but_dot->labelsize(16);
|
|
|
|
but_dot->callback((Fl_Callback*)cb_but_dot);
|
|
|
|
} // Fl_Button* but_dot
|
|
|
|
{ but_sign = new Fl_Button(75, 233, 32, 20, "+/-");
|
|
|
|
but_sign->labelfont(1);
|
|
|
|
but_sign->labelsize(16);
|
|
|
|
but_sign->callback((Fl_Callback*)cb_but_sign);
|
|
|
|
} // Fl_Button* but_sign
|
|
|
|
o->end();
|
|
|
|
} // Fl_Group* o
|
|
|
|
{ but_C = new Fl_Button(112, 167, 31, 20, "C");
|
|
|
|
but_C->labelfont(1);
|
|
|
|
but_C->labelsize(16);
|
|
|
|
but_C->callback((Fl_Callback*)cb_but_C);
|
|
|
|
} // Fl_Button* but_C
|
|
|
|
{ but_AC = new Fl_Button(146, 167, 30, 20, "AC");
|
|
|
|
but_AC->labelfont(1);
|
|
|
|
but_AC->labelsize(16);
|
|
|
|
but_AC->callback((Fl_Callback*)cb_but_AC);
|
|
|
|
} // Fl_Button* but_AC
|
|
|
|
{ but_X = new Fl_Button(112, 189, 31, 20, "x");
|
|
|
|
but_X->shortcut(0x2a);
|
|
|
|
but_X->labelfont(1);
|
|
|
|
but_X->labelsize(16);
|
|
|
|
but_X->callback((Fl_Callback*)cb_but_X);
|
|
|
|
} // Fl_Button* but_X
|
|
|
|
{ but_div = new Fl_Button(146, 189, 30, 20, "/");
|
|
|
|
but_div->shortcut(0x2f);
|
|
|
|
but_div->labelfont(1);
|
|
|
|
but_div->labelsize(16);
|
|
|
|
but_div->callback((Fl_Callback*)cb_but_div);
|
|
|
|
} // Fl_Button* but_div
|
|
|
|
{ but_plus = new Fl_Button(112, 211, 31, 20, "+");
|
|
|
|
but_plus->shortcut(0x2b);
|
|
|
|
but_plus->labelfont(1);
|
|
|
|
but_plus->labelsize(16);
|
|
|
|
but_plus->callback((Fl_Callback*)cb_but_plus);
|
|
|
|
} // Fl_Button* but_plus
|
|
|
|
{ but_minus = new Fl_Button(146, 211, 30, 20, "-");
|
|
|
|
but_minus->shortcut(0x2d);
|
|
|
|
but_minus->labelfont(1);
|
|
|
|
but_minus->labelsize(16);
|
|
|
|
but_minus->callback((Fl_Callback*)cb_but_minus);
|
|
|
|
} // Fl_Button* but_minus
|
|
|
|
{ but_pi = new Fl_Button(112, 233, 31, 20, "e/p");
|
|
|
|
but_pi->labelfont(12);
|
|
|
|
but_pi->labelsize(17);
|
|
|
|
but_pi->callback((Fl_Callback*)cb_but_pi);
|
|
|
|
} // Fl_Button* but_pi
|
|
|
|
{ but_eval = new Fl_Button(146, 233, 30, 20, "=");
|
|
|
|
but_eval->shortcut(0x3d);
|
|
|
|
but_eval->labelfont(1);
|
|
|
|
but_eval->labelsize(16);
|
|
|
|
but_eval->callback((Fl_Callback*)cb_but_eval);
|
|
|
|
} // Fl_Button* but_eval
|
|
|
|
{ but_eval_hidden = new Fl_Button(147, 253, 6, 7);
|
|
|
|
but_eval_hidden->box(FL_NO_BOX);
|
|
|
|
but_eval_hidden->shortcut(0xff0d);
|
|
|
|
but_eval_hidden->labelfont(1);
|
|
|
|
but_eval_hidden->labelsize(16);
|
|
|
|
but_eval_hidden->callback((Fl_Callback*)cb_but_eval_hidden);
|
|
|
|
} // Fl_Button* but_eval_hidden
|
|
|
|
{ but_eval_hidden2 = new Fl_Button(157, 263, 6, 7);
|
|
|
|
but_eval_hidden2->box(FL_NO_BOX);
|
|
|
|
but_eval_hidden2->shortcut(0xff8d);
|
|
|
|
but_eval_hidden2->labelfont(1);
|
|
|
|
but_eval_hidden2->labelsize(16);
|
|
|
|
but_eval_hidden2->callback((Fl_Callback*)cb_but_eval_hidden2);
|
|
|
|
} // Fl_Button* but_eval_hidden2
|
|
|
|
{ but_sqrt = new Fl_Button(6, 70, 32, 21, "sqrt");
|
|
|
|
but_sqrt->labelsize(11);
|
|
|
|
but_sqrt->labelcolor((Fl_Color)4);
|
|
|
|
but_sqrt->callback((Fl_Callback*)cb_but_sqrt);
|
|
|
|
} // Fl_Button* but_sqrt
|
|
|
|
{ but_pow = new Fl_Button(41, 70, 32, 21, "x^y");
|
|
|
|
but_pow->labelsize(11);
|
|
|
|
but_pow->labelcolor((Fl_Color)4);
|
|
|
|
but_pow->callback((Fl_Callback*)cb_but_pow);
|
|
|
|
} // Fl_Button* but_pow
|
|
|
|
{ but_sin = new Fl_Button(76, 70, 31, 21, "sin");
|
|
|
|
but_sin->labelsize(11);
|
|
|
|
but_sin->labelcolor((Fl_Color)4);
|
|
|
|
but_sin->callback((Fl_Callback*)cb_but_sin);
|
|
|
|
} // Fl_Button* but_sin
|
|
|
|
{ but_cos = new Fl_Button(110, 70, 31, 21, "cos");
|
|
|
|
but_cos->labelsize(11);
|
|
|
|
but_cos->labelcolor((Fl_Color)4);
|
|
|
|
but_cos->callback((Fl_Callback*)cb_but_cos);
|
|
|
|
} // Fl_Button* but_cos
|
|
|
|
{ but_tan = new Fl_Button(144, 70, 30, 21, "tan");
|
|
|
|
but_tan->labelsize(11);
|
|
|
|
but_tan->labelcolor((Fl_Color)4);
|
|
|
|
but_tan->callback((Fl_Callback*)cb_but_tan);
|
|
|
|
} // Fl_Button* but_tan
|
|
|
|
{ but_log = new Fl_Button(6, 93, 32, 21, "log");
|
|
|
|
but_log->labelsize(11);
|
|
|
|
but_log->labelcolor((Fl_Color)4);
|
|
|
|
but_log->callback((Fl_Callback*)cb_but_log);
|
|
|
|
} // Fl_Button* but_log
|
|
|
|
{ but_ln = new Fl_Button(41, 93, 32, 21, "ln");
|
|
|
|
but_ln->labelsize(11);
|
|
|
|
but_ln->labelcolor((Fl_Color)4);
|
|
|
|
but_ln->callback((Fl_Callback*)cb_but_ln);
|
|
|
|
} // Fl_Button* but_ln
|
|
|
|
{ but_int = new Fl_Button(76, 93, 31, 21, "int");
|
|
|
|
but_int->labelsize(11);
|
|
|
|
but_int->labelcolor((Fl_Color)4);
|
|
|
|
but_int->callback((Fl_Callback*)cb_but_int);
|
|
|
|
} // Fl_Button* but_int
|
|
|
|
{ but_dr = new Fl_Button(110, 93, 31, 21, "d->r");
|
|
|
|
but_dr->labelsize(10);
|
|
|
|
but_dr->labelcolor((Fl_Color)4);
|
|
|
|
but_dr->callback((Fl_Callback*)cb_but_dr);
|
|
|
|
} // Fl_Button* but_dr
|
|
|
|
{ but_drg = new Fl_Button(144, 93, 30, 21, "d-r-g");
|
|
|
|
but_drg->labelsize(9);
|
|
|
|
but_drg->callback((Fl_Callback*)cb_but_drg);
|
|
|
|
} // Fl_Button* but_drg
|
|
|
|
{ but_leftbr = new Fl_Button(6, 116, 32, 21, "[");
|
|
|
|
but_leftbr->shortcut(0x28);
|
|
|
|
but_leftbr->labelsize(11);
|
|
|
|
but_leftbr->callback((Fl_Callback*)cb_but_leftbr);
|
|
|
|
} // Fl_Button* but_leftbr
|
|
|
|
{ but_rightbr = new Fl_Button(41, 116, 32, 21, "]");
|
|
|
|
but_rightbr->shortcut(0x29);
|
|
|
|
but_rightbr->labelsize(11);
|
|
|
|
but_rightbr->callback((Fl_Callback*)cb_but_rightbr);
|
|
|
|
} // Fl_Button* but_rightbr
|
|
|
|
{ but_exch = new Fl_Button(76, 116, 31, 21, "exch");
|
|
|
|
but_exch->labelsize(11);
|
|
|
|
but_exch->callback((Fl_Callback*)cb_but_exch);
|
|
|
|
} // Fl_Button* but_exch
|
|
|
|
{ but_invx = new Fl_Button(110, 116, 31, 21, "1/x");
|
|
|
|
but_invx->labelsize(11);
|
|
|
|
but_invx->callback((Fl_Callback*)cb_but_invx);
|
|
|
|
} // Fl_Button* but_invx
|
|
|
|
{ but_fact = new Fl_Button(144, 116, 30, 21, "x!");
|
|
|
|
but_fact->labelsize(11);
|
|
|
|
but_fact->callback((Fl_Callback*)cb_but_fact);
|
|
|
|
} // Fl_Button* but_fact
|
|
|
|
{ but_Mplus = new Fl_Button(6, 139, 32, 21, "M+");
|
|
|
|
but_Mplus->color((Fl_Color)93);
|
|
|
|
but_Mplus->labelcolor((Fl_Color)4);
|
|
|
|
but_Mplus->callback((Fl_Callback*)cb_but_Mplus);
|
|
|
|
} // Fl_Button* but_Mplus
|
|
|
|
{ but_Mmult = new Fl_Button(41, 139, 32, 21, "M*");
|
|
|
|
but_Mmult->color((Fl_Color)93);
|
|
|
|
but_Mmult->labelcolor((Fl_Color)4);
|
|
|
|
but_Mmult->callback((Fl_Callback*)cb_but_Mmult);
|
|
|
|
} // Fl_Button* but_Mmult
|
|
|
|
{ but_Mclear = new Fl_Button(76, 139, 31, 21, "MC");
|
|
|
|
but_Mclear->color((Fl_Color)93);
|
|
|
|
but_Mclear->labelcolor((Fl_Color)4);
|
|
|
|
but_Mclear->callback((Fl_Callback*)cb_but_Mclear);
|
|
|
|
} // Fl_Button* but_Mclear
|
|
|
|
{ but_Mst = new Fl_Button(110, 139, 31, 21, "Mst");
|
|
|
|
but_Mst->color((Fl_Color)93);
|
|
|
|
but_Mst->callback((Fl_Callback*)cb_but_Mst);
|
|
|
|
} // Fl_Button* but_Mst
|
|
|
|
{ but_Mrc = new Fl_Button(144, 139, 30, 21, "Mrc");
|
|
|
|
but_Mrc->color((Fl_Color)93);
|
|
|
|
but_Mrc->callback((Fl_Callback*)cb_but_Mrc);
|
|
|
|
} // Fl_Button* but_Mrc
|
|
|
|
{ check_inv = new Fl_Button(6, 44, 32, 21, "inv");
|
|
|
|
check_inv->type(1);
|
|
|
|
check_inv->labelsize(11);
|
|
|
|
check_inv->labelcolor((Fl_Color)4);
|
|
|
|
check_inv->callback((Fl_Callback*)cb_check_inv);
|
|
|
|
} // Fl_Button* check_inv
|
|
|
|
{ but_quit = new Fl_Button(145, 44, 29, 21, "Exit");
|
|
|
|
but_quit->labelfont(1);
|
|
|
|
but_quit->labelcolor((Fl_Color)33);
|
|
|
|
but_quit->callback((Fl_Callback*)cb_but_quit);
|
|
|
|
} // Fl_Button* but_quit
|
|
|
|
win->end();
|
|
|
|
} // Fl_Double_Window* win
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
SciCalc::~SciCalc() {
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::run(int px,int py) {
|
|
|
|
win->show();
|
|
|
|
Fl::run();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::handle_number(double numb) {
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::handle_operator(Operator op) {
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::change_base(int newbase) {
|
|
|
|
int oldbase;
|
|
|
|
|
|
|
|
oldbase = base;
|
|
|
|
base = newbase;
|
|
|
|
|
|
|
|
set_display(value[top], NORM);
|
|
|
|
ready = 1;
|
|
|
|
if ((oldbase == 16) || (base == 16)) setnormlabels();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::set_display(double val,mode behind) {
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::set_memdisp() {
|
|
|
|
if (mem)
|
|
|
|
box_M->label("M");
|
|
|
|
else
|
|
|
|
box_M->label("");
|
|
|
|
box_M->redraw();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::set_drgdisp() {
|
|
|
|
if (drgmode == 0)
|
|
|
|
box_DEGRAD->label("DEG");
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (drgmode == 1)
|
|
|
|
box_DEGRAD->label("RAD");
|
|
|
|
else
|
|
|
|
box_DEGRAD->label("GRAD");
|
|
|
|
}
|
|
|
|
box_DEGRAD->redraw();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::set_brktdisp() {
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::add_left_bracket() {
|
|
|
|
if (currentbrkt < MaxNumBrkts)
|
|
|
|
{
|
|
|
|
currentbrkt++;
|
|
|
|
startbrkt[currentbrkt] = top;
|
|
|
|
ready = 1;
|
|
|
|
set_brktdisp();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::add_right_bracket() {
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::factorial() {
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::exchange() {
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::exponent_pi() {
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::calc(int i) {
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::init_value(int lev) {
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::cvttobase(double num,int base,mode behind,char *str) {
|
|
|
|
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--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::setnormlabels() {
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::setinvlabels() {
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::mem_exchange() {
|
|
|
|
double temp;
|
|
|
|
|
|
|
|
temp = mem;
|
|
|
|
mem = value[top];
|
|
|
|
value[top] = temp;
|
|
|
|
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
set_memdisp();
|
|
|
|
printf("Hello, World!\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
double SciCalc::to_drg(double angle) {
|
|
|
|
if (drgmode == 0)
|
|
|
|
return (M_PI*angle/180.0);
|
|
|
|
else
|
|
|
|
if (drgmode == 2)
|
|
|
|
return (M_PI*angle/100.0);
|
|
|
|
else
|
|
|
|
return (angle);
|
|
|
|
}
|
|
|
|
|
|
|
|
double SciCalc::from_drg(double angle) {
|
|
|
|
if (drgmode == 0)
|
|
|
|
return (180.0*angle/M_PI);
|
|
|
|
else
|
|
|
|
if (drgmode == 2)
|
|
|
|
return (100.0*angle/M_PI);
|
|
|
|
else
|
|
|
|
return (angle);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SciCalc::memexch() {
|
|
|
|
double temp;
|
|
|
|
|
|
|
|
temp = mem;
|
|
|
|
mem = value[top];
|
|
|
|
value[top] = temp;
|
|
|
|
set_display(value[top],NORM);
|
|
|
|
ready = 1;
|
|
|
|
set_memdisp();
|
|
|
|
}
|