home *** CD-ROM | disk | FTP | other *** search
- /* expression, version 1.0 */
-
- typedef int expr_var;
- typedef struct {
- double real;
- double imag;
- } fcomplex;
-
- struct expression {
- int nvars;
- char **varnames;
- fcomplex *varvals;
- int nelem; /* number of elements in the vector. */
- struct expr_elem *elems;
- };
-
- typedef double (*func_double)(double);
- typedef double (*func_double_double)(double, double);
-
- typedef void (*func_complex)(fcomplex *source, fcomplex*result);
- typedef void (*func_complex_complex)(fcomplex *source1, fcomplex *source2, fcomplex*result);
-
- struct expr_elem {
- enum expr_op {
- MONOP,
- BINOP,
- MONFUNC,
- BINFUNC,
- PUSHVAR,
- PUSHNUM
- } op;
- union {
- struct {
- char op;
- } monop;
- struct {
- char op;
- } binop;
- struct {
- func_double func;
- func_complex cfunc;
- } monfunc;
- struct {
- func_double_double func;
- func_complex_complex cfunc;
- } binfunc;
- struct {
- int varnum;
- } pushvar;
- struct {
- double number;
- } pushnum;
- } u;
- };
-
- extern struct expression *expr_new(void);
- extern void expr_free(struct expression *);
- extern char *expr_parse(struct expression *expr, char *e);
- extern double expr_evaluate(struct expression *e);
- extern void expr_evaluate_some(struct expression *e, expr_var v,
- double min, double max, int npoints,
- double *buffer);
- extern void expr_evaluate_complex(struct expression *e, fcomplex *op);
- extern expr_var expr_create_variable(struct expression *e, char *name,
- double val);
- extern void expr_set_variable(struct expression *e, expr_var v,
- double val);
- extern void expr_set_variable_complex(struct expression *e, expr_var v,
- fcomplex *val);
- extern double expr_get_variable(struct expression *e, expr_var v);
- extern void expr_get_variable_complex(struct expression *e, expr_var v,
- fcomplex *op);
- extern void expr_copy_variables(struct expression *source, struct expression *dest);
-
-
- extern struct expr_monfunc {
- char *name;
- func_double func;
- func_complex cfunc;
- } expr_monfuncs[];
-
- extern struct expr_binfunc {
- char *name;
- func_double_double func;
- func_complex_complex cfunc;
- } expr_binfuncs[];
-
-
- extern void fcomplex_re(fcomplex *,fcomplex *);
- extern void fcomplex_im(fcomplex *,fcomplex *);
- extern void fcomplex_abs(fcomplex *,fcomplex *);
- extern void fcomplex_log(fcomplex *,fcomplex *);
- extern void fcomplex_log10(fcomplex *,fcomplex *);
- extern void fcomplex_sqrt(fcomplex *,fcomplex *);
- extern void fcomplex_cos(fcomplex *,fcomplex *);
- extern void fcomplex_arccos(fcomplex *,fcomplex *);
- extern void fcomplex_sin(fcomplex *,fcomplex *);
- extern void fcomplex_arcsin(fcomplex *,fcomplex *);
- extern void fcomplex_tan(fcomplex *,fcomplex *);
- extern void fcomplex_arctan(fcomplex *,fcomplex *);
- extern void fcomplex_cot(fcomplex *,fcomplex *);
- extern void fcomplex_sec(fcomplex *,fcomplex *);
- extern void fcomplex_csc(fcomplex *,fcomplex *);
- extern void fcomplex_cosh(fcomplex *,fcomplex *);
- extern void fcomplex_sinh(fcomplex *,fcomplex *);
- extern void fcomplex_tanh(fcomplex *,fcomplex *);
- extern void fcomplex_arccosh(fcomplex *,fcomplex *);
- extern void fcomplex_arcsinh(fcomplex *,fcomplex *);
- extern void fcomplex_arctanh(fcomplex *,fcomplex *);
- extern void fcomplex_floor(fcomplex *,fcomplex *);
- extern void fcomplex_round(fcomplex *,fcomplex *);
- extern void fcomplex_ceiling(fcomplex *,fcomplex *);
- extern void fcomplex_exp(fcomplex *,fcomplex *);
-
- extern void fcomplex_pow(fcomplex *,fcomplex *,fcomplex *);
- extern void fcomplex_atan2(fcomplex *,fcomplex *,fcomplex *);
-
- extern double freal_re(double);
- extern double freal_im(double);
- extern double freal_cot(double);
- extern double freal_sec(double);
- extern double freal_csc(double);
-
- extern void fcomplex_monstub(fcomplex *,fcomplex *);
- extern void fcomplex_binstub(fcomplex *,fcomplex *, fcomplex *);
- extern double freal_monstub(double);
- extern double freal_binstub(double,double);
-
- #define DEFAULT_EXPR_MONFUNCS \
- {"re", freal_re, fcomplex_re}, \
- {"im", freal_im, fcomplex_im}, \
- {"abs", fabs, fcomplex_abs}, \
- {"log", log, fcomplex_log}, \
- {"log10", log10, fcomplex_log10}, \
- {"sqrt", sqrt, fcomplex_sqrt}, \
- {"cos", cos, fcomplex_cos}, \
- {"arccos", acos, fcomplex_arccos}, \
- {"sin", sin, fcomplex_sin}, \
- {"arcsin", asin, fcomplex_arcsin}, \
- {"tan", tan, fcomplex_tan}, \
- {"arctan", atan, fcomplex_arctan}, \
- {"cot", freal_cot, fcomplex_cot}, \
- {"sec", freal_sec, fcomplex_sec}, \
- {"csc", freal_csc, fcomplex_csc}, \
- {"cosh", cosh, fcomplex_cosh}, \
- {"sinh", sinh, fcomplex_sinh}, \
- {"tanh", tanh, fcomplex_tanh}, \
- {"arccosh", acosh, fcomplex_arccosh}, \
- {"arcsinh", asinh, fcomplex_arcsinh}, \
- {"arctanh", atanh, fcomplex_arctanh}, \
- {"floor", floor, fcomplex_floor}, \
- {"round", rint, fcomplex_round}, \
- {"ceiling", ceil, fcomplex_ceiling}, \
- {"exp", exp, fcomplex_exp}
-
- #define DEFAULT_EXPR_BINFUNCS \
- {"pow", pow, fcomplex_pow}, \
- {"arctan2", atan2, fcomplex_atan2}
-
-