This is fexprnew.h in view mode; [Download] [Up]
/* $Id$ */ /* new fast expression library! wheee! */ #ifndef fexpr_h_included #define fexpr_h_included typedef enum { FNONE, FREAL, FCOMPLEX, FDERIV, FRDERIV } ftype; struct fexpression { struct fcode *code; struct ffunctable *funcs; ftype type; }; typedef struct { double real,imag; } fcomplex; struct fcode; /* forward reference */ typedef struct fvalue_struct fvalue; typedef struct { int nderivs; fvalue *values; } fjet; struct fvalue_struct { ftype type; union fval_union { fcomplex complex; double real; fjet deriv; } value; }; typedef struct { struct { double (*real)(int nargs, double *args, void *); void *data; } r; struct { void (*complex)(int nargs, fcomplex *args, fcomplex *op, void *); void *data; } c; struct { void (*deriv)(int nargs, fjet *args, fjet *op, void *data); void *data; } d; } fevalfunc; struct ffuncstruct { char *name; fevalfunc function; int nargs; }; #if 0 struct ffunctableent { char *name; fevalfunc function; int nargs; /* negative if we don't * care. otherwise, the only numbers * of arguments this will take. 0 * means probably is just a constant * variable. */ }; #endif #if 0 struct ffunctiontableent { char *name; ftype type; void *function; int nargs; }; #endif struct fcode { int ninsts; struct finst { enum { FIFUNC, FINUMBER } type; union { struct { int nargs; struct ffuncstruct ent; /* functions are null if they haven't been linked. */ } func; fvalue number; } u; } *insts; }; struct ffunctable { int nents; struct ffuncstruct *ents; struct ffunctable *next; }; #if 0 typedef struct ffunctiontableent ffunctiontable[]; #endif /* functions */ /* operates on a whole bundle -- for simple users */ extern struct fexpression *fnew_expr(ftype); extern char *fexpr_parse(struct fexpression *, char *); extern fvalue *fexpr_getvar(struct fexpression *, char *name); extern void fexpr_evaluate(struct fexpression *, fvalue *op); extern void fexpr_free(struct fexpression *); extern void fexpr_cleanup(void); /* run at end of program */ /* code functions */ extern struct fcode *fnew_code(void); extern char *fcode_parse(struct fcode *, char *); extern int fcode_link(struct fcode *, struct ffunctable *, ftype); extern void fcode_run(struct fcode *, ftype, fvalue *op, ...); extern void fcode_free(struct fcode *); extern void fapplyv(struct ffuncstruct *, ftype, fvalue *op, int nargs, ...); extern void fapply(struct ffuncstruct *, ftype, int nargs, fvalue *args, fvalue *op); /* func functions */ extern struct ffunctable *fnew_func(void); extern struct ffunctable *fnew_func_with_defaults(void); extern fvalue *ffunc_getvar(struct ffunctable *, char *, ftype); extern struct ffuncstruct *ffunc_findfunc(struct ffunctable *, char *, ftype, int); extern void ffunc_free(struct ffunctable *); extern struct ffuncstruct *ffunc_create(struct ffunctable *, char *, fevalfunc, int); extern void ffunc_free_builtins(void); /* value functions */ extern void fvalue_free(fvalue *); extern void fvalue_free_parts(fvalue *); extern void fvalue_from_double(fvalue *,ftype,double); extern int fvalue_iszero(fvalue *); extern int fvalue_isone(fvalue *); #ifdef EOF extern void fvalue_print(FILE *,fvalue *); #endif /* miscelaneous other things */ extern fvalue *fderiv_variable; /* default functions and constants */ extern struct ffunctable *fbuiltins; extern void fbuiltins_build(); /* internal stuff */ extern char *fparse_code_internal(struct fcode *, char *); extern void fparse_set_string(char *); extern int fparse_yyparse(void); extern void fparse_yyerror(char *); extern int fparse_yylex(void); #ifdef MNEM extern void fparse_free_dat_int(int, void *, int); #else extern void fparse_free_dat(void *, int); #endif /* external stuff. user defines this, if e wants to change it. default * is to just print on stderr. */ extern void fexpr_error(char *); #define FBUF_SIZE 1024 #if defined (FCOMPAT) /* compatibility stuff. don't use this, as it might be removed soon. */ struct expression { ftype type; struct fcode *code; struct ffunctable *funcs; }; typedef char *expr_var; /* just the name */ extern struct expression *expr_new(ftype type); 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); #endif /* fcompat */ #endif /* fexpr_h_included */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.