|
|
@ -102,6 +102,18 @@ initkeys(void) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
enum { |
|
|
|
|
|
XKEY_AND = 1, XKEY_OR, XKEY_NOT, XKEY_DIV, XKEY_MOD, XKEY_DEFINED |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
enum { |
|
|
|
|
|
XFU_SQR = 1, XFU_SQRT, XFU_SIN, XFU_COS, XFU_EXP, XFU_LN, XFU_ARCTAN, XFU_ABS, XFU_POW, XFU_PWR, XFU_MAX, XFU_MIN, XFU_INT, XFU_LOG, XFU_SINH, XFU_COSH, |
|
|
|
|
|
XFU_TANH, XFU_TERNARY_FCN, XFU_V, XFU_AGAUSS, XFU_SGN, XFU_GAUSS, XFU_UNIF, XFU_AUNIF, XFU_LIMIT, XFU_CEIL, XFU_FLOOR, |
|
|
|
|
|
XFU_ASIN, XFU_ACOS, XFU_ATAN, XFU_ASINH, XFU_ACOSH, XFU_ATANH, XFU_TAN, |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static double |
|
|
static double |
|
|
mathfunction(int f, double z, double x) |
|
|
mathfunction(int f, double z, double x) |
|
|
/* the list of built-in functions. Patch 'fmath', here and near line 888 to get more ...*/ |
|
|
/* the list of built-in functions. Patch 'fmath', here and near line 888 to get more ...*/ |
|
|
@ -109,58 +121,58 @@ mathfunction(int f, double z, double x) |
|
|
double y; |
|
|
double y; |
|
|
switch (f) |
|
|
switch (f) |
|
|
{ |
|
|
{ |
|
|
case 1: |
|
|
|
|
|
|
|
|
case XFU_SQR: |
|
|
y = x * x; |
|
|
y = x * x; |
|
|
break; |
|
|
break; |
|
|
case 2: |
|
|
|
|
|
|
|
|
case XFU_SQRT: |
|
|
y = sqrt(x); |
|
|
y = sqrt(x); |
|
|
break; |
|
|
break; |
|
|
case 3: |
|
|
|
|
|
|
|
|
case XFU_SIN: |
|
|
y = sin(x); |
|
|
y = sin(x); |
|
|
break; |
|
|
break; |
|
|
case 4: |
|
|
|
|
|
|
|
|
case XFU_COS: |
|
|
y = cos(x); |
|
|
y = cos(x); |
|
|
break; |
|
|
break; |
|
|
case 5: |
|
|
|
|
|
|
|
|
case XFU_EXP: |
|
|
y = exp(x); |
|
|
y = exp(x); |
|
|
break; |
|
|
break; |
|
|
case 6: /* ln(x) */ |
|
|
|
|
|
|
|
|
case XFU_LN: |
|
|
y = log(x); |
|
|
y = log(x); |
|
|
break; |
|
|
break; |
|
|
case 7: |
|
|
|
|
|
|
|
|
case XFU_ARCTAN: |
|
|
y = atan(x); |
|
|
y = atan(x); |
|
|
break; |
|
|
break; |
|
|
case 8: |
|
|
|
|
|
|
|
|
case XFU_ABS: |
|
|
y = fabs(x); |
|
|
y = fabs(x); |
|
|
break; |
|
|
break; |
|
|
case 9: |
|
|
|
|
|
|
|
|
case XFU_POW: |
|
|
y = pow(z, x); |
|
|
y = pow(z, x); |
|
|
break; |
|
|
break; |
|
|
case 10: |
|
|
|
|
|
|
|
|
case XFU_PWR: |
|
|
y = pow(fabs(z), x); |
|
|
y = pow(fabs(z), x); |
|
|
break; |
|
|
break; |
|
|
case 11: |
|
|
|
|
|
|
|
|
case XFU_MAX: |
|
|
y = MAX(x, z); |
|
|
y = MAX(x, z); |
|
|
break; |
|
|
break; |
|
|
case 12: |
|
|
|
|
|
|
|
|
case XFU_MIN: |
|
|
y = MIN(x, z); |
|
|
y = MIN(x, z); |
|
|
break; |
|
|
break; |
|
|
case 13: /* int(x) */ |
|
|
|
|
|
|
|
|
case XFU_INT: |
|
|
y = trunc(x); |
|
|
y = trunc(x); |
|
|
break; |
|
|
break; |
|
|
case 14: |
|
|
|
|
|
|
|
|
case XFU_LOG: |
|
|
y = log(x); |
|
|
y = log(x); |
|
|
break; |
|
|
break; |
|
|
case 15: |
|
|
|
|
|
|
|
|
case XFU_SINH: |
|
|
y = sinh(x); |
|
|
y = sinh(x); |
|
|
break; |
|
|
break; |
|
|
case 16: |
|
|
|
|
|
|
|
|
case XFU_COSH: |
|
|
y = cosh(x); |
|
|
y = cosh(x); |
|
|
break; |
|
|
break; |
|
|
case 17: |
|
|
|
|
|
|
|
|
case XFU_TANH: |
|
|
y = tanh(x); |
|
|
y = tanh(x); |
|
|
break; |
|
|
break; |
|
|
case 21: /* sgn */ |
|
|
|
|
|
|
|
|
case XFU_SGN: |
|
|
if (x > 0) |
|
|
if (x > 0) |
|
|
y = 1.; |
|
|
y = 1.; |
|
|
else if (x == 0) |
|
|
else if (x == 0) |
|
|
@ -168,29 +180,29 @@ mathfunction(int f, double z, double x) |
|
|
else |
|
|
else |
|
|
y = -1.; |
|
|
y = -1.; |
|
|
break; |
|
|
break; |
|
|
case 26: |
|
|
|
|
|
|
|
|
case XFU_CEIL: |
|
|
y = ceil(x); |
|
|
y = ceil(x); |
|
|
break; |
|
|
break; |
|
|
case 27: |
|
|
|
|
|
|
|
|
case XFU_FLOOR: |
|
|
y = floor(x); |
|
|
y = floor(x); |
|
|
break; |
|
|
break; |
|
|
case 28: |
|
|
|
|
|
|
|
|
case XFU_ASIN: |
|
|
y = asin(x); |
|
|
y = asin(x); |
|
|
break; |
|
|
break; |
|
|
case 29: |
|
|
|
|
|
|
|
|
case XFU_ACOS: |
|
|
y = acos(x); |
|
|
y = acos(x); |
|
|
break; |
|
|
break; |
|
|
case 30: |
|
|
|
|
|
|
|
|
case XFU_ATAN: |
|
|
y = atan(x); |
|
|
y = atan(x); |
|
|
break; |
|
|
break; |
|
|
case 31: |
|
|
|
|
|
|
|
|
case XFU_ASINH: |
|
|
#ifdef HAVE_ASINH |
|
|
#ifdef HAVE_ASINH |
|
|
y = asinh(x); |
|
|
y = asinh(x); |
|
|
#else |
|
|
#else |
|
|
y = ((x > 0) ? log(x + sqrt(x * x + 1.0)) : -log(-x + sqrt(x * x + 1.0))); |
|
|
y = ((x > 0) ? log(x + sqrt(x * x + 1.0)) : -log(-x + sqrt(x * x + 1.0))); |
|
|
#endif |
|
|
#endif |
|
|
break; |
|
|
break; |
|
|
case 32: |
|
|
|
|
|
|
|
|
case XFU_ACOSH: |
|
|
#ifdef HAVE_ACOSH |
|
|
#ifdef HAVE_ACOSH |
|
|
y = acosh(x); |
|
|
y = acosh(x); |
|
|
#else |
|
|
#else |
|
|
@ -201,7 +213,7 @@ mathfunction(int f, double z, double x) |
|
|
y = (log(x + sqrt(x*x-1.0))); |
|
|
y = (log(x + sqrt(x*x-1.0))); |
|
|
#endif |
|
|
#endif |
|
|
break; |
|
|
break; |
|
|
case 33: |
|
|
|
|
|
|
|
|
case XFU_ATANH: |
|
|
#ifdef HAVE_ATANH |
|
|
#ifdef HAVE_ATANH |
|
|
y = atanh(x); |
|
|
y = atanh(x); |
|
|
#else |
|
|
#else |
|
|
@ -212,7 +224,7 @@ mathfunction(int f, double z, double x) |
|
|
y = (log((1.0 + x) / (1.0 - x)) / 2.0); |
|
|
y = (log((1.0 + x) / (1.0 - x)) / 2.0); |
|
|
#endif |
|
|
#endif |
|
|
break; |
|
|
break; |
|
|
case 34: |
|
|
|
|
|
|
|
|
case XFU_TAN: |
|
|
y = tan(x); |
|
|
y = tan(x); |
|
|
break; |
|
|
break; |
|
|
default: |
|
|
default: |
|
|
@ -991,32 +1003,32 @@ opfunctkey(tdico *dico, |
|
|
switch (kw) |
|
|
switch (kw) |
|
|
{ |
|
|
{ |
|
|
/* & | ~ DIV MOD Defined */ |
|
|
/* & | ~ DIV MOD Defined */ |
|
|
case 1: |
|
|
|
|
|
|
|
|
case XKEY_AND: |
|
|
c = 'A'; |
|
|
c = 'A'; |
|
|
state = S_binop; |
|
|
state = S_binop; |
|
|
level = 6; |
|
|
level = 6; |
|
|
break; |
|
|
break; |
|
|
case 2: |
|
|
|
|
|
|
|
|
case XKEY_OR: |
|
|
c = 'O'; |
|
|
c = 'O'; |
|
|
state = S_binop; |
|
|
state = S_binop; |
|
|
level = 7; |
|
|
level = 7; |
|
|
break; |
|
|
break; |
|
|
case 3: |
|
|
|
|
|
|
|
|
case XKEY_NOT: |
|
|
c = '!'; |
|
|
c = '!'; |
|
|
state = S_unop; |
|
|
state = S_unop; |
|
|
level = 1; |
|
|
level = 1; |
|
|
break; |
|
|
break; |
|
|
case 4: |
|
|
|
|
|
|
|
|
case XKEY_DIV: |
|
|
c = '\\'; |
|
|
c = '\\'; |
|
|
state = S_binop; |
|
|
state = S_binop; |
|
|
level = 3; |
|
|
level = 3; |
|
|
break; |
|
|
break; |
|
|
case 5: |
|
|
|
|
|
|
|
|
case XKEY_MOD: |
|
|
c = '%'; |
|
|
c = '%'; |
|
|
state = S_binop; |
|
|
state = S_binop; |
|
|
level = 3; |
|
|
level = 3; |
|
|
break; |
|
|
break; |
|
|
case 6: |
|
|
|
|
|
|
|
|
case XKEY_DEFINED: |
|
|
c = '?'; |
|
|
c = '?'; |
|
|
state = S_atom; |
|
|
state = S_atom; |
|
|
level = 0; |
|
|
level = 0; |
|
|
@ -1228,17 +1240,17 @@ formula(tdico *dico, const char *s, const char *s_end, bool *perror) |
|
|
u = formula(dico, s, kptr - 1, &error); |
|
|
u = formula(dico, s, kptr - 1, &error); |
|
|
state = S_atom; |
|
|
state = S_atom; |
|
|
if (fu > 0) { |
|
|
if (fu > 0) { |
|
|
if ((fu == 18)) |
|
|
|
|
|
|
|
|
if ((fu == XFU_TERNARY_FCN)) |
|
|
u = ternary_fcn(v, w, u); |
|
|
u = ternary_fcn(v, w, u); |
|
|
else if ((fu == 20)) |
|
|
|
|
|
|
|
|
else if ((fu == XFU_AGAUSS)) |
|
|
u = agauss(v, w, u); |
|
|
u = agauss(v, w, u); |
|
|
else if ((fu == 22)) |
|
|
|
|
|
|
|
|
else if ((fu == XFU_GAUSS)) |
|
|
u = gauss(v, w, u); |
|
|
u = gauss(v, w, u); |
|
|
else if ((fu == 23)) |
|
|
|
|
|
|
|
|
else if ((fu == XFU_UNIF)) |
|
|
u = unif(v, u); |
|
|
u = unif(v, u); |
|
|
else if ((fu == 24)) |
|
|
|
|
|
|
|
|
else if ((fu == XFU_AUNIF)) |
|
|
u = aunif(v, u); |
|
|
u = aunif(v, u); |
|
|
else if ((fu == 25)) |
|
|
|
|
|
|
|
|
else if ((fu == XFU_LIMIT)) |
|
|
u = limit(v, u); |
|
|
u = limit(v, u); |
|
|
else |
|
|
else |
|
|
u = mathfunction(fu, v, u); |
|
|
u = mathfunction(fu, v, u); |
|
|
@ -1260,7 +1272,7 @@ formula(tdico *dico, const char *s, const char *s_end, bool *perror) |
|
|
c = opfunctkey(dico, kw, c, &state, &level, &error); |
|
|
c = opfunctkey(dico, kw, c, &state, &level, &error); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (kw == 6) { |
|
|
|
|
|
|
|
|
if (kw == XKEY_DEFINED) { |
|
|
u = exists(dico, s_end, &s, &error); |
|
|
u = exists(dico, s_end, &s, &error); |
|
|
} |
|
|
} |
|
|
} else if (((c == '.') || ((c >= '0') && (c <= '9')))) { |
|
|
} else if (((c == '.') || ((c >= '0') && (c <= '9')))) { |
|
|
|