Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/include/sffe.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/sffe.h')
-rw-r--r--src/include/sffe.h139
1 files changed, 139 insertions, 0 deletions
diff --git a/src/include/sffe.h b/src/include/sffe.h
new file mode 100644
index 0000000..3f21869
--- /dev/null
+++ b/src/include/sffe.h
@@ -0,0 +1,139 @@
+/*/////////////////////////////////////////////////////////////////////////////////////
+// project : sFFe ( SegFault (or Segmentation Fault :) ) formula evalutaor )
+// author : Mateusz Malczak ( mateusz@malczak.info )
+// wpage : www.segfaultlabs.com/projects/sffe
+///////////////////////////////////////////////////////////////////////////////////////
+// possible config definitions
+// general
+// SFFE_DEVEL - print extra info to stdout
+// SFFE_DLL - Windows DLL
+// complex numbers
+// SFFE_CMPLX_GSL - uses GSL complex number routines
+// SFFE_CMPLX_ASM - uses my asm complex unit (compile it with NASM)
+///////////////////////////////////////////////////////////////////////////////////////
+// special build for XaoS, for more info visit
+// http://www.segfaultlabs.com/projects/sfXaos
+/////////////////////////////////////////////////////////////////////////////////////*/
+
+#ifndef SFFE_H
+#define SFFE_H
+#include <config.h>
+#include <stdlib.h>
+
+/* dont udef next line. removing this definitions can lead to compile and/or runtime errors */
+#define SFFE_COMPLEX 1
+
+/* --- */
+/*TODO long double needed*/
+#ifdef SFFE_CMPLX_ASM
+typedef struct cmpx__ {
+ double r, i;
+} cmplx;
+#define sfNumber cmplx
+#elif SFFE_CMPLX_GSL
+#include <gsl/gsl_complex.h>
+typedef gsl_complex cmplx;
+#define sfNumber gsl_complex
+#endif
+
+/* basic sffe argument 'stack' */
+typedef struct sfargument__ {
+ struct sfargument__ *parg;
+ sfNumber *value;
+} sfarg;
+
+/* sffe function prototype, parameters order is right-to-left (cdecl) */
+typedef sfarg *(*sffptr) (sfarg * const a);
+
+/* constats eval functions */
+typedef void (*cfptr) (sfNumber * cnst);
+
+/* function type structure */
+typedef struct sffunction__ {
+ sffptr fptr;
+ unsigned char parcnt;
+ /*FIXME changed from char* to char[20] to get rid of warnings during compilation */
+ char name[20];
+} sffunction;
+
+/* basic sffe 'stack' operation ( function + result slot ) */
+typedef struct sfoperation__ {
+ sfarg *arg;
+ sffptr f;
+} sfopr;
+
+/* SFFE main structure */
+typedef struct sffe__ {
+/*public*/
+ char *expression; /* parsed expression (read-only) */
+ char *errormsg; /* parser errors (read-only) */
+ sfNumber *result; /* evaluation result (read-only) */
+/* protected/private */
+ unsigned int argCount; /* number of argument in use */
+ sfarg *args;
+ unsigned int oprCount; /* number of operations in use */
+ sfopr *oprs;
+ unsigned int varCount; /* number of used variables */
+ char *varChars;
+ sfNumber **varPtrs;
+ unsigned int userfCount; /* number of user functions */
+ sffunction *userf;
+/* not used
+ unsigned int stCount;
+ sfNumber* statics;
+*/
+} sffe;
+
+#define SFFE sffe
+#define sffeparser sffe
+#define sfparser sffe
+#define SFFEPARSER sffe
+
+/* 'stack' slot value */
+#define sfvalue(p) (*((p)->value))
+
+/* function parameters */
+#define sfaram1(p) ((p)->parg)
+#define sfaram2(p) ((p)->parg->parg)
+#define sfaram3(p) ((p)->parg->parg->parg)
+#define sfaram4(p) ((p)->parg->parg->parg->parg)
+#define sfaram5(p) ((p)->parg->parg->parg->parg->parg)
+/* and so on */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* create formula evaluator structure */
+ sffe *sffe_alloc(void);
+/* free fe structure */
+ void sffe_free(sffe ** parser);
+/* parse expression 'expression' and strore result in 'parser' struct, error (if any) returned */
+ int sffe_parse(sffe ** parser, char *expression);
+/* evaulate function and return evaluation result */
+ sfNumber sffe_eval(sffe * const parser);
+/* evaluate without returnig result */
+//void sffe_eval2(sffe *const parser);
+/* register user function with name 'vname', with 'parcnt' parameters and defined with function pointed by 'funptr'*/
+ void *sffe_regfunc(sffe ** parser, char *vname, unsigned int parcnt,
+ sffptr funptr);
+/* register single variable 'vptrs' identified by name 'vchars' */
+ void *sffe_regvar(sffe ** parser, sfNumber * vptrs, char vchars);
+/* register multiple variables */
+ void *sffe_regvars(sffe ** parser, unsigned int cN, sfNumber ** vptrs,
+ char *vchars);
+/* get variable 'vchar' pointer */
+ sfNumber *sffe_varptr(sffe * const parser, char vchar);
+/* set 'vptrs' as 'vchars' variable */
+ sfNumber *sffe_setvar(sffe ** parser, sfNumber * vptrs, char vchars);
+
+#ifdef __cplusplus
+}
+#endif
+#ifdef SFFE_CMPLX_ASM
+#include "sffe_cmplx_asm.h"
+#elif SFFE_CMPLX_GSL
+#include "sffe_cmplx_gsl.h"
+#endif
+#endif